В моем тесте у меня есть текстовое поле с существующим ранее текстом. Я хочу удалить содержание и ввести новую строку.
let textField = app.textFields
textField.tap()
// delete "Old value"
textField.typeText("New value")
При удалении строки с аппаратной Записью клавиатуры, сгенерированной для меня ничто. После выполнения того же с клавиатурой программного обеспечения я добрался:
let key = app.keys["Usuń"] // Polish name for the key
key.tap()
key.tap()
... // x times
или
app.keys["Usuń"].pressForDuration(1.5)
Я волновался, что мой тест языковозависимый, таким образом, я создал что-то вроде этого для своих поддерживаемых языков:
extension XCUIElementQuery {
var deleteKey: XCUIElement {
get {
// Polish name for the key
if self["Usuń"].exists {
return self["Usuń"]
} else {
return self["Delete"]
}
}
}
}
Это выглядит более хорошим в коде:
app.keys.deleteKey.pressForDuration(1.5)
но это очень хрупко. После выхода от Средства моделирования Toggle software keyboard
был сброшен и у меня есть провальный тест. Мое решение не работает хорошо с тестированием CI. Как это может быть решено, чтобы быть более универсальным?
Я использовал то, что описал @oliverfrost, но он не работал над IPhone XR, я изменил его немного для моего собственного использования к этому
extension XCUIElement {
func clearText(andReplaceWith newText:String? = nil) {
tap()
tap() //When there is some text, its parts can be selected on the first tap, the second tap clears the selection
press(forDuration: 1.0)
let select = XCUIApplication().menuItems["Select"]
//For empty fields there will be no "Select All", so we need to check
if select.waitForExistence(timeout: 0.5), select.exists {
select.tap()
typeText(String(XCUIKeyboardKey.delete.rawValue))
}
if let newVal = newText { typeText(newVal) }
}
}
и как @zysoft сказал, можно использовать его как:
let app = XCUIApplication()
//Just clear text
app.textFields["field1"].clearText()
//Replace text
app.secureTextFields["field2"].clearText(andReplaceWith: "Some Other Text")
Для тех, кто все еще использует Objective C
@implementation XCUIElement (Extensions)
-(void)clearText{
if (!self){
return;
}
if (![self.value isKindOfClass:[NSString class]]){
return;
}
NSString* stringValue = (NSString*)self.value;
for (int i=0; i<stringValue.length ; i++) {
[self typeText:XCUIKeyboardKeyDelete];
}
}
@end