HtmlUnit点击后无法获取内容

时间:2016-11-17 09:06:28

标签: java click htmlunit

我想用html单元解析一个网站。这个过程基本上;

WebClient client = new WebClient(BrowserVersion.CHROME);
client.waitForBackgroundJavaScript(5 * 1000);
HtmlPage page = client.getPage("http://www.exapmle.com"); //here it waits to run js code.

HtmlUnorderedList ul = (HtmlUnorderedList) page.getByXPath("//ul[contains(@class, 'class-name')]").get(0);
HtmlListItem li = (HtmlListItem) ul.getChildNodes().get(1); // I want to click li and get result page. But it takes a little time to execute.

li.click();

client.waitForBackgroundJavaScript(5 * 1000); //At here it does not do what I want.

在我查看页面之后,我发现它的内容没有改变。

如何才能获得正确的网页结果?

感谢。

3 个答案:

答案 0 :(得分:0)

您可以尝试轮询javascript条件为真

int attempts = 20;
int pollMillis = 500;
boolean success = false;
for (int i = 0; i < attempts && !success; i++) {
    TimeUnit.MILLISECONDS.sleep(pollMillis);
    if (someJavascriptCondition == true) {
        success = true;
    }
}
if (!success) throw new RuntimeException(String.format("Condition not met after %s millis", attempts * pollMillis);

类似的技术讨论了here

答案 1 :(得分:0)

private void button1_Click(object sender, EventArgs e)
{
    if(Double.TryParse (txtVisina.Text, out v) &&
         Double.TryParse (txtTezina.Text, out t)) {
        r = t / (v * v);
        txtBmiRez.Text = String.Format("{0:f}", r);
    } else {
        // Handle failure to parse
        MessageBox.Show("Failed to parse text to number.");
    }
}
  

使用Thread.sleep()而不是waitForBackgroundJavaScript   适合我!

答案 2 :(得分:0)

您可以使用JavaScriptJobManager检查尚未完成的JavaScript作业的数量。致电click()后,请尝试以下代码。

JavaScriptJobManager manager = page.getEnclosingWindow().getJobManager();
while (manager.getJobCount() > 0) {
    System.out.printlin("Jobs remaining: " + manager.getJobCount());
    Thread.sleep(1000);
}

如果JavaScript作业永远不会完成,您可能希望添加另一种方法来结束while循环。就个人而言,我开始手动终止作业:

JavaScriptJob job = manager.getEarliestJob();
System.out.println("Stopping job: " + job.getId());
manager.stopJob(job.getId());

希望这有帮助。