- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试让机器人使用 HTMLUnit 随机填写表单。到目前为止我所得到的:
WebClient client = new WebClient(BrowserVersion.CHROME);
client.getOptions().setTimeout(60000);
client.getOptions().setRedirectEnabled(true);
client.getOptions().setJavaScriptEnabled(true);
client.getOptions().setThrowExceptionOnFailingStatusCode(false);
client.getOptions().setThrowExceptionOnScriptError(false);
client.getOptions().setCssEnabled(false);
client.getOptions().setUseInsecureSSL(true);
client.setAjaxController(new NicelyResynchronizingAjaxController());
最后一行应该让 AJAX 在后台工作,剩下的就是简单的浏览器配置。
我编写了一种方法来正确执行对 DOMElement 的单击,并在后台进行日志记录和正确等待执行:
public static HtmlPage clickCorrectly(DomElement e, WebClient client) throws IOException {
Main_Win.log("-------------------------------------");
Main_Win.log("Clicking correctly: " + e);
Main_Win.log("Background JS: " + client.waitForBackgroundJavaScript(30000));
Main_Win.log("Click return: " + e.click());
Main_Win.log("Background JS: " + client.waitForBackgroundJavaScript(30000));
WebWindow tmpWebWindow = client.getCurrentWindow();
Main_Win.log("Current Window: " + tmpWebWindow);
Main_Win.log("Returning Enclosed Page: " + tmpWebWindow.getEnclosedPage());
Main_Win.log("Parent Page: " + tmpWebWindow.getParentWindow());
Main_Win.log("Top level Page: " + tmpWebWindow.getTopWindow());
Main_Win.log("-------------------------------------");
return (HtmlPage) tmpWebWindow.getEnclosedPage();
}
这对于我的登录过程非常有用。我单击登录按钮,输入我的凭据,然后提交。页面保持不变。因此单击不会更改 page
后面的对象多变的。稍后我尝试单击一个实际上是 anchor 标记的按钮:
<a class="btn btn-primary participate-link" data-id="116582" href="javascript:;" onclick="participateSurvey(116582, 'https://www.soscisurvey.de/SprachassistentenG3B/', '')">Jetzt teilnehmen</a>
我通过 XPath 获取 anchor 元素:
page.getByXPath("//a[@class='btn btn-primary participate-link']")
然后我将其转换为正确的元素:
HtmlAnchor a = (HtmlAnchor) o;
后来我像这样调用点击:
clickCorrectly(a, client)
这工作得很好。当我在 Firefox 中手动执行此操作时,我正在接收在浏览器中加载的页面。
现在来解决我的问题:
List<DomNode> elements = new ArrayList<DomNode>();
elements.addAll(page.getElementsByTagName("input"));
elements.addAll(page.getElementsByTagName("button"));
这些为我提供了我想要处理的所有元素。我正在检查 3 个案例:
DomNode
是 <input>
类型为属性 "submit"
DomNode
是 <input>
类型为属性 "button"
DomNode
是 <button>
if(i.getTypeAttribute().equalsIgnoreCase("submit")) {
if(i.toString().contains("weiter") || i.toString().contains("Weiter")){
Main_Win.log("LOGGING BUTTON RETURN PAGE--------");
Main_Win.log("Page before click: " + page);
page = Main.clickCorrectly(i, client);
Main_Win.log("Page after click: " + page);
Main_Win.log("END LOGGING BUTTON RETURN PAGE--------");
return true;
}
}
“Weiter”是德语,意思是“继续”。我正在对所有 3 个案例进行这样的检查。当您查看日志时,现在发生的情况会更清楚:
正如您所看到的,前后页面是不同的。理论上,浏览器现在应该处理不同的页面,因为我将页面变量设置为单击的返回值。在我的循环的下一次迭代中,前一个 URL 被处理,而不是我通过单击实现的 URL,尽管我将页面设置为它,并且循环每次循环时都会重新获取所有页面内容。我不明白为什么会发生这种情况。为了更好地理解,以下是整个类(class):
最终目标是获得调查的最后一页,其中没有继续按钮。对这么长的帖子感到抱歉,感谢您的宝贵时间!
最佳答案
所以实际上引用的重点就是问题所在。无论出于何种原因,HtmlPage 对象都没有通过引用传递......我不知道为什么,但这确实花费了我一生的时间。我会将这个问题留给其他有同样问题的人。
我通过将其传递给全局静态变量来解决它:
public static HtmlPage page = null;
并且只需在开始时复制一次:
AutoAnswer.page = pageCPY;
希望这会为某人节省很多时间:D感谢您的阅读!
关于java - HTMLUnit input.click() 未返回单击应加载的站点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59344723/
htmlunit 报告从 css 到页面上解析错误的所有内容。 这个怎么静音?? 最佳答案 把这些放在声明 webClient 之后 webClient.setCssError
可能显示 Javascript 测试支持 package htmlunitpoc; import com.gargoylesoftware.htmlunit.WebClient; import co
我正在尝试使用 HtmlUnit 登录到我的本地 wordpress 网站,但它似乎存在 cookie 问题。 那是代码的开头: WebClient webClient = new WebClient
有什么办法可以在 HtmlUnit 中使用 session 更改 url? 我的情况如下所示, 登录 http://test.raja.com与凭据。 获取页面http://home.raja.com
我有以下代码: WebClient webClient = new WebClient(); HtmlPage page = webClient.getPage("http://www.myland.
我研究过htmlunit、httpunit、jwebunit、selenium等ui测试工具。 我对测试工具不是很熟悉。 Htmlunit 在 javascript 支持方面听起来是个不错的选择。然后
我拥有的页面对象是 click() 长链的结果调用(以防万一您想知道如何在不知道用于获取它的 URL 的情况下拥有一个页面对象)。 方法HtmlPage.getDocumentURI未实现。 Html
这是我要抓取的页面:https://www.tokopedia.com/berkahcell2/promo-termurah-vr-virtual-reality-box-v-2-0-remote-b
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 10 年前。 Improve thi
我的站点结构看起来像这样: Item 1 Desc 1
我的代码是这样的: WebClient webClient = new WebClient(BrowserVersion.CHROME); webClient.setAjaxController(ne
我只希望页面的文本内容,并且希望抓取尽可能轻巧。我可以关闭HTMLUnit开箱即用的所有JavaScript和CSS以及其他外部内容的解析和其他加载功能吗? 最佳答案 我认为与您正在寻找的最接近的东西
我有一个提交按钮,但无法点击.. Send SMS 我已经尝试过这个: page = (HtmlPage) form.getInputByValue("Send SMS").click()
我使用 HtmlUnit 对我的网站进行自动化测试。我的网站使用 gmaps api - 发送外部网站请求需要花费大量时间(我有数百次测试和数千次页面加载)。 我需要一些方法来告诉 HtmlUnit
我使用 HtmlUnit 对我的网站进行自动化测试。我的网站使用 gmaps api - 发送外部网站请求需要花费大量时间(我有数百次测试和数千次页面加载)。 我需要一些方法来告诉 HtmlUnit
我正在使用 HtmlUnit 加载一个充满 JavaScript 的网页。 WebClient 可以很好地执行 JavaScript。 但是,当我单击调用 Ajax 调用的特定表单上的按钮时,即使调用
我正在尝试使用 HtmlUnit 登录 Facebook 页面并查看其 HTML 内容。我正在尝试通过 HtmlUnit 填写登录凭据,但在单击提交按钮时我没有看到正在执行的 session 。 在
Hy...我想使用 HtmlUnit 登录到一些 3rd 方网站。但是 HtmlUnit 应该能够告诉我对输入站点的登录尝试是否成功。有什么办法可以使用 HtmlUnit 执行此任务。请帮忙 ..!!
我正在从 selenium-1 升级到 selenium-2 并尝试新的 HtmlUnit 驱动程序。我已经尝试了一些基本的测试(打开一个页面,get_text,..),它似乎 极慢(我认为 chro
我正在使用 HTMLUnit。我正在访问页面,但是特殊(马耳他)字符显示错误。例如,ġuvni 显示为 ?uvni HtmlPage page = submit_button.click(); Sys
我是一名优秀的程序员,十分优秀!