我想用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.
在我查看页面之后,我发现它的内容没有改变。
如何才能获得正确的网页结果?
感谢。
答案 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());
希望这有帮助。