HTMLUnit input.click()未返回该点击应加载的网站

问题描述 投票:0回答:1

我正在尝试使漫游器使用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变量后面的对象。稍后,我尝试单击实际上是锚标记的按钮:

<a class="btn btn-primary participate-link" data-id="116582" href="javascript:;" onclick="participateSurvey(116582, 'https://www.soscisurvey.de/SprachassistentenG3B/', '')">Jetzt teilnehmen</a>

我正在通过XPath获取锚元素:

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种情况:

  1. DomNode是类型为Atribute <input>的[C0
  2. "submit"是类型为Atribute DomNode的[C0
  3. <input>"button"

    DomNode

“ Weiter”的德语为“ continue”。我正在检查所有3种情况。当您查看日志时,现在发生的事情更加清楚:

<button>

如您所见,之前和之后的页面是不同的。从理论上讲,浏览器现在应该处理其他页面,因为我将page变量设置为click的返回值。在我的循环的下一次迭代中,虽然我将页面设置为URL,但上一个URL会被处理,而不是我通过点击获得的URL,但每次循环循环时,循环都会重新获取所有页面内容。我不知道为什么会这样。这是整个课堂,供您更好地理解:

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; } }

最终目标是获得调查的最后一页,其中没有继续按钮。抱歉,很长的帖子,感谢您的宝贵时间!

java html click htmlunit
1个回答
0
投票

因此,实际上参考文献的问题是问题。不管出于什么原因,HtmlPage OBJECT都没有通过引用传递……我不知道为什么,但这确实花费了我一生的时间。我将留给有相同问题的其他人。

我通过将其传递给全局静态变量来解决它:

enter image description here

并且仅在开始时复制一次:

https://pastebin.com/1wxdwUKS

希望这一次可以节省很多时间:D感谢您的阅读!

© www.soinside.com 2019 - 2024. All rights reserved.