我正在尝试使用Apple的UIAutomation为具有服务器端组件的iOS应用程序编写单元测试.为了在各种状态下设置测试服务器(以及模拟通过我的服务器进行通信的两个客户端),我想在基于javascript的测试中发出HTTP get请求.
任何人都可以提供一个示例,说明如何直接从UIAutomation javascript测试中发出HTTP GET请求,或者如何从我的UIAutomation javascript测试中调用shell脚本?
FWIW,UIAutomation运行时中缺少所有浏览器提供的大多数核心对象.例如,尝试使用XMLHTTPRequest,您将收到一个异常报告,它无法找到该变量.
谢谢!
我正在制作一个小型测试框架,它使用JavaScript模块模式在iOS上进行UI自动化测试.但是,基于#import和扩展模块,我似乎得到了奇怪的结果.
我有一个基本测试模块叫Tester-Module.js:
(function() {
var Tester = this.Tester = {};
Tester.setUp = function() {
UIALogger.logMessage('Regular SetUp()');
}
}).call(this);
Run Code Online (Sandbox Code Playgroud)
如果我在我的测试用例中导入此模块,它可以正常工作.这是测试文件tester.js(tester.js我在Instruments中导入的文件):
#import "./Tester-Module.js"
// Prints 'Regular SetUp()'
Tester.setUp();
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试Tester-Module.js在另一个模块文件中扩展模块,我就无法引用Tester对象.Tester-Extension.js扩展了以下定义的Tester模块Tester-Module.js:
#import "./Tester-Module.js"
// Outputs:
// Exception raised while running script:
// ReferenceError: Can't find variable: Tester\n
Tester.setUp = function() {
UIALogger.logMessage('Overwritten SetUp()');
}
Run Code Online (Sandbox Code Playgroud)
更新的测试用例文件tester.js:
#import "./Tester-Extension.js"
// Exception is thrown before this
Tester.setUp();
Run Code Online (Sandbox Code Playgroud)
我希望相关的问题是:
为什么我不能在里面引用Tester对象Tester-Extension.js,但可以在 …
我目前正在自动化我们对jenkins的iOS测试.到目前为止,我没有运行单元测试,将OCUnit转换为JUnit并以Cobertura格式生成代码覆盖(大量的谷歌搜索,但没有硬问题).
但是,在创建UIAutomation工作时,我被困住了.测试成功运行(instruments从命令行调用).生成junit报告很棘手,但可能.问题是在运行UIAutomation时,不会生成代码覆盖文件.
是否有可能产生它们?如果没有,你能解释一下原因吗?
到目前为止我尝试了什么:
UIAHost. performTaskWithPathArgumentsTimeout.
编辑
使用不同的框架进行一些测试后,我意识到退出模拟器是不够的,你必须明确地exit()从应用程序调用.使用UI自动化这有点棘手,但您可以声明一个应用程序,例如my-app://exit,通过MobileSafari使用它来调用它UIAHost.performTaskWithPathArgumentsTimeout.将检查这是否足以生成文件.
在用UI自动化工具编写的JavaScript脚本中,如何导入另一个JavaScript文件?
(Xcode 4.5)
从命令行运行仪器时,它第一次工作但直到我重新启动后它才会再次运行.
Instruments的详细输出包括:
Instruments : Loading template 'file://localhost/Applications/Xcode.app/Contents/Applications/Instruments.app/Contents/PlugIns/AutomationInstrument.bundle/Contents/Resources/Automation.tracetemplate'
Instruments : Setting Instrument Trace Command : Instrument Command (purpose:Idle; output destination:file://localhost/Users/xxxxx/instrumentscli0.trace)
Instruments : Trace Command Recognized
Instruments : Instrument 'Automation - MyProject' rejected command 'Instrument Command (purpose:Trace; output destination:file://localhost/Users/xxxxx/instrumentscli0.trace)' for target 'Executable (name:MyProject; arguments:)'
Instruments : Instruments Rejected Command
Instruments Trace Error : Failed to start trace.
Run Code Online (Sandbox Code Playgroud)
我用来运行仪器的命令行是这样的(为清晰起见,分成多行):
instruments -v -w <DeviceID>
-t /Applications/Xcode.app/Contents/Applications/Instruments.app/Contents/PlugIns/AutomationInstrument.bundle/Contents/Resources/Automation.tracetemplate
/Users/xxxxx/dev/MyProject/build/Debug-iphoneos/MyProject.app
-e UIASCRIPT /Users/xxxxx/dev/MyProject/UIAutoTests/some_test.js
Run Code Online (Sandbox Code Playgroud)
我已经尝试比较在第一次(成功)运行之前和之后运行的进程ps以及在使用之前和之后打开了哪些文件/管道lsof,但我找不到任何建议为什么它不会运行多次.
该错误似乎表明仪器内的自动化仪器拒绝该purpose:Trace命令,所以我尝试删除输出跟踪目录(如果自动递增的文件名导致问题),我尝试使用不同的模板运行仪器在运行之间查看是否可以清除阻止它的任何内容,但是每次重新启动时我无法让它工作多次.
我怀疑自动化仪器或仪器使用的共享库中存在一些无效状态.我需要一种方法从命令行重置此状态,以便我可以在CI服务器上可靠地运行自动化测试.
有没有办法比较之前/之后加载的共享库和卸载它们?有没有人对可能存在的内容以及如何重置它有任何其他想法?
我只是想用UI自动化测试我的iOS用户界面,但是在将文本输入到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()
Run Code Online (Sandbox Code Playgroud)
代码如下所示:
var textfields = UIATarget.localTarget().frontMostApp().mainWindow().textFields();
username = textfields["username"];
username.setValue("test");
Run Code Online (Sandbox Code Playgroud)
用户名字段不为null或未定义.
我的第二个解决方案是这个JS项目:https: //github.com/alexvollmer/tuneup_js#readme 它有一个用于文本字段的"typeString"方法,但它有点儿错误,并且在输入数字和大写字母时失败.
我正在使用iOS6.1,仪器版本4.6(46000),Xcode版本4.6(4H127).
任何帮助表示赞赏!
我已经阅读过一次或两次打开/关闭真正的iOS设备(在我的情况下是iPad)上使用UI自动化脚本似乎无法打开/关闭wifi.
我还读到你可以使用目标"设置"创建一个脚本,但它似乎只适用于模拟器,我是对的吗?
你对我有什么想法或解决方案吗?
问候,
我正在使用UIAutomation在iOS模拟器中进行一些自动化测试.
在Xcode 6中,iOS模拟器的键盘行为更改为类似于真实设备,现在有一个菜单项可以将Mac键盘连接/断开连接到模拟器:硬件>键盘>连接硬件键盘.
我不介意这一点,但连接Mac键盘时会发生的情况是模拟器将不再显示软件键盘.当您使用UIAutomation运行测试脚本UIATarget.localTarget().frontMostApp().keyboard().typeString("myString");时,即使您已将文本字段设置为第一个响应者,因此类似的调用也会失败,因为键盘不会出现.
这很烦人,因为如果我在模拟器中进行任何手动测试,我将需要记住在运行任何UIAutomation测试之前禁用硬件键盘,否则它们都会失败.
从UIAutomation JS脚本中有没有办法检查硬件键盘设置并禁用它们?或者,在执行UIAutomation脚本之前,从命令行执行此操作的任何方法?
我想通过自动化点击iOS模拟器中的主页按钮.
我只是想知道是否可以使用IOS keycode事件单击主页按钮.
在 Xcode 8 / Swift 3 中,使用坐标(withNormalizedOffset: CGVector)函数与 XCUIElement 交互似乎只能在纵向模式下工作。
为了测试此功能,我创建了一个单屏项目,其中一个按钮位于视图中央。然后我运行了以下 UI 测试:
func testExample() {
XCUIDevice.shared().orientation = .portrait
let window = XCUIApplication().windows.element(boundBy: 0)
let centerPoint = window.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 0.5))
centerPoint.tap()
}
Run Code Online (Sandbox Code Playgroud)
这成功地点击了按钮。但是,如果我在 LandscapeLeft 或 LandscapeRight 中运行相同的测试,则不会点击该按钮。打印坐标的屏幕点显示它在纵向和横向模式下都位于按钮的框架内。
对于 Xcode 7 / Swift 2 中的所有方向,相同的逻辑都是成功的:
func testExample() {
XCUIDevice.sharedDevice().orientation = .LandscapeLeft
let window = XCUIApplication().windows.elementBoundByIndex(0)
let centerPoint = window.coordinateWithNormalizedOffset(CGVectorMake(0.5, 0.5))
centerPoint.tap()
}
Run Code Online (Sandbox Code Playgroud)
我是否遗漏了什么,或者这是一个合法的框架错误?它与从 Swift 2 中的 CGVectorMake 到 Swift 3 中的 CGVector(dx: dy:) 的转换有关吗?
ios ×7
instruments ×2
iphone ×2
javascript ×2
appium-ios ×1
ios6.1 ×1
keyboard ×1
keycode ×1
simulator ×1
swift3 ×1
ui-testing ×1
wifi ×1
xcode6 ×1
xcode8 ×1