在 UI 中填写 TextField 测试失败
Fill TextField in UI Test Fails
我正在尝试在我的 iOS 应用程序中进行简单的 UI 测试。我想用一些文本填充 textfield
,但总是出现错误。
第一次尝试:
let searchField = app.textFields.elementBoundByIndex(0);
searchField.tap()
searchField.typeText("Holy Grail")
该字段突出显示,键盘出现,几秒钟后,随机出现以下之一:
- Timed out waiting for IDE barrier message to complete
- failed to get attributes within 15.0s ui test
- failed to get snaphots within 15.0s ui test
第二次尝试:
func setText(text: String, application: XCUIApplication) {
//Instead of typing the text, it pastes the given text.
UIPasteboard.generalPasteboard().string = text
doubleTap()
application.menuItems["Paste"].tap()
}
...
let searchField = app.textFields.elementBoundByIndex(0);
searchField.tap()
searchField.setText("Holy Grail")
同样的结果。
尝试打开和关闭 Connect Hardware Keyboard
。
尝试使用 iPhone 6s 模拟器、iPad Retina 模拟器、iPad 2 模拟器。
仅尝试 Xcode 7(8 会破坏项目)
想法?提前致谢!
我不知道为什么会发生这种情况,但对于未来遇到我同样问题的任何人来说,这是我的解决方法,我正在努力。
基本思路是让键盘出现,然后敲击每一个我需要构建字符串的键。
func testPlayground() {
let app = XCUIApplication()
waitAndTap(app.textFields["MyTextField"])
type(app, text: "hej")
}
func waitAndTap(elm: XCUIElement){
let exists = NSPredicate(format: "exists == true")
expectationForPredicate(exists, evaluatedWithObject: elm, handler: nil)
waitForExpectationsWithTimeout(10.0, handler: nil)
elm.tap()
}
func type(app: XCUIApplication, text : String){
//Wait for the keyboard to appear.
let k = app.keyboards;
waitForContent(k, time: 10.0)
//Capitalize the string.
var s = text.lowercaseString;
s.replaceRange(s.startIndex...s.startIndex, with: String(s[s.startIndex]).capitalizedString)
//For each char I type the corrispondant key.
var key: XCUIElement;
for i in s.characters {
if "0"..."9" ~= i || "a"..."z" ~= i || "A"..."Z" ~= i {
// Then it's alphanumeric!
key = app.keys[String(i)];
}
else {
// Then is special character and is necessary re-map them.
switch i {
case "\n":
key = app.keys["Next:"]; // This is to generalize A LOT.
default:
key = app.keys["space"];
}
}
waitAndTap(key);
}
所以:waitAndTap()
是我在测试中经常使用的一个函数。它等待元素的存在并点击它。如果在十秒内它没有出现,则测试失败。
testPlayground()
点击我想写的文本框,然后调用 type()
type()
是核心。基本上,查看字符串中的每个字符并点击它。问题:
如果我在未激活 shift 的键盘中查找字符 H,它将永远找不到大写字母。我的解决方案是将字符串大写,但它仅在特定情况下有效。这是可增强的
它不适用于特殊字符,在这种情况下您无法准确地找到它,但可以找到键的名称("space" 而不是“”)。好吧,这里没有解决方案,除了那个可怕的 switch-case,但是好吧,对于我需要做的事情,它是有效的。
希望这可以帮助到别人!
此方法允许您输入大写和小写字符串
func enterUsername(username: String?) {
guard
let input = username,
var previousCharaterIsLowerCase = input.first?.isUppercase else {
XCTFail("Username is not set")
return
}
for char in input {
if char.isUppercase && previousCharaterIsLowerCase {
// Switch on capslock
app.buttons["shift"].tap()
app.buttons["shift"].tap()
}
if char.isLowercase && previousCharaterIsLowerCase == false {
// Switch off capslock
app.buttons["shift"].tap()
app.buttons["shift"].tap()
app.buttons["shift"].tap()
}
previousCharaterIsLowerCase = char.isLowercase
app.keys[String(char)].tap()
}
}
首先尝试禁用 I/O -> 硬件键盘,看看会发生什么。
如果还是不行
而不是
searchField.tap()
searchField.typeText("Holy Grail")
试试这个
app.keys["H"].tap()
app.keys["o"].tap()
app.keys["l"].tap()
app.keys["y"].tap()
我正在尝试在我的 iOS 应用程序中进行简单的 UI 测试。我想用一些文本填充 textfield
,但总是出现错误。
第一次尝试:
let searchField = app.textFields.elementBoundByIndex(0);
searchField.tap()
searchField.typeText("Holy Grail")
该字段突出显示,键盘出现,几秒钟后,随机出现以下之一:
- Timed out waiting for IDE barrier message to complete
- failed to get attributes within 15.0s ui test
- failed to get snaphots within 15.0s ui test
第二次尝试:
func setText(text: String, application: XCUIApplication) {
//Instead of typing the text, it pastes the given text.
UIPasteboard.generalPasteboard().string = text
doubleTap()
application.menuItems["Paste"].tap()
}
...
let searchField = app.textFields.elementBoundByIndex(0);
searchField.tap()
searchField.setText("Holy Grail")
同样的结果。
尝试打开和关闭 Connect Hardware Keyboard
。
尝试使用 iPhone 6s 模拟器、iPad Retina 模拟器、iPad 2 模拟器。
仅尝试 Xcode 7(8 会破坏项目)
想法?提前致谢!
我不知道为什么会发生这种情况,但对于未来遇到我同样问题的任何人来说,这是我的解决方法,我正在努力。
基本思路是让键盘出现,然后敲击每一个我需要构建字符串的键。
func testPlayground() {
let app = XCUIApplication()
waitAndTap(app.textFields["MyTextField"])
type(app, text: "hej")
}
func waitAndTap(elm: XCUIElement){
let exists = NSPredicate(format: "exists == true")
expectationForPredicate(exists, evaluatedWithObject: elm, handler: nil)
waitForExpectationsWithTimeout(10.0, handler: nil)
elm.tap()
}
func type(app: XCUIApplication, text : String){
//Wait for the keyboard to appear.
let k = app.keyboards;
waitForContent(k, time: 10.0)
//Capitalize the string.
var s = text.lowercaseString;
s.replaceRange(s.startIndex...s.startIndex, with: String(s[s.startIndex]).capitalizedString)
//For each char I type the corrispondant key.
var key: XCUIElement;
for i in s.characters {
if "0"..."9" ~= i || "a"..."z" ~= i || "A"..."Z" ~= i {
// Then it's alphanumeric!
key = app.keys[String(i)];
}
else {
// Then is special character and is necessary re-map them.
switch i {
case "\n":
key = app.keys["Next:"]; // This is to generalize A LOT.
default:
key = app.keys["space"];
}
}
waitAndTap(key);
}
所以:waitAndTap()
是我在测试中经常使用的一个函数。它等待元素的存在并点击它。如果在十秒内它没有出现,则测试失败。
testPlayground()
点击我想写的文本框,然后调用 type()
type()
是核心。基本上,查看字符串中的每个字符并点击它。问题:
如果我在未激活 shift 的键盘中查找字符 H,它将永远找不到大写字母。我的解决方案是将字符串大写,但它仅在特定情况下有效。这是可增强的
它不适用于特殊字符,在这种情况下您无法准确地找到它,但可以找到键的名称("space" 而不是“”)。好吧,这里没有解决方案,除了那个可怕的 switch-case,但是好吧,对于我需要做的事情,它是有效的。
希望这可以帮助到别人!
此方法允许您输入大写和小写字符串
func enterUsername(username: String?) {
guard
let input = username,
var previousCharaterIsLowerCase = input.first?.isUppercase else {
XCTFail("Username is not set")
return
}
for char in input {
if char.isUppercase && previousCharaterIsLowerCase {
// Switch on capslock
app.buttons["shift"].tap()
app.buttons["shift"].tap()
}
if char.isLowercase && previousCharaterIsLowerCase == false {
// Switch off capslock
app.buttons["shift"].tap()
app.buttons["shift"].tap()
app.buttons["shift"].tap()
}
previousCharaterIsLowerCase = char.isLowercase
app.keys[String(char)].tap()
}
}
首先尝试禁用 I/O -> 硬件键盘,看看会发生什么。 如果还是不行
而不是
searchField.tap()
searchField.typeText("Holy Grail")
试试这个
app.keys["H"].tap()
app.keys["o"].tap()
app.keys["l"].tap()
app.keys["y"].tap()