运行 Xcode UI 测试时如何禁用自动完成?
Posted
技术标签:
【中文标题】运行 Xcode UI 测试时如何禁用自动完成?【英文标题】:How to disable auto-complete when running Xcode UI Tests? 【发布时间】:2015-10-01 23:30:19 【问题描述】:作为我的 UI 测试的一部分,我正在生成一个随机字符串作为我的对象的标题。问题是当这个标题通过键盘输入时(使用XCUIElement.typeText()
),ios 有时会接受一个自动建议的值。
例如,我可能希望它键入自动生成的字符串“calg”,但自动更正将选择“calf”。当我稍后尝试使用断言查找此值时,它不存在并且错误地失败。
有没有办法告诉 UI 测试他们不应该使用自动更正,或者有什么我可以使用的变通方法?
【问题讨论】:
【参考方案1】:除非您需要任何测试场景的自动建议,否则您是否尝试在设备/模拟器设置中关闭自动更正。
设置->通用->键盘->自动更正
【讨论】:
这很适合本地测试运行。但是,它不适用于 CI。 我只是试图自己找到解决方法,但找不到任何干净的解决方法。我认为合理的解决方案是所有 CI 提供商都应该在短期内将他们的模拟器配置为默认关闭自动更正,所以请随时与他们联系,我相信他们会帮助你。尽管 Apple 会为这个长期提供解决方案(例如,方案中 Xcode 中的一个选项),但您可能希望通过错误报告器发布功能请求。做的人越多,实施的可能性就越大。【参考方案2】:我认为您无法通过 UI 测试目标中的代码关闭自动更正功能。
但是,您可以从生产代码中为单个文本视图关闭它。为确保在运行和发布应用程序时自动更正仍然处于开启状态,一种解决方案是继承 UITextField
并打开环境变量。
首先设置您的 UI 测试以在 XCUIApplication
上设置 launchEnvironment
属性。
class UITests: XCTestCase
let app = XCUIApplication()
override func setUp()
super.setUp()
continueAfterFailure = false
app.launchEnvironment = ["AutoCorrection": "Disabled"]
app.launch()
func testAutoCorrection()
app.textFields.element.tap()
// type your text
然后继承(并使用)UITextField
在进程的环境字典中查找此值。如果已设置,请关闭自动更正。如果没有,请直接致电 super。
class TestableTextField: UITextField
override var autocorrectionType: UITextAutocorrectionType
get
if NSProcessInfo.processInfo().environment["AutoCorrection"] == "Disabled"
return UITextAutocorrectionType.No
else
return super.autocorrectionType
set
super.autocorrectionType = newValue
【讨论】:
这个想法很有趣。但是,缺点显然是您在应用程序中有子类 ALL 文本字段。调配 UITextField 类方法来实现它是有意义的。 这里有一些关于 swizzling 的建议:***.com/questions/9670321/… 这是我认为的完美答案。【参考方案3】:这是我在 UI 测试中禁用它的方法
app.textFields.element(boundBy: 0).tap()
let keyboards = app.keyboards.count
XCTAssert(keyboards > 0, "You need enable the keyboard in the simulator.")
app.buttons["Next keyboard"].press(forDuration: 2.1)
let predictiveOn = app.switches["Predictive"].value as! String == "1"
if predictiveOn
app.switches["Predictive"].tap()
else
app.buttons["Next keyboard"].tap()
app.buttons["Next keyboard"].press(forDuration: 2.1)
let predictiveOff = app.switches["Predictive"].value as! String == "0"
XCTAssert(predictiveOff, "Predictive mode is not disabled")
app.buttons["Next keyboard"].tap()
【讨论】:
以上是关于运行 Xcode UI 测试时如何禁用自动完成?的主要内容,如果未能解决你的问题,请参考以下文章