19

我正在使用来自 react-native 的警报。

如何排毒以按警报消息上的“注销”按钮?

在此处输入图像描述

我尝试使用await element(by.text('Log out')).tap();

但我得到“多个元素匹配”错误。大概它会找到 3 个具有相同标签的元素。带有“注销”标签的原始按钮用于触发警报消息、警报消息标题和我要排毒的警报消息按钮。

Error Trace: [
  {
    "Description" : "Multiple elements were matched: (
    "<UILabel:0x7fe7964db910; AX=Y; AX.label='Log out'; AX.frame={{41, 234}, {238, 20.5}}; AX.activationPoint={160, 244.25}; AX.traits='UIAccessibilityTraitStaticText'; AX.focused='N'; frame={{16, 20}, {238, 20.5}}; opaque; alpha=1; UIE=N; text='Log out'>",
    "<UILabel:0x7fe7964dda90; AX=Y; AX.label='Log out'; AX.frame={{198.5, 322.5}, {58, 20.5}}; AX.activationPoint={227.5, 332.75}; AX.traits='UIAccessibilityTraitStaticText'; AX.focused='N'; frame={{0, 12}, {58, 20.5}}; opaque; alpha=1; UIE=N; text='Log out'>",
    "<RCTText:0x7fe79652f300; AX=Y; AX.label='Log out'; AX.frame={{16, 338.5}, {288, 17}}; AX.activationPoint={160, 347}; AX.traits='UIAccessibilityTraitStaticText'; AX.focused='N'; frame={{0, 0}, {288, 17}}; alpha=1>"
). Please use selection matchers to narrow the selection down to single element.",
    "Error Domain" : "com.google.earlgrey.ElementInteractionErrorDomain",
    "Error Code" : "5",
    "File Name" : "GREYElementInteraction.m",
    "Function Name" : "-[GREYElementInteraction grey_errorForMultipleMatchingElements:withMatchedElementsIndexOutOfBounds:]",
    "Line" : "956"
  }
]

我想一种方法是使用.atIndex(),但这意味着每次发生变化时我都需要使用索引来确定正确的元素。

没有更好的方法来解决这个问题吗?

谢谢。

4

4 回答 4

22

经过一些修补后,我最终使用了这个:

await element(by.label('Log out').and(by.type('_UIAlertControllerActionView'))).tap();

不确定这是否适用于每个 iOS 版本,但似乎适用于 10.3 和 11.1

使用 Xcode 提供的 View Hierarchy Debugger 查看不同版本的 iOS 的类型是否已更改。

于 2017-11-28T01:37:44.390 回答
5

它应该可以通过文本查找元素

await element(by.text('Log out')).tap();

演示仓库:https ://github.com/FDiskas/demonas/blob/c703840a991b2f3d96a18ac8c5120ee1d5f901f8/e2e/firstTest.spec.ts#L11

于 2020-01-14T15:39:00.447 回答
2

您现在可以按下本机对话框。在 iOS 上测试。(未在 Android 上测试)

如果您的按钮显示“确定”,即:

Alert.alert(
  `Are you sure you would like to remove this image as the coming soon image?`,
  undefined,
  [
    {
      text: "No",
      style: "cancel",
    },
    {
      text: "OK",
      style: "destructive",
      onPress: this.onRemoveHero,
    },
  ]
);

您可以通过以下方式单击它:

element(by.label("OK")).atIndex(0).tap();
于 2019-12-04T20:22:20.130 回答
0

我写了一个实用函数,它允许你做这个跨平台。

功能

/**
 * Detects a systme dialog button by label
 * 
 * @param {string} label
 * 
 * @returns {*}
 */
export function systemDialog(label){
    if (device.getPlatform() === 'ios') {
        return element(by.label(label)).atIndex(0);
    }

    return element(by.text(label));
}

用法

import { systemDialog } from "path to system dialog";

...

await systemDialog('OK').tap();
于 2021-01-25T10:25:49.523 回答