【问题标题】:Robust React Native element finding using Appium使用 Appium 进行强大的 React Native 元素查找
【发布时间】:2016-11-26 13:06:53
【问题描述】:

我正在使用 React Native 开发一个需要端到端测试的应用。

来自 Selenium WebDriver 背景,在我看来,与 WebDriver 相比,在 Appium 中查找元素可能非常尴尬,因为原生组件只有 ID 和一个非用户定义的类。

  1. 有没有一种方法可以向元素添加某种元数据以方便查找?

假设我有一个单元格内包含复杂元素的表格,我需要先找到正确的行,然后是单元格,然后在单元格内找到要操作的正确组件。

理想情况下,我希望能够通过搜索“myTargetRows”之类的内容来枚举行。这会给我一个行列表。

  1. 如果我理解正确的话,在原生应用程序中没有两个组件可以具有相同的 ID,所以我不能就这样使用 ID,对吧? (即,对多个行组件使用相同的 ID“myTargetRows”)。
  2. 如果不是,我是否应该使用“myTargetRow0”、“myTargetRow1”等编号的 ID,然后使用 XPath 部分匹配 ID?
  3. 难道没有更好的办法吗?
  4. 如果我能做这样的事情,我可以链接那些findElement 调用来找到我想要的正确嵌套元素吗?

P.s.:我不想在我的定位器中硬编码确切的组件层次结构以避免在我在视图中移动任何东西时使它们失效,所以这些点击式解决方案无济于事。

附: 2:解决方案必须同时适用于 Android 和 iOS,即使我需要自己实现某种抽象。

【问题讨论】:

  • stackoverflow.com/a/37295343/1746118 检查这是否对您有所帮助
  • '没有两个组件可以有相同的 ID' 不是一个好的假设。不过,这是一个很好的长期实践。您也可以在 appium 中查找如何使用List<WebElement> 进行枚举,应该可以解决您的 2~5 个问题
  • 你好,我有一个与此无关的问题,我正在 appium 工具中获取当前屏幕中的前一个屏幕元素以任何方式解决此问题

标签: android ios react-native appium


【解决方案1】:

由于 appium 支持不同的搜索策略,每个平台也略有不同,因此我在我的一个项目中使用以下方法:

我有一个助手,可以轻松导入到每个返回跨平台(iOS 和 Android)测试 ID 道具的类中

export function getTestIdProps (id) {
    return { accessible: true, accessibilityLabel: id, testID: id }
}

在开发过程中,我们确保每个要测试的组件都接收到与此类似的测试 ID:

return (
    <ComponentToBeTested>
       <View {...getTestIdProps('unique-test-id-goes-here')} moreProps>
       </View>
    </ComponentToBeTested>
)

小心请务必检查 react native 文档以查看哪些基本元素支持这些道具。并非所有 react 原生元素都支持 testIDaccessibilityLabel。如果他们不这样做,这些道具将被忽略。

最后,在您的 Appium 测试(Java 中的示例)中,您可以通过其可访问性 ID 轻松识别元素,类似于:

public static By byAccessibilityId(final String id) {
    return MobileBy.AccessibilityId(id);
}

更多阅读请参见http://appium.io/docs/en/commands/element/find-elements/

【讨论】:

【解决方案2】:

您应该使用 View 的 accessibilityLabel 道具。

accessibilityLabelPropTypes.node

覆盖屏幕阅读器在用户使用时读取的文本 与元素交互。默认情况下,标签由 遍历所有子节点并累积所有文本节点 用空格隔开。

更多信息可以找到here

对于唯一 ID,假设您有一个列表视图和 100 行。您可以为accessibilityLabel 组合rowId 和静态文本。

例如:0_MyCustomRow、1_MyCustomRow

【讨论】:

【解决方案3】:

看看 Sauce Labs 博客中的 article,这是处理 RN 应用程序的一个很好的例子。

【讨论】:

    猜你喜欢
    • 2019-12-18
    • 2017-05-19
    • 2020-01-08
    • 2020-04-25
    • 2021-10-26
    • 1970-01-01
    • 2021-02-18
    • 1970-01-01
    • 2017-09-14
    相关资源
    最近更新 更多