到“浏览”网页,并在Java中提交表单最简单的方法(Easiest way to “browse”

2019-08-16 19:50发布

我需要做的是浏览网页,登录,然后浏览到该网站上,需要你先登录另一个网页,所以它需要保存的cookies。 在那之后,我需要点击该页面,在其中我会填写表单并获取该网页返回给我的消息上的元素。 我需要实际去的网页,然后点击按钮,假设只是直接导航到该链接的原因是因为你每次登录并点击链接时分配会话ID,它总是不同的。 该按钮看起来是这样的,它不是一个正常的HREF链接:

<span id=":tv" idlink="" class="sA" tabindex="0" role="link">Next</span>

无论如何,这将是这样做的最简单的方法? 谢谢。

更新:尝试的HtmlUnit,和其他模拟浏览器库后,它似乎它的使用发生了什么“无头”。 我最近发现了这个页面的另一件事是,所有的HTML是在一些奇怪的格式......所有内部的脚本标记。 这里是一个样本。

"?ui\x3d2\x26view\x3dss\x26mset\x3dmain\x26ver\x3d-68igm85d1771\x26am\x3d!Zsl-0RZ-XLv0BO3aNKsL0sgMg3nH10t5WrPgJSU8CYS-KNWlyrLmiW3HvC5ykER_n_5dDw\x26fri"],"http://example.com/?ctx\x3d%67mail\x26hl\x3den",,0,"Gmail","Gmail",[["us","c130f0854ca2c2bb",[["n"],["m","New features!"],["u"],["k","0"],["p","1000:500000,10,200000,5,100000,3,75000,2,0,1"],["h","https://survey.googleratings.com/wix/p1679258.aspx?l\x3d1033"],["at","query,5,contacts,5,adv,5,cf,5,default,20"],["v","https://www.youtube.com/embed/Ra8HG6MkOXY?showinfo\x3d0"],

当我做检查的按钮元素,我上面贴按钮的HTML代码出现,但不这样做查看源文件时。 基本上,我将需要做的是使用某种GUI的,并让用户浏览到该链接,然后有计划填写信息。 有谁知道我能做到这一点? 谢谢。

Answer 1:

这应该是其他人所指出的硒是可行的。

我用硒登录,然后抓取网站,发现值中的每一permuation的网站(30+形式)的所有形式。 这些值以后用于填充与价值观的具体perumation提交表单。 这个网站是非常JS / jQuery的沉重,我用硒的内置支持JavaScript的执行者,CSS选择器和XPath做到这一点。

我实现的HtmlUnit和HttpUnit更快的替代方案,但发现他们不是一样可靠,硒给我爬行网站的JS语义。

很难给你如何完成它,因为你的硒实施将是相当页面特定的,我不能看着你的编码对弄清楚发生了什么事情与该按钮脚本的垃圾页面代码。 不过,我有包含一些可能相关的硒代码(Java)的片段:

Element element = driver.findElements(By.id(value)); //find element on page
List<Element> buttons = parent.findElements(By.xpath("./tr/td/button")); //find child element
button.click();
element.submit() //submit enclosing form
element.sendKeys(text); //enter text in an input
String elementText = (String) ((JavascriptExecutor) driver).executeScript("return arguments[0].innerText || arguments[0].textContent", element); //interact with a selenium element via JS

如果你是编码在不同的页面类似的功能,然后PageObjects后面的接口可以提供帮助。

游记发布的链接是一个很好的起点和良好的醇” StackOverflow上有答案几乎任何问题硒永远。



Answer 2:

看看在5分钟入门指南硒: http://code.google.com/p/selenium/wiki/GettingStarted



Answer 3:

在登录页面,查看窗体的HTML看到它发布到URL和URL参数。 然后,请用正确的信息填写在同参数的URL,请务必保存所有的cookie头发送到第二页。 然后使用一个HTML解析器来找到你的链接。 有sourceforge上提供了一些HTML解析器,你甚至可以尝试建立在XML解析器Java的,但如果网站有各个细小的HTML错误,他们将故障。

编辑没有注意到一个事实,即它不是一个正常的链接。 在这种情况下,你需要看看该网站的JavaScript来看看那里的链接指向。 如果链接需要Javascript运行时,它变得更复杂。 Java是不是能够执行浏览器的JavaScript,但我发现了一个名为DJ本地Swing库,其中包括网络浏览器类,您可以添加到jframes。 它采用原生浏览器中呈现,并运行JavaScript。



Answer 4:

而不是试图以编程方式四处浏览,请尝试执行登录请求,并保存Cookie,然后设置那些在下一请求表单提交。



Answer 5:

是的HtmlUnit在处理JavaScript的非常糟糕,犀牛JS库往往产生错误(其实没有错误是非常例外)。 我会建议使用硒 ,它基本上是控制无头的浏览器(Chrome浏览器,firefox基于)的框架。

对于你的问题,下面的代码将做的工作

selenium.open(myurl);
selenium.click("id=:tv");

然后,您必须等待页面加载

selenium.waitForPageToLoad(someTime);


Answer 6:

我会建议任何的HtmlUnit一天。 这是一个伟大的图书馆。

首先,看看他们的网页( http://htmlunit.sourceforge.net/ )得到了的HtmlUnit和运行。 请确保您使用最新的快照(2.12写这个的时候)

试试这些设置忽略几乎任何障碍:

WebClient webClient = new WebClient(BrowserVersion.FIREFOX_17);
webClient.getOptions().setRedirectEnabled(true);
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
webClient.getOptions().setUseInsecureSSL(true);
webClient.getOptions().setJavaScriptEnabled(true);
webClient.getCookieManager().setCookiesEnabled(true);

然后撷取你的页面时,请确保你做什么用的页面,例如张贴登录表单之前等待背景的Javascript:

//Get Page
HtmlPage page1 = webClient.getPage("https://login-url/");

//Wait for background Javascript
webClient.waitForBackgroundJavaScript(10000);

//Get first form on page
HtmlForm form = page1.getForms().get(0);

//Get login input fields using input field name
HtmlTextInput userName = form.getInputByName("UserName");
HtmlPasswordInput password = form.getInputByName("Password");

//Set input values
userName.setValueAttribute("MyUserName"); 
password.setValueAttribute("MyPassword"); 

//Find the first button in form using name, id or xpath
HtmlElement button = (HtmlElement) form.getFirstByXPath("//button");

//Post by clicking the button and cast the result, login arrival url, to a new page and repeat what you did with page1 or something else :) 
HtmlPage page2 = (HtmlPage) button.click(); 

//Profit
System.out.println(page2.asXml());    

我希望这个简单的例子可以帮助你!



文章来源: Easiest way to “browse” to a page and submit form in Java