当用Xcode bot运行时,UItesting在文本input到文本视图时失败

我有以下XCTest用户界面testing,将文本input到文本视图中。

let textView = app.textViews.elementBoundByIndex(0) textView.tap() textView.typeText("Hello world") 

当作为Xcode机器人运行时,它显示了typeText调用的以下错误。

断言:UItesting失败 – 失败:超时等待关键事件完成

在这里输入图像说明

有趣的是,当我从同一台计算机上的Xcode手动运行testing时, 在升级到Xcode 7.1 / iOS 9.1之前,此testing也通过了Xcode bot。 什么可能是问题的根源?

这里是一个与UItesting隔离的演示: https : //github.com/exchangegroup/UITestTextViewDemo

iOS 9.1模拟器,OS X 10.11.1(15B42),Xcode 7.1(7B91b),OS X Server 5.0.15(15S4033)

向苹果报告。

我find了解决scheme,我希望它也能帮助你。

在我的setUp()tearDown() (似乎是多余的,我知道)我把XCUIApplication().terminate() 。 这是确保应用程序在运行下一个testing之前终止,它似乎在做这项工作。

 override func setUp() { XCUIApplication().terminate() super.setUp() continueAfterFailure = false XCUIApplication().launch() } override func tearDown() { super.tearDown() XCUIApplication().terminate() } 

我向苹果公司提交了一个错误,但是暂时这让我看到了你所看到的错误。 希望有所帮助!

我相信底层的问题是默认打开“连接硬件键盘”。 即使您为主用户closures,_xcsbuildd用户仍然使用默认值。 我能够通过使用以下脚本向计划添加预testing操作来解决问题:

 if [ `defaults read com.apple.iphonesimulator ConnectHardwareKeyboard` -eq 1 ] then defaults write com.apple.iphonesimulator ConnectHardwareKeyboard -bool false killall "Simulator" fi 

在这里输入图像说明

我find了另一种解决scheme,因为Konnor提出的解决scheme并不适合我:在Xcode Bot上使用UITest时遇到了很多问题,常见的症状是模拟器上的testing花费的时间比本地机器,所以我认为用来运行testing的_xcsbuildd用户在某种程度上变慢了。

我的解决scheme很简单:只需将_xcsbuildd用户升级为“普通”用户。 这还有另外一个好处:如果你希望你可以用这个用户login并且在集成过程中看到在模拟器中运行的testing,所以debugging起来更容易!

我是这样做的:

 sudo dscl . -create /Users/_xcsbuildd UserShell /bin/bash sudo dscl . -create /Users/_xcsbuildd FirstName Xcode sudo dscl . -create /Users/_xcsbuildd LastName Server sudo dscl . -create /Users/_xcsbuildd FullName "Xcode Server" sudo dscl . -create /Users/_xcsbuildd PrimaryGroupID 20 

然后更改密码:

 sudo dscl . -passwd /Users/_xcsbuildd 

我无法让用户在快速login窗口中显示,无论如何,您应该看到一个“其他用户”,您可以在其中插入用户名“_xcsbuildd”和您select的密码

我遇到了这个问题。 我已经写了一个用户界面testing来捕捉与快照(fastlane)截图,它运行良好的iPad Air&Pro模拟器。 但是,在iPad Retina或iPad 2模拟器上,我得到这个错误消息,无论是从命令行或直接从Xcode运行。

我的解决scheme是在typeText()语句之间添加一些sleep()函数,并且错误消失了。

编辑 :这只能修复从Xcode手动运行,通过命令行仍然会导致testing失败。 我也注意到,它适用于64位设备的所有模拟器,但不适用于较早的设备。

编辑2 :我find了解决此问题的方法,使用iOS 9.0模拟器而不是iOS 9.3,如此答案中所述: https : //stackoverflow.com/a/36334816/5334132 。 这似乎是一个很好的解决方法,直到它被固定在新版本的Xcode中。

除了连接硬件键盘,这些东西都没有为我工作。 什么工作是closuresMac的屏幕保护程序,并在系统设置中显示睡眠 。 我的怀疑是模拟器在Mac被locking或没有监视器绘制时奇怪的执行。

有了这两个设置,我仍然得到一些随机的UItesting失败。 连接硬件监视器或屏幕共享,以便模拟器在屏幕上绘制某处似乎解决这些。

我正在使用xcode 8.2.1并在ios 9.3版本上运行testing。 一个简单的窍门是添加一个睡眠2-5秒后点击文本框,然后打字。 虽然这不是一个永久的解决scheme。

另一个可靠的解决scheme

在运行testing之前,取消select设置中的所有键盘首选项。

 "KeyboardAllowPaddle": false, "KeyboardAssistant": false, "KeyboardAutocapitalization": false, "KeyboardAutocorrection": false, "KeyboardCapsLock": false, "KeyboardCheckSpelling": false, "KeyboardPeriodShortcut": false, "KeyboardPrediction": false, "KeyboardShowPredictionBar": false