等待和WebElement一起出现很方便。WebDriverWait``ExpectedConditions
WebElement
WebDriverWait``ExpectedConditions
问题是, 如果 找到元素的唯一可能方法 是 什么WebElement.findElment,因为它没有id,没有名称,没有唯一的类?
WebElement.findElment
WebDriverWait的构造函数仅接受WebDriver作为参数,而不接受WebElement。
WebDriverWait
WebDriver
我已经设定了implicitlyWait时间,所以使用它似乎不是一个好主意try{} catch(NoSuchElementException e){},因为我不想为这个元素等待那么长时间。
implicitlyWait
try{} catch(NoSuchElementException e){}
这是场景:
有一个网页,其中包含许多input标签。每个input标签都有格式要求。
input
当不满足格式要求时,动态div标签将出现在该input标签之后。
div
由于input标签太多,因此我创建了一个通用方法,例如:
public WebElement txtBox(String name) { return driver.findElement(By.name(name)); }
而不是为每个input标签创建数据成员。
然后,我创建一种方法isValid来检查某些用户输入是否input有效。我要做的isValid就是检查div后面是否有标记inputboxToCheck,其代码如下:
isValid
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。
WebElementWait
上面提到的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; } }