对于基于多个Webview的移动应用程序(使用Cordova,PhoneGap,XCode构建的iOS应用程序),我创建了以下方法来检查元素是否存在。请建议下面的代码段是否有意义?因为基于传统显式等待的传统包装函数不能可靠地工作。
public boolean waitForElemToBeAvailable(final By by, final int timeout, int retries) {
WebDriverWait wait = new WebDriverWait(appiumDriver, timeout);
boolean success = false;
final long waitSlice = timeout/retries;
if(retries>0){
List<WebElement> elements = appiumDriver.findElements(by);
if(elements.size()>0){
success = true;
return success;
}else {
appiumDriver.manage().timeouts().implicitlyWait(waitSlice, TimeUnit.SECONDS);
retries--;
}
}
return success;
}
由于
答案 0 :(得分:1)
根据您共享的代码块,我没有看到任何附加值来检查 if元素是否存在到implicitlyWait
。该实现看起来像纯粹的开销。相反,如果您从 org.openqa.selenium.support.ui 包中查看ExpectedCondition接口的 Java Docs ,该包模拟可能需要的条件评估为非null或false的内容还包含可由ExpectedConditions类在循环中调用的WebDriverWait类,方法提供更细粒度的方法来确认是否一个特定的条件已经实现或没有。这使我们在选择 WebElement 的所需行为时具有更大的灵活性。一些广泛使用的方法是:
元素的存在:
presenceOfElementLocated(By locator)
元素的可见性:
visibilityOfElementLocated(By locator)
元素的可互动性:
elementToBeClickable(By locator)
注意:根据documentation不要混合隐式和显式等待。这样做会导致不可预测的等待时间。