排毒: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();
我写了一个实用函数,可以让你跨平台。
函数
/**
* 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();
我正在使用来自 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();
我写了一个实用函数,可以让你跨平台。
函数
/**
* 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();