[英]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.