Я столкнулся с аналогичной проблемой при автоматизации одного из моих тестовых случаев при вводе предварительно отформатированного поля номера телефона. Вот что я сделал, чтобы скрипт мог вводить текст в текстовое поле:
- Проверьте вручную, принимает ли текстовое поле длину текста, который пытается ввести скрипт. Это никогда не повредит, чтобы проверить дважды :).
- Введите значение с помощью sendKeys и получите значение элемента из DOM.
- Хотя значение элемента текстового поля в DOM не равно тексту, который вы пытаетесь ввести, попробуйте еще раз.
- Убедитесь, что вы поставили условие выхода в цикл while, чтобы у вас был способ выйти из теста.
Ваша реализация может выглядеть примерно так:
Wait<WebDriver> fluent_wait = new FluentWait<WebDriver>(driver)
.withTimeout(60, SECONDS)
.pollingEvery(2, SECONDS)
.ignoring(NoSuchElementException.class);
WebElement emailElement= fluent_wait.until(new Function<WebDriver, WebElement>() {
public WebElement apply(WebDriver driver) {
return driver.findElement(By.id("businessemail"));
}
});
String emailText = "apollo33@mailinator.com";
long startTime = System.currentTimeMillis(); // This is to run the while loop for a specified amount of time and use it as an exit condition for the while loop.
//the below condition assumes that the text box sets some kind of attribute in the DOM element once the user enters the value in the text box.
while(!emailElement.getAttribute("value").equals(emailText)&&System.currentTimeMillis() - startTime) < 2000){
emailElement.clear();
emailElement.sendKeys(emailText);
}
//if the above doesn't work, add the below as a fall back:
if(!emailElement.getAttribute("value").equals(emailText)){
emailElement.clear();
for(char ch: emailText.toCharArray()){
emailElement.sendKeys(String.valueOf(ch));
try{
Thread.sleep(15); //making the thread sleep for 15 milliseconds, taking a performance hit to make the sendKeys work.
}catch(InterruptedException e){
}
}
}
Условие возврата с помощью Thread.sleep будет выполняться только в том случае, если циклу while не удалось установить текст в текстовом поле на 2 секунды. Вы можете увеличить время, если 2 секунды / 2000 мс недостаточно. Thread.sleep - это минимальное попадание в 15 мс между каждой итерацией символа. Мы включили это в нашу структуру, чтобы охватить различные текстовые поля, разработанные с использованием различных технологий переднего плана. Это хорошо работает для нас как организации, поэтому, надеюсь, это будет работать и для вас.
Ключ выше, чтобы не застрять с предопределенными утилитами, которые предоставляет selenium, вместо этого вы захотите поиграть со значениями DOM и опциями, которые предоставляет Java. Надеюсь, что вы сможете быстро найти решение вашей проблемы.
Удачи!