使用Appium进行强大的React Native元素查找

时间:2016-07-22 15:00:04

标签: android ios react-native appium

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

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

  1. 有没有办法可以为元素添加某种元数据以便于查找?
  2. 如果我在一个单元格中有一个包含复杂元素的表,我需要首先找到正确的行,然后是单元格,然后找到正确的组件来操作单元格。

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

    1. 如果我理解正确,在本机应用程序中没有两个组件可以拥有相同的ID,所以我不能像这样使用ID,对吗? (即,使用相同的ID," myTargetRows",用于多行组件)。
    2. 如果没有,我应该使用编号ID,例如" myTargetRow0"," myTargetRow1"等,然后使用XPath部分匹配ID?
    3. 还有更好的方法吗?
    4. 如果我可以做类似的事情,那么我可以将这些findElement调用链接起来找到我想要的正确嵌套元素吗?
    5. Ps:我不想在我的定位器中对确切的组件层次结构进行硬编码,以避免在我的视图中移动任何内容时使其无效,因此这些点击式解决方案无法提供帮助。 / p>

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

3 个答案:

答案 0 :(得分:0)

您应该使用View的accessibilityLabel道具。

  

accessibilityLabel PropTypes.node

     

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

可以找到更多信息here

对于唯一ID,我们假设您有一个listview和100行。您可以将accessibilityLabel的rowId和静态文本组合在一起。

例如:0_MyCustomRow,1_MyCustomRow

答案 1 :(得分:0)

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

答案 2 :(得分:0)

由于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本机文档以查看哪个基本元素支持这些道具。并非所有反应本机元素都支持testIDaccessibilityLabel。如果没有,这些道具将被忽略。

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

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

有关更多信息,请参见http://appium.io/docs/en/commands/element/find-elements/