【问题标题】:Understanding basics of iOS uiautomation selector strategy for Appium了解 Appium 的 iOS uiautomation 选择器策略的基础知识
【发布时间】:2015-10-21 08:16:21
【问题描述】:

我正在使用 Appium 为 iOS 原生应用程序编写 UI 自动化测试,并逐渐意识到大多数元素定位策略在 iOS 上并不可靠。

除了随机工作的 XPath,我还有其他选择:

  • 辅助功能 ID(不适用于我)
  • name(不是每个元素都有'name'属性的值)
  • 类(在处理元素列表时才有意义)
  • iOS UiAutomation 谓词(初学者的陡峭学习曲线)

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

目前我试图在其中查找元素的元素层次结构是这样的:


我当前的自动化设置是:

  • XCode 6.3.2
  • Appium 1.4.8
  • iOS 8.3
  • Appium Java 客户端 3.1.0



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

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


这些都不起作用。我在这里做错了什么?是否有任何其他文档可以从头开始清楚地解释 iOS UiAutomation 定位器?如果有人能解释这些基础知识,那将非常有帮助。

【问题讨论】:

  • 你可以通过 driver.findElement(By.id("Search eBay")) 找到它
  • Xpath 总是对我有用,我从未尝试过使用可访问性标识符,但根据文档它应该可以工作

标签: ios iphone appium ios-ui-automation


【解决方案1】:

我以前从未使用过 Appium,但我使用过 JavaScript 中的 UIAutomation。

您可能可以使用以下方法找到该元素:

....textFields().firstWithName("Search eBay")

注意 UIAuatomation 使用UIAccessibility 协议。 valueUITextField 是它的accessibilityValue,它等于搜索的文本,而不是占位符。在字段中输入内容后,您将能够使用value

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

【讨论】:

  • 好的。但是你是从哪里知道这些规则的呢?我怎么知道有像 withName 这样的方法可以使用?
  • @AbhijeetVaikar 所有方法都记录在您在问题中引用的UIAutomation 文档中。 textFields 返回一个 UIAElementArray,它有一个方法 withName(返回另一个数组)或 firstWithName。另外,您需要一些经验才能知道namevalue 是什么。
【解决方案2】:

只需使用这个 .navigationsBars()["EBUH_whateverstring"].textfields()["Search eBay"].textfields()["Search eBay"]。

如果代码在 Obj-C 中,更好的方法是让开发人员添加可访问性 id,如果应用程序代码在 Swift 中,则要求添加可访问性标识符。否则,如果传递的元素值是动态的,则测试将无法断言或对该元素执行操作。

另一种故障安全方法是使用数组值。

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

【讨论】:

    【解决方案3】:

    如果您尝试在 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,然后行值将找到该表视图中存在的该类名称的元素。因此,在上图中,我将停在 UIAWindow 的 XPath 处,然后告诉我的行使用类名“UIAButton”来查找元素。

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

    这对您的问题有帮助吗?

    【讨论】:

    • 没有。抱歉,这根本没有帮助。我完全清楚需要编写哪些代码才能使用 appium 从本机应用程序中查找元素。问题不在于如何编写代码来查找元素,也不在于如何使用 XPath 作为定位器策略。它是关于了解如何使用 ios uiautomation 定位策略创建定位器。
    • 请正确回答我的问题:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-07
    • 2018-12-16
    • 2011-08-11
    • 2015-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多