iOS 仪器自动化“setValue”不起作用
Posted
技术标签:
【中文标题】iOS 仪器自动化“setValue”不起作用【英文标题】:iOS Instruments Automation "setValue" not working 【发布时间】:2013-01-29 05:15:46 【问题描述】:我只想使用 UI 自动化测试我的 ios UI,但在向 UITextFields 输入文本时遇到了困难。文档说“setValue(...)”方法应该可以解决问题,但它没有。
我总是收到这个错误:
Script threw an uncaught javascript error: Unexpected error in -[UIATextField_0x9952690 setValue:], /SourceCache/UIAutomation_Sim/UIAutomation-271/Framework/UIAElement.m line 1142, kAXErrorSuccess on line 15 of login.js, #0 setValue()
代码如下:
var textfields = UIATarget.localTarget().frontMostApp().mainWindow().textFields();
username = textfields["username"];
username.setValue("test");
用户名字段不为空或未定义。
我的第二个解决方案是这个 JS 项目: https://github.com/alexvollmer/tuneup_js#readme 它有一个用于文本字段的“typeString”方法,但是在输入数字和大写字母时有点错误并且失败。
我正在使用 iOS6.1, 仪器版本 4.6 (46000), Xcode 版本 4.6 (4H127)。
感谢任何帮助!
【问题讨论】:
嗯。我可以使用 UI 自动化在我的应用程序中设置文本字段的值。您的自动化代码看起来正确。我怀疑在 Objective C 世界中有些问题。您是否使用UITextField
的自定义子类?您可以构建一个带有单个文本字段的虚拟应用程序并尝试在您的机器上设置该字段的值吗?这可能有助于追查问题。
在其他项目中,“setValue()”函数有效。我认为问题是由未完成的动画引起的。当用户点击文本字段时,底层视图滚动到顶部以在键盘出现时可见。 “target.delay(1)”做了我一直在寻找的,现在“setValue()”函数可以工作了。
【参考方案1】:
检查以下是否适合您,
target.delay(1); UIATarget.localTarget().frontMostApp().mainWindow().textFields()["username"].tap(); 目标.延迟(1); UIATarget.localTarget().frontMostApp().mainWindow().textFields()["username"].setValue("test");
如果不适合您,请检查正确的层次结构..
【讨论】:
看来“target.delay(1)”成功了。你的代码对我来说很好用,谢谢!【参考方案2】:我来到这里努力理解 UI 自动化脚本是如何工作的,因为那里确实缺乏文档和示例代码(或者从一个非常具体的角度编写并不能解释所有情况)。
以下是关于我学到的主题的两件事:
-
首先,您必须在元素上启用辅助功能。我在试验中禁用了它,并且在我重新启用它之前,事情的表现非常奇怪(得到一个与你类似的“意外错误”)。因此,请确保您已打开辅助功能。但请注意,一些 在禁用它的情况下仍然可以工作。例如,您仍然可以通过元素名称 (accessibilityIdentifier) 查找元素,但您将无法点击它或调用
setValue()
。
-
您必须深入了解您的应用程序层次结构。我的假设是给一个元素一个
accessibilityIdentifier
将允许我简单地查找具有该标识符的元素,如html 的getElementById
。但它根本不是这样。即使使用accessibilityIdentifier,您也必须逐级挖掘层次结构。幸运的是,您可以使用 UIAElement.logElementTree()
来获取有关要使用的正确层次结构的一些线索。
到目前为止,我对这个框架完全没有印象,但我的进步非常缓慢。
【讨论】:
以上是关于iOS 仪器自动化“setValue”不起作用的主要内容,如果未能解决你的问题,请参考以下文章
具有 NSObject 继承的泛型类,self.setValue(, forKey:) 不起作用
JProgressBar setValue 不起作用,也尝试使用 SwingUtilities
Firebase 数据库中的 setValue() 方法不起作用。值未添加到数据库中