我们正在使用Appium和iOS模拟器以及用Java编写的测试函数。
我们有一个iOS应用程序,屏幕1包含一个UICollection视图,并告诉Appium点击其中一个元素。
这将打开屏幕2(并且滚动动画大约需要500毫秒),它还包含一个UICollection视图。我想用Appium找出第二个屏幕的UICollection视图的大小。
问题是Appium太快并且在点击后直接执行findElements()方法,这导致它找到第一个屏幕的UICollection视图。
clickOnElementOnFirstScreen();
webDriver.findElements( By.className( "UIACollectionCell" ) ).size();
// is supposed to find the UICollection view on the second screen,
// but actually finds the UICollection view on the first screen
Appium提供了几种等待功能。但是据我所知,所有这些都是以这种方式使用的: "等到位置X /名称X的元素变为可见"
如果我尝试使用这些等待功能,他们根本不会等待,因为他们会立即找到第一个屏幕的UICollection视图,该视图的位置和名称与第二个屏幕上的相同。
我找到的唯一解决方案是使用Thread.sleep:
Thread.sleep(1000);
webDriver.findElements( By.className( "UIACollectionCell" ) ).size();
但是我们不想在代码中使用Thread.sleep,这些代码将在数百次测试中运行在客户端的服务器上。
我们可以修改应用程序并在视图中输入元数据,以便Appium能够区分它们,但是这种情况发生在几个地方并且应用程序正由客户端编程,所以我们也想避免这种情况
在不修改iOS应用程序代码的情况下,等待新屏幕出现的简单而安全的方法是什么?
答案 0 :(得分:0)
我发现此问题只有肮脏的解决方法。
static waitFor(Duration duration) {
try {
def WebDriverWait wait = new WebDriverWait(mobileDriver, duration.standardSeconds)
wait.until(visibilityOfElementLocated(By.xpath("//Fail")))
//Wait until false case is visible to ensure proper timeout
} catch (Exception e) {
}
}
答案 1 :(得分:0)
Appium论坛上发布的另一个解决方法/解决方案是:
首先搜索区分2.屏幕和1.屏幕的其他元素;一旦可见,搜索最初所需的元素是安全的。