我想等待MobilElement,不知道什么是正确的方法。
使用 Appium、Selenium 和 Java 创建一些自动化测试,但使用模拟器运行所有测试,有时我需要等待一些元素,我想使用我在 webElement 中使用的东西。我使用按类查找的原因是应用程序中没有 id,我无法更改它。
public static MobileElement myButton(AndroidDriver driver, int index) {
List<MobileElement> button = driver.findElements(By.className("android.widget.Button"));
return button.get(index);
}
模拟器对我来说很慢,所以我想使用 waitForElement 方法之类的东西
您可以实现隐式等待。这基本上是在抛出无法在页面上找到元素的异常之前等待一定的时间。
WebDriver driver => new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get("http://url_that_delays_loading");
WebElement myDynamicElement = driver.findElement(By.id("myDynamicElement"));
另一种方法是使用 Expected Conditions wait 来评估某些内容既不是 null 也不是 false。
WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id(>someid>)));
等待页面加载,设置在抛出错误之前等待页面加载完成的时间。如果超时为负数,页面加载可能会无限期。
driver.manage().timeouts().pageLoadTimeout(100, SECONDS);
也可以使用 Thread.Sleep,但它不是理想的等待声明。
thread.sleep(1000);
更新
尝试使用
visibilityOf
,如下所示:
public static MobileElement myButton(AndroidDriver driver, int index) {
List<MobileElement> button = driver.findElements(By.className("android.widget.Button"));
//update here
new WebDriverWait(driver, 30).until(ExpectedConditions.visibilityOf(button.get(index)));
return button.get(index);
}
30
第二个。
当然可以,只需更改这一行:
List<MobileElement> button = driver.findElements(By.className("android.widget.Button"));
假设 WebDriverWait 类用于 Explicit Wait 实现:
List<MobileElement> button = new WebDriverWait(driver, 10)
.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.className("android.widget.Button")))
.stream()
.map(element -> (MobileElement) element)
.collect(Collectors.toList());
展望未来,您可以考虑实现页面对象模型设计模式并使用@AndroidFindBy注释,请查看https://github.com/appium/java-client/blob/master/docs/Page-objects.md 例如代码。
你为什么将 Android 驱动程序作为参数传递给 WebDriverWait 构造函数,它会导致编译时错误