如何使用 JavaScript 在 UI 自动化中访问 actionSheet(及其按钮)?

Posted

技术标签:

【中文标题】如何使用 JavaScript 在 UI 自动化中访问 actionSheet(及其按钮)?【英文标题】:How to access actionSheet (and it's buttons) in UIAutomation with JavaScript? 【发布时间】:2014-01-24 11:32:39 【问题描述】:

我有一个非常简单的应用程序,其中包括一个 TableViewController,它显示一个表格,其中包含几个带有图像、标签和一个按钮的自定义单元格,当你点击一个按钮时,actionSheet 就会显示出来。因此,在我的自定义 Java 脚本(使用 Instruments-UIAutomation)中,我想在我的表格中按下按钮(我可以毫无问题地做到这一点),然后当 actionSheet 出现时,我只想点击唯一的按钮(取消按钮)它显示了。

而且我不知道如何正确地做到这一点。所以这是我的js代码:

var target = UIATarget.localTarget();
var app = target.frontMostApp();
var main = app.mainWindow();

main.tableViews()[0].cells()[1].buttons()["DetailsButton"].tap();
target.delay(5);
main.actionSheet().elements()[0].tap();

这就是我得到的信息:

Script threw an uncaught javascript error: 'undefined' is not a function (evaluating 'main.actionSheet()') on line 9 of New%20Script

我也尝试过actionSheet().buttons()[0].tap(); - 没有帮助,一直收到同样的错误。

我什至尝试通过它的accessibleLabel来访问actionSheet:

main.actionSheet()["CellNumberSheet"].elements()[0].tap();

如果有帮助,这就是我展示 actionSheet 的方式:

[actionSheet showInView:[UIApplication sharedApplication].keyWindow];

元素层次结构似乎也是正确的。

在网络上没有找到太多有用的信息...所以任何帮助将不胜感激...

【问题讨论】:

【参考方案1】:

ios8 上,操作表按钮和元素似乎不起作用,所以我检查了 SparkInspector,它现在使用集合视图:

此代码将点击不是取消按钮的底部按钮:

target.frontMostApp().actionSheet().collectionViews()[0].visibleCells()[0].tap()

【讨论】:

这适用于 iPhone,但在 iPad 上我必须先访问 actionSheet:window.popover().elements()[0].collectionViews()[0].visibleCells()["注册新设备"].tap();【参考方案2】:

当你想点击actionSheet时,你必须使用如下:

var target = UIATarget.localTarget();
var app = target.frontMostApp();
var window = app.mainWindow();

target.frontMostApp().actionSheet().buttons()["Cancel"].tap();

但是如果你使用window.actionSheet()它会返回错误。

【讨论】:

【参考方案3】:

其实你需要使用app.actionSheet()来获取actionsheet。

见UIAApplication

app.actionSheet().elements()[0].tap(); 

这应该可以工作

【讨论】:

这让我更进一步,虽然仍然不起作用......现在当我尝试按照你建议的方式点击 actionSheet 按钮时,出现另一个错误:Cannot perform action on invalid element: UIAElementNil from target.frontMostApp().actionSheet().elements()[0].. . 同样,当我将checkIsValid()isEnabled()isVisible() 等所有方法应用于我的 actionSheet() 时,它们都会返回 False,而actionSheet().name() 返回一个空字符串(而在我的帖子中的屏幕截图上,你可以看到它有一个有效的名称“CellNumberSheet”)... 有意思,用 app.windows()[2].elements()[1] 来访问 actionsheet 怎么样? 您建议访问 actionSheet 的最后一种方法工作正常,并且 isVisible、checkIsValid 和 isEnabled 等所有方法都返回 True。虽然仍然无法点击 actionSheet 的按钮!尝试app.windows()[2].elements()[1].elements()[0].tap()app.windows()[2].elements()[1].buttons()[0].tap()。没有成功,它会引发错误“无法对无效元素执行操作”。暂时使用解决方案来点击 asctionSheet 按钮,如下所述:***.com/a/5331896/3065769【参考方案4】:

试试这个:

 //check that action sheet is on the screen
   app.actionSheetIsValid();

 //add some delay
   target.delay(2);

 //check that the button is on the actionSheet
   actionSheet.actionSheetButton("Cancel");

 //add some delay
   target.delay(2);

 //touch Exit button
   actionSheet.tapActionSheetButtonByName("Cancel");

【讨论】:

以上是关于如何使用 JavaScript 在 UI 自动化中访问 actionSheet(及其按钮)?的主要内容,如果未能解决你的问题,请参考以下文章

在 iPhone 的 UI 自动化测试中访问 JAVASCRIPT 变量

如何使用 jquery ui 自动完成使匹配的文本变为粗体?

SAP UI5 本地开发如何实现 XML 和 JavaScript 代码的自动完成和嵌入式 API 文档自动显示

如何根据下拉选择更改 jquery ui 自动完成源

如何将 Semantic-UI 添加到 Phoenix

jQuery UI自动完成行为。如何在输入时搜索自由文本?