繁体   English   中英

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

[英]Detox: iOS Simulator how to confirm alert message

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

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

在此处输入图片说明

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

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

谢谢。

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

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

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

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

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

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

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

您现在可以按下本机对话框。 在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();

我编写了一个实用程序函数,它允许您执行此跨平台操作。

功能

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM