我正在尝试通过快照当前屏幕元素(标签,图像,按钮)并将其可访问性信息保存到json文件来扩展Xcode 7中的新UI测试功能.
我们的想法是,在以后运行UI测试时,可以获取当前屏幕快照并与现有屏幕快照进行比较,如果找到其他元素或缺少元素,测试将失败.
遗憾的是,即使使用正确的目标,UI测试期间似乎也无法使用应用程序资源,因此无法加载json文件进行比较.以下标准代码无法加载资源:
guard let resourcePath = NSBundle.mainBundle ().pathForResource ("StartScreenShapshot", ofType:"json") else {
XCTFail ("can't load resource StartScreenShapshot")
return
}
Run Code Online (Sandbox Code Playgroud)
我可以理解为什么Apple采用这种沙盒方法,因为UI测试应该基于屏幕上发生的事情,并且不需要访问应用程序的工作,但是不能访问资源包是一件痛苦的事.
那么有没有办法在Xcode 7 UI测试期间从应用程序或本地其他方式加载本地资源?
在本地(自动)保存文件也是一个巨大的优势,可以节省手动创建它们.
想知道是否有人找到了并行运行Xcuitests的方法.非常确定此功能不是内置的,但如果您可以从命令行运行特定的Xcuitest,则可以编写可以将其分布在多台计算机上的脚本.
那么子问题,你如何从命令行运行特定的Xcuitest?
我很感激,如果有人玩这个并且可以分享他们所学到的东西,或者他们有什么资源可以指出我.谢谢!
我正试图通过跟随帖子中提供的流程来通过用户通知系统警报,这是在UI测试备忘单和SO上的一些其他帖子中提到的相同流程.
Xcode7 | Xcode UI测试| 如何处理位置服务警报?
我有一个奇怪的问题,我无法按下确定按钮.这是我的代码
addUIInterruptionMonitorWithDescription("User Notifications") { (alert) -> Bool in
let okButton = alert.buttons["OK"]
let dontAllowButton = alert.buttons["Don\u{2019}t Allow"]
print(okButton.frame)
print(dontAllowButton.frame)
okButton.tap() // Taps the dontAllowButton ??
return true
}
launchFinished() // wait for app to load and notification to show
app.tap()
Run Code Online (Sandbox Code Playgroud)
我使用后,测试成功进入处理程序,app.tap()并且找到并存在按钮,但实际上似乎无法点击确定按钮!当我尝试点击"确定"按钮时,它会点击"不允许"按钮,当我尝试点击"不允许"按钮时,它不会点击任何内容.
按钮的框架也与屏幕上的内容不匹配.
当我调试并查看它们的帧时:
okButton =(431.5,377.0,44.0,135.0)
dontAllowBtn =(431.5,512.0,44.0,135.0)
这似乎表明它们具有相同的X值,并且一个在另一个之上,这实际上没有任何意义.
此外,我已经尝试使用XCUICoordinate在按钮附近创建一些坐标并点击坐标而不是按钮,这对我在应用程序的其他位置工作正常,但似乎没有坐标点击注册.
我如何通过此警报?
编辑
我在使用Xcode 7.1.1,并且位置服务也出现了同样的问题.它似乎与横向模式有关,这使得它无法正常工作.当我创建一个新的测试应用程序并运行上面的代码时,它在纵向模式下工作正常.当我将其切换到横向模式时,它具有上述行为并且不起作用.
编辑2
我向Apple提交了一份错误报告.
鉴于以下设置:
如何使用 XCTest 框架对应用程序的基于文档的部分进行 UI 测试?
与基于文档的功能无关的常规单元或 UI 测试很容易,但我看不到如何在基于文档的位上进行 UI 测试,因为在 UI 测试中,我们被禁止进入应用程序,例如,嘲笑 NSDocument 类。
我听到的一个建议是在测试资源文件夹中创建夹具文件/文件夹(取决于您的基于文档的应用程序需要什么),并以某种方式让测试打开它。但是有没有更好的解决方案?
在进行UI测试时,我可以测试文本是否存在,如下所示:
XCTAssertTrue(tablesQuery.staticTexts["Born: May 7, 1944"].exists)
Run Code Online (Sandbox Code Playgroud)
但是,如果我只知道前缀,我如何测试文本是否存在?
我想做的事情如下:
XCTAssertTrue(tablesQuery.staticTextWithPrefix["Born: "].exists)
Run Code Online (Sandbox Code Playgroud)
甚至更好:
XCTAssertTrue(tablesQuery.staticTextWithRegex["Born: .+"].exists)
Run Code Online (Sandbox Code Playgroud) 我正在测试向我的应用程序添加评论,在我的其他 UI 测试中,我使用了该typeText功能并且一切正常。我还单击了“连接硬件键盘”关闭。应用程序终止测试并显示错误 UI 测试失败 - 在 addComment 方法期间,元素和任何后代都没有键盘焦点。有任何想法吗?
func testAddComment() {
let featuredPage = self.app.tabBars["Featured"]
if featuredPage.exists {
featuredPage.tap()
}
sleep(2)
let featuredOffer = self.app.tables.cells.elementBoundByIndex(1)
if featuredOffer.exists {
featuredOffer.tap()
}
sleep(2)
let addComment = self.app.staticTexts["Add a comment"]
if addComment.exists {
addComment.tap()
addComment.typeText("Test comment")
}
sleep(2)
let postComment = self.app.buttons["Send"]
if postComment.exists {
postComment.tap()
}
sleep(2)
}
Run Code Online (Sandbox Code Playgroud) 我已经构建了一个带有3个选项卡的简单标签栏.
我想运行UI测试以确保如果用户单击选项卡栏项,则显示正确的视图控制器.我该怎么做呢?下面是我要开始的代码,只是不知道如何编写我的断言.
func testTabBarMyProfileButton() {
let tabBarsQuery = XCUIApplication().tabBars
tabBarsQuery.buttons["My Profile"].tap()
}
func testTabBarGraphsButton() {
let tabBarsQuery = XCUIApplication().tabBars
tabBarsQuery.buttons["Graphs"].tap()
}
func testTabBarAboutButton() {
let tabBarsQuery = XCUIApplication().tabBars
tabBarsQuery.buttons["About"].tap()
}
Run Code Online (Sandbox Code Playgroud) 我只有在尝试运行 UITests 时才会收到此错误。我没有使用故事板,构建应用程序运行良好,单元测试也运行良好。
即使记录 UITests 也能正常工作并且能够打开应用程序。只是当我尝试运行实际测试时,我才收到错误。
也许我在某处缺少目标或需要向 XCUIApplication 启动参数添加一些内容?有任何想法吗?
有没有办法在 XCUITests 中测试 UIApplication 快捷方式?
我知道为了在模拟器中测试 3d 快捷方式,您需要一个带有强制触摸功能的触控板,但我想知道是否可以编写测试我的快捷方式的测试。
我的应用程序目前使用 Core Data 作为持久性,我想用一些模拟数据做一些 UI 测试。目前,我正在使用之前在开发时存储的数据运行 UI 测试。理想情况下,我想在 MOC 中插入一些模拟数据,以便我编写更多的 UI 测试。对于我的单元测试,我将 JSON 文件中的数据插入到 setup 函数中的托管对象上下文中。我想知道这是否可以用于 UI 测试?
我试过在网上查找这个,但我从人们那里读到了很多不同的答案,我现在很困惑。如果这是不可能的,有人可以推荐使用核心数据进行 UI 测试的最佳实践吗?