2015-10-20 80 views
1

如果我的问题听起来很主要,我很抱歉,我在QA和Selenium方面很新。等待网页元素的好方法

我使用Java和硒编写测试,有时我需要等待网络元素是可访问的,下面是我的代码片段,我曾经使用:

 int counter = 0; 
     while (true) { 
      counter++; 
      boolean breakIt = false; 
      try { 
       WebElement element= driverChrome.findElement(By.xpath("bla bla")); 
       element.click(); 
       breakIt = true; 
      } catch (Exception e) {    
       Thread.sleep(1000); 
      } 
      if (breakIt) { 
       break; 
      } 
      if (counter > 4) { 
       System.out.println("Failed"); 
       tearDown(); 
       System.exit(1); 
      } 
     } 

但现在某处我看到这一点:

WebDriverWait wait = new WebDriverWait(driverChrome, 10); 
wait.until(ExpectedConditions.elementToBeClickable(By.xpath("bla bla"))).click(); 

肯定的,第二个是要短得多,但我不知道这是否是好是坏,换句话说,它们有什么不同?如果是,如何?哪一个更适合哪种用途?

+0

使用WebDriverWait始终是睡眠语句的理想选择。一旦元素被加载,它就会立即变得难以处理,而不是等待一定的时间。特别是如果你有很多利用相同步骤的测试,从长远来看可以节省大量时间。 – AutomatedOrder

+0

@AutomatedOrder感谢您的回复,请将其作为回答发布?如果你知道,你能告诉我在哪里可以学到更多关于ExpectedConditions的知识。方法? – LoveLovelyJava

+0

可能重复的[Selenium等到元素存在](http://stackoverflow.com/questions/20903231/selenium-wait-until-element-is-present) – JeffC

回答

1

使用WebDriverWait始终是睡眠语句的理想选择。一旦元素被加载,它就会立即变得难以处理,而不是等待一定的时间。特别是如果你有很多利用相同步骤的测试,从长远来看可以节省大量时间。

至于ExpectedConditions,我会推荐this page,

+0

在哪里可以下载javadoc ** jar ** for org .openqa.selenium.support。我可以将它添加到我的项目中,当我将鼠标悬停在某个方法上时,它会显示一些有关它的信息? – LoveLovelyJava

+0

我在c#中使用硒,所以我不是100%正面的,但这个链接应该是你正在寻找的,你只需要得到你的版本:http://www.java2s.com/Code/Jar /s/selenium-support.htm – AutomatedOrder

5

答案you accepted不正确。

WebDriverWait做什么是粗略地讲同样的事情,你的代码片段做什么:它轮询DOM定期检查你想让它检查的条件是否为真。如果它不是真的,那么它使用Thread.sleep为你。 (你能确定我在说什么在这里通过读取implementation of FluentWait,这是其WebDriverWait是基于类和Sleeper因为FluentWait使用Sleeper.SYSTEM_SLEEPER去投票之间睡觉。)

相反到什么公认的答案断言(“一旦元素被加载,它就会立即变得棘手)”,当你等待的条件变为真时,WebDriverWait不会立即让你与元素交互。如果WebDriverWait实例在条件成立时正在休眠,则它将继续休眠,直到其休眠间隔结束(默认为0.5秒),然后它将再次检查条件并在条件为真时立即返回。否则,它会回到睡眠,除非你给它的超时已经过期。

您的自制等待外观与WebDriverWait之间的区别在于,WebDriverWait可重复使用,灵活且专为处理您的代码无法处理的一堆条件而设计。或者换句话说,它更强大。特别是,它会让例外,它不知道如何处理涓滴,而不是像你的代码一样隐藏它们。 我无法想象你的代码会更好。

+0

非常感谢您的帮助,我可以在哪里下载org.openqa.selenium.support.ui的javadoc jar,以便将它添加到我的项目中,并且当我将鼠标悬停在某个方法上时,它会显示一些内容有关它的信息? – LoveLovelyJava

+0

@LoveLovelyJava恐怕,我无法将javadoc链接到您的项目。我可以阅读Java,但是由于我不得不以任何实际的能力编写代码,这已经过去了十年。 – Louis