我有一个非常简单的XCTestCase
实现,它测试点击一个按钮并期望显示一个Alert控制器。问题是tap()
方法不起作用。在关联按钮的IBAction中放置一个断点,我意识到逻辑甚至没有被调用。
class uitestsampleUITests: XCTestCase {
var app: XCUIApplication!
override func setUp() {
super.setUp()
continueAfterFailure = false
app = XCUIApplication()
app.launch()
}
func testButton() {
let button = app.buttons["Button"]
button.tap()
expectationForPredicate(NSPredicate(format: "exists == 1"), evaluatedWithObject: button, handler: nil)
waitForExpectationsWithTimeout(5.0, handler: nil)
}
}
另外,复制button.tap()
指令会使测试通过,如下所示:
func testButton() {
let button = app.buttons["Button"]
button.tap()
button.tap()
expectationForPredicate(NSPredicate(format: "exists == 1"), evaluatedWithObject: button, handler: nil)
waitForExpectationsWithTimeout(5.0, handler: nil)
}
我在Xcode 7中遇到了这个问题。3.1我错过了什么?是虫子吗?
6条答案
按热度按时间xpcnnkqh1#
一位苹果工程师对我的bug报告说:
第二种可能性是,您遇到了一个问题,有时会发生在应用程序完成启动,但启动屏幕没有立即消失,并且没有正确处理调度到应用程序的事件。
为了解决这个问题,可以考虑在测试开始时设置一个小的延迟(sleep(1)就足够了)。
所以我做了,现在它工作了:
i34xakig2#
对于可命中的
UIWebView
,直到我通过坐标完成后,才开始工作:希望能帮到人
也适用于不可命中的项目,如标签等。
jm81lzqq3#
我也有过类似的经历。对我来说,问题是我试图点击的元素有时出于某种原因不是
hittable
。从Apple的文档中:
将点击事件发送到为元素计算的可命中点。
因此,如果一个元素不是
hittable
,则tap动作不会做太多的事情,这会破坏测试用例的逻辑。为了解决这个问题,在我点击某个元素之前,我会等到合适的元素变得可以点击。很简单。
sd2nnvve4#
你可以
wait
同时加载元素,我创建了这个扩展:像这样使用:
5lwkijsr5#
对我来说,最可靠的方法是在元素没有被正确点击的地方添加
sleep(1)
。使用值小于1000
的usleep
函数会导致不可靠的行为,例如正确的测试随机失败。khbbv19g6#
在我的情况下,问题是在按钮的风格。我使用SUI并将buttonStyle设置为
.borderless
。在我的名单(我猜)系统使非击中区水龙头。但是XCTAssertTrue(app.buttons["myButton"].isHittable)
不会抛出错误。也许能帮到某人