我正在使用Selenium Web驱动程序,我的体系结构是由Selenium IDE组件设计的,而其他事件则是核心java方法的实现。 我目前面临的主要问题是,我必须根据互联网的速度设计我的脚本,并且大部分时间脚本由于超时错误而崩溃。
为了克服这个问题,我正在实现" Thread.Sleep();" java方法。 但是使用这个解决方案,系统自动化变慢了,系统必须等到Thread完成定时器。
所以,我需要针对此问题的优化解决方案,例如A方法,该方法将保持进一步的操作,直到整个页面加载完毕。
答案 0 :(得分:3)
您还可以尝试使用此代码等待浏览器提供是否加载页面。
objExecutor = (JavascriptExecutor) objDriver;
if (!objExecutor.executeScript("return document.readyState").toString()
.equalsIgnoreCase("complete")){
Thread.sleep(100);
}
您可以简单地将其放在基页中,这样您就不需要在每个页面对象中将其写下来。我从来没有尝试过任何支持AJAX的网站,但这可能对你有所帮助,你的场景依赖也会消失。
我更喜欢使用Selenium的FluentWait API。通过使用它,您还可以设置最大等待时间(.withTimeout),也可以忽略某些异常。当您使用FluentWait搜索页面上的元素时,这一点尤为重要:
public void waitUntilDocumentIsReady() {
Wait<WebDriver> wait = new FluentWait<>(this.webDriver())
.withTimeout(25, TimeUnit.SECONDS)
.pollingEvery(1, TimeUnit.SECONDS)
.ignoring(UnhandledAlertException.class);
wait.until(new Function<WebDriver, Boolean>() {
@Override
public Boolean apply(WebDriver f) {
return ((JavascriptExecutor) f).executeScript("return document.readyState").equals("complete");
}
});
答案 1 :(得分:1)
从Selenium文档(selenium)中,您可以使用隐式等待:
WebDriver driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get("http://somedomain/url_that_delays_loading");
WebElement myDynamicElement = driver.findElement(By.id("myDynamicElement"));
这将告诉驱动程序在失败前最多等待10秒,但它会自动循环以查看结果是否准备就绪。如果准备就绪,则该方法继续而不等待10秒。请注意,不会为整个selenium脚本设置该值。
答案 2 :(得分:0)
而不是让一个大的Thread.Sleep并希望下一篇文章在你完成时准备就绪,你可以将其分解为多次重试。
所以(伪代码)代替:
doSomething();
Thread.sleep(5000);
doNextThing(); //Let's hope we're ready at this point...
你可以这样做:
doSomething();
for(int i=0; i < 5; i++)
{
if(isNextBitReady())
{
break; //Yay! Give up sleeping and carry on
}
else
{
Thread.sleep(1000); //Sleep a little bit and try again
}
}
doNextThing();
这意味着您的等待时间通常会更短,但如果特定的运行速度很慢,您仍然可以使用安全网。您可以平衡重试次数和休眠时间,以获得更精细的检查。