make wait函数如果失败则继续执行某些操作

时间:2015-12-12 17:42:24

标签: java selenium selenium-webdriver

我非常初学Selenium和Java来编写测试。 我知道我可以使用下面的代码尝试两次点击一个web元素(或者我想要的时间):

for(int i=0;i<2;i++){
    try{
             wait.until(wait.until(ExpectedConditions.visibilityOfElementLocated
                  (By.xpath("//button[text()='bla bla ..']"))).click();
              break;
       }catch(Exception e){ }
 }

但是我想知道是否有任何类似的东西,例如将一个可靠的函数传递给等待函数,以使其自行完成,例如:

wait.until(wait.until(ExpectedConditions.visibilityOfElementLocated
                      (By.xpath("//button[text()='bla bla ..']"),2)).click();

例如,在这里2可能意味着如果失败就尝试两次,我们有这样的事情吗?

2 个答案:

答案 0 :(得分:1)

看看FluentWait,我认为这将涵盖指定适当的超时和轮询间隔的用例。 https://selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/support/ui/FluentWait.html

答案 1 :(得分:0)

如果你无法在 ExpectedConditions 的集合中找到符合你想要的东西,你可以自己编写。

WebDriverWait.until 方法可以通过 com.google.common.base.Function com.google.common.base.Predicate <传递/ em>的。如果您创建自己的Function实现,那么请注意任何非null值都将结束等待条件。对于Predicate,apply方法只需要返回true。

有了这个,我相信你可以用这个API做很少的事情。您提出的功能可能不是现成的,但您可以完全创建它。

http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/base/Function.html

http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/base/Predicate.html

最好的运气。

未经测试的代码段

final By locator = By.xpath("");
      Predicate<WebDriver> loopTest = new Predicate<WebDriver>(){
        @Override
        public boolean apply(WebDriver t) {
            int tryCount = 0;
            WebElement element = null;
            while (tryCount < 2) {
                tryCount++;
                try {
                    element = ExpectedConditions.visibilityOfElementLocated(locator).apply(t);
                    //If we get this far then the element resolved.  Break loop.
                    break;
                } catch (org.openqa.selenium.TimeoutException timeout) {
                    //FIXME LOG IT
                }

            }
            return element != null;
        }
      };
      WebDriverWait wait;
      wait.until(loopTest);