SeleniumServer版本:2.5.0,Firefox版本:4.0.1
我遇到通过Ajax调用呈现“新问题”超链接的情况。页面加载完成后,我需要单击此超链接继续。我正在使用类似下面的东西等到链接出现然后点击它。
while (!(driver.findElement(By.xpath("//a[text()='New Question']")).isEnabled())) {
Thread.sleep(1000);
}
driver.findElement(By.xpath("//a[text()='New Question']")).click();
这就像IE中的魅力一样。但是在Firefox中,没有点击链接。
这告诉我的是,Firefox正在告诉Selenium,当页面未完全加载时,页面已加载,而IE正在做正确的事情。
要检查点击是否真的发生了,我会在超链接的onclick上输入一个javascript:alert("Hello From Chandra");
。弹出窗口出现在IE上,但不出现在Firefox上。
问题:我做错了什么/不合适吗?有解决方法吗?
感谢。 PS:如果您需要更多信息,请告诉我。
答案 0 :(得分:3)
您不需要while循环,可以在初始化驱动程序时使用implicitlyWait。这将使驱动程序在抛出元素未找到异常之前轮询元素的存在90秒。
driver.manage().timeouts().implicitlyWait(90, TimeUnit.SECONDS);
driver.findElement(By.xpath("//a[text()='New Question']")).click();
答案 1 :(得分:0)
感谢Nilesh和prestomanifesto,但是在放入while循环之前我曾尝试'WebDriverWait'和'implicitlyWait'(它不能正常工作)并且它不起作用。我做了一些挖掘,并“似乎”找到了如下解决方案。页面完成加载后,会有一个“搜索”文本字段获得焦点。我使用'activeElement'来检查焦点是否“真正”设置。
while (!driver.findElement(By.id("searchValue")).isEnabled()) {
WebElement currActiveElement = driver.switchTo().activeElement();
if (currActiveElement.getAttribute("id").equals("searchValue")) {
break;
}
Thread.sleep(1000);
}
答案 2 :(得分:0)
您仍然可以通过等待5-8秒的预期元素的存在(不等待可见性,isEnabled)然后发送window.stop()JS脚本(停止加载更多元素)而无需等待来加速脚本执行整个页面在5-8秒后加载或捕获页面加载的超时异常,然后调用window.stop()
因为如果页面没有采用延迟加载技术(仅加载可见元素并仅在滚动后加载元素的其余部分),它会在返回window.ready状态之前加载每个元素,因此如果任何元素需要更长的时间,它将会更慢渲染。