Тестовый текст удаления UI в текстовом поле

В моем тесте у меня есть текстовое поле с существующим ранее текстом. Я хочу удалить содержание и ввести новую строку.

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. Как это может быть решено, чтобы быть более универсальным?

61
задан 28 September 2015 в 14:28

2 ответа

Я использовал то, что описал @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")
0
ответ дан 31 October 2019 в 14:55

Для тех, кто все еще использует 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
1
ответ дан 31 October 2019 в 14:55

Другие вопросы по тегам:

Похожие вопросы: