需要Thread.sleep()的替代解决方案;

时间:2014-11-24 09:21:35

标签: java multithreading selenium selenium-webdriver

我正在使用Selenium Web驱动程序,我的体系结构是由Selenium IDE组件设计的,而其他事件则是核心java方法的实现。 我目前面临的主要问题是,我必须根据互联网的速度设计我的脚本,并且大部分时间脚本由于超时错误而崩溃。

为了克服这个问题,我正在实现" Thread.Sleep();" java方法。 但是使用这个解决方案,系统自动化变慢了,系统必须等到Thread完成定时器。

所以,我需要针对此问题的优化解决方案,例如A方法,该方法将保持进一步的操作,直到整个页面加载完毕。

3 个答案:

答案 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();

这意味着您的等待时间通常会更短,但如果特定的运行速度很慢,您仍然可以使用安全网。您可以平衡重试次数和休眠时间,以获得更精细的检查。