2014-11-24 207 views
-1

我正在使用Selenium Web驱动程序,我认为该体系结构是由Selenium IDE组件设计的,而对于其他事件则实现了核心java方法。 我目前面临的主要问题是,我必须根据Internet的速度来设计我的脚本,并且大部分时间脚本因超时错误而崩溃。需要Thread.sleep()的替代解决方案;

为了解决这个问题,我实现了“Thread.Sleep();” java方法。 但是通过这个解决方案,系统自动化变得很慢,系统必须等到线程完成定时器。

所以,我需要一个优化的解决方案,像一个方法,它将持续进行下一步操作,直到整个页面加载完毕。

+0

Mohit,您可以在WebDriver中找到地狱的同步数量。你可以用implicitWait和WebDriverWait来谷歌它。这两个比Thread.Sleep更好。 – Uday 2014-11-24 13:12:22

+0

您好Uday,实际上我不想让脚本执行预定义的时间量。相反,我正在研究一个解决方案,它将为我提供如下功能: - 自动化脚本应该暂停,直到整个页面和所有事件在该页面被加载。如果可能,请提供解决此问题的方法。 – 2014-11-26 04:33:55

回答

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

这意味着你的等待时间有望是通常较短,但你仍然有一个安全网,如果特别运行缓慢。您可以平衡重试次数和睡眠时间,以获得更细粒度的检查。

+0

我想或多或少都是一样的,唯一的_issue_是否有某种'isNextBitReady'方法可用? – munyul 2014-11-24 09:39:45

3

你也可以试试这个代码,等待浏览器提供页面是否加载。

objExecutor = (JavascriptExecutor) objDriver; 
if (!objExecutor.executeScript("return document.readyState").toString() 
    .equalsIgnoreCase("complete")){ 
    Thread.sleep(100); 
} 

你可以简单地把它放在你的基本页面,所以你不需要把它写在每个pageobjects中。我从未尝试过任何支持AJAX的网站,但这可能会帮助您和您的场景依赖关系也会消失。

我更喜欢使用Selenium的FluentWait API。通过使用它,您可以另外设置最大等待时间(.withTimeout),也可以忽略某些异常。

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"); 
     } 
    }); 
+0

@Stefan似乎更好的执行......感谢编辑... – 2014-11-24 14:42:04

1

硒文档(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")); 

这会告诉司机等着,当你使用FluentWait搜索网页上的元素,这一点尤其重要在失败前最多10秒钟,但它会自动循环查看结果是否准备就绪。如果准备就绪,则该方法继续而不等待10秒。请不要指出整个硒脚本的值。