一尘不染

Selenium WebDriver:使用WebDriver.findElement定位时,等待元素出现

selenium

等待和WebElement一起出现很方便。WebDriverWait``ExpectedConditions

问题是, 如果 找到元素的唯一可能方法
什么WebElement.findElment,因为它没有id,没有名称,没有唯一的类?

WebDriverWait的构造函数仅接受WebDriver作为参数,而不接受WebElement

我已经设定了implicitlyWait时间,所以使用它似乎不是一个好主意try{} catch(NoSuchElementException e){},因为我不想为这个元素等待那么长时间。

这是场景:

有一个网页,其中包含许多input标签。每个input标签都有格式要求。

当不满足格式要求时,动态div标签将出现在该input标签之后。

由于input标签太多,因此我创建了一个通用方法,例如:

public WebElement txtBox(String name) {
    return driver.findElement(By.name(name));
}

而不是为每个input标签创建数据成员。

然后,我创建一种方法isValid来检查某些用户输入是否input有效。我要做的isValid就是检查div后面是否有标记inputboxToCheck,其代码如下:

public boolean isValid(WebElement inputboxToCheck) {
    WebElementWait wait = new WebElementWait(inputboxToCheck, 1);
    try {
        wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("./following-sibling::div")));
        return false;
    } catch (TimeOutException e) {
        return true;
    }    
}

WebElementWait是一个虚构(不存在)的类,其工作方式与相同WebDriverWait


阅读 619

收藏
2020-06-26

共1个答案

一尘不染

上面提到的WebElementWait类:

package org.openqa.selenium.support.ui;

import java.util.concurrent.TimeUnit;

import org.openqa.selenium.NotFoundException;
import org.openqa.selenium.WebElement;

public class WebElementWait  extends FluentWait<WebElement>  {
    public final static long DEFAULT_SLEEP_TIMEOUT = 500;

      public WebElementWait(WebElement element, long timeOutInSeconds) {
            this(element, new SystemClock(), Sleeper.SYSTEM_SLEEPER, timeOutInSeconds, DEFAULT_SLEEP_TIMEOUT);
      }

      public WebElementWait(WebElement element, long timeOutInSeconds, long sleepInMillis) {
            this(element, new SystemClock(), Sleeper.SYSTEM_SLEEPER, timeOutInSeconds, sleepInMillis);
      }

      protected WebElementWait(WebElement element, Clock clock, Sleeper sleeper, long timeOutInSeconds,
              long sleepTimeOut) {
            super(element, clock, sleeper);
            withTimeout(timeOutInSeconds, TimeUnit.SECONDS);
            pollingEvery(sleepTimeOut, TimeUnit.MILLISECONDS);
            ignoring(NotFoundException.class);
      }

}

它与WebDriverWait相同,只不过WebDriver参数被替换为WebElement

然后,isValid方法:

//import com.google.common.base.Function;
    //import org.openqa.selenium.TimeoutException;

public boolean isValid(WebElement e) {
    try {
        WebElementWait wait = new WebElementWait(e, 1);
        //@SuppressWarnings("unused")
        //WebElement icon = 
        wait.until(new Function<WebElement, WebElement>() {
                    public WebElement apply(WebElement d) {
                        return d.findElement(By
                                .xpath("./following-sibling::div[class='invalid-icon']"));
                    }
                });
        return false;
    } catch (TimeoutException exception) {
        return true;
    }
}
2020-06-26