XCUITest中如何正确获取动态生成的元素?

W″建利 阅读 19

我在用XCUITest写iOS自动化测试时,遇到一个头疼的问题:页面上有些按钮是通过JavaScript动态插入的,XCUIElement经常找不到它们。明明在模拟器里能看到按钮,但测试一跑就报“element not found”。

我试过加sleep等待,也试过用waitForExistence(timeout:),但都不稳定。是不是我的查询方式有问题?比如下面这段前端代码生成的按钮:

const btn = document.createElement('button');
btn.id = 'submit-btn';
btn.textContent = '提交';
document.body.appendChild(btn);

在XCUITest里我用的是app.buttons["submit-btn"]去查,但有时候能点到,有时候直接超时失败,到底该怎么处理这种动态元素啊?

我来解答 赞 2 收藏
二维码
手机扫码查看
1 条解答
西门新霞
动态元素确实挺烦人的,我理解你的痛苦。直接给个靠谱的解决方案吧。

首先别用 app.buttons["submit-btn"] 这种简单的查找方式了,容易出问题。试试这个方法:

let submitButton = app.descendants(matching: .any)
.matching(identifier: "submit-btn")
.firstMatch

if submitButton.waitForExistence(timeout: 10) {
submitButton.tap()
} else {
print("按钮没找到,超时了")
}


这个代码的核心是用 descendants(matching:) 来递归查找整个视图层级,比直接通过类型查找要稳定得多。

另外记得在测试开始前加个小小的延迟,比如半秒,给页面一点喘息的时间:
Thread.sleep(forTimeInterval: 0.5)


复制这个代码试试,应该能解决你的问题。如果还是偶尔失败,可能得再调高那个timeout时间。说实话这种动态元素就是得靠经验慢慢磨。
点赞
2026-03-30 17:30