排毒:iOS模拟器如何确认警报信息

Detox: iOS Simulator how to confirm alert message

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

如何按警报消息上的 "Log out" 按钮进行排毒?

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

但是我收到 "Multiple elements were matched" 错误。据推测它找到了 3 个具有相同标签的元素。带有标签 "Log out" 的原始按钮用于触发警报消息,警报消息标题,以及我想要 detox 按下的警报消息按钮。

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(),但这意味着每次发生变化时我都需要使用索引来确定正确的元素。

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

谢谢。

经过一番修改后,我最终使用了这个:

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

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

使用 Xcode 提供的 View Hierarchy Debugger 查看不同版本 iOS 的类型是否发生变化。

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

如果您的按钮显示 "OK" 即:

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();

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

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

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

我写了一个实用函数,可以让你跨平台。

函数

/**
 * 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();