了解Appium的iOS uiautomation选择器策略的基础知识

时间:2015-07-30 05:38:30

标签: ios iphone appium ios-ui-automation

我正在使用Appium为iOS本机应用程序编写UI自动化测试,并逐渐意识到大多数元素定位策略无法可靠地用于iOS。

除了随机运行的XPath之外,我还有其他选择:

  • 辅助功能ID(对我不起作用)
  • name(并非每个元素都具有'name'属性的值)
  • class(当你使用元素列表时有意义)
  • iOS UiAutomation谓词(初学者的陡峭学习曲线)

我一直在努力了解如何使用iOS UiAutomation定位器策略并找到使用它的元素,但它不适用于Appium Inspector。我已经提到了这些文档(Appium iOS Predicate referenceApple UIAutomation reference),但我觉得它们迎合了一些高级Appium用户,他们对iOS开发有一定的了解,而不是初学者。

目前我试图找到元素的元素层次结构是这样的:
Part 1 of element hierarchy Part 2 of element hierarchy


我目前的自动化设置是:

  • XCode 6.3.2
  • Appium 1.4.8
  • iOS 8.3
  • Appium Java Client 3.1.0



使用UiAutomation谓词策略,我可以使用什么定位器来定位突出显示的元素?我一直在Appium Inspector上尝试一些选项,如:

  • applications()[0].windows()[0].navigationBars()[0].textFields().withPredicate("value == 'Search eBay'")
  • .textFields().withPredicate("value == 'Search eBay'")

这些没用。我在这做错了什么?是否有其他文件可以从头开始清楚地解释iOS UiAutomation定位器?如果有人可以解释这些基础知识,那将会非常有用。

3 个答案:

答案 0 :(得分:0)

我以前从未使用过Appium,但我在javascript中使用过UIAutomation。

你可以使用:

找到元素
....textFields().firstWithName("Search eBay")

请注意,UIAuatomation使用UIAccessibility协议。 value的{​​{1}}是UITextField,其中一个将等于搜索到的文本,而不是占位符。在字段中输入内容后,您就可以使用accessibilityValue

当然,在您的情况下,抓取第一个文本字段也会起作用,因为导航栏中只有一个。

答案 1 :(得分:0)

只需使用此.navigationsBars()[" EBUH_whateverstring"]。textfields()["搜索eBay"]。textfields()["搜索eBay"]

更好的方法是,如果应用程序代码在Swift中,则在代码位于Obj-C或辅助功能标识符的情况下,请求dev添加辅助功能ID。否则,如果传递的元素值是动态的,则测试将在对此元素断言或执行操作时失败。

另一种故障保护方法是使用数组值。

.navigationsBars()[0] .textfields()[0] .textfields()[0] - >检查元素的数组值是[0]还是其他任何值。您可以使用此appium应用程序从显示元素的xpath值的位置获取数组值。或者你可以使用XCode Instruments,如果你有权访问代码来找到UIAutomation解释它的确切值。

答案 2 :(得分:-1)

如果您要在Appium中查找元素,则必须编写代码才能执行此操作。假设您正在使用Java,这是我用于代码的方式,您找到这些元素的方式是通过驱动程序,表和行。

这是什么意思?每个元素都有一个与之关联的XPath,因此这样做的一种方法是

driver.findElementByXPath("xpath_string_here");

例如,在尝试运行断言时,这非常有用。使用上面的代码,让我们说我们想断言它的名称是有效的。我们可以说:

AssertEquals(driver.findElementByXPath("xpath_string_here").getAttribute("name"), 'Practice Example");

当我提到表格和行时,我的意思是做这样的事情:

MobileElement table = (MobileElement) driver.findElementByXPath("string here");
List<WebElement> rows = driver.findElementByClassName("Class name here");

这段代码有什么作用?它创建一个MobileElement类型的变量,它将遍历您想要的xPath,然后rows值将在该表视图中找到该类名称的元素。所以在上面的图像中,我会停在UIAWindow的XPath,然后告诉我的行使用类名“UIAButton”来查找元素。

此时,如果你想对它们运行某些操作,例如.click();这是一个简单的循环问题。使用.get(int i)方法使用它们的索引。例如:rows.get(i).click();

这对您的问题有帮助吗?