如何使用 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 自动完成使匹配的文本变为粗体?