sendKeys () не вставляет полное значение с помощью WebDriverWait через Selenium и Java - PullRequest
0 голосов
/ 04 апреля 2019

sendKeys () не вставляет полную строку в текстовое поле. Я пытался вставить идентификатор электронной почты.

String name = "New Apollo33";
fluent_wait.until(ExpectedConditions.presenceOfElementLocated(By.id("businessname"))).sendKeys(name);

String email = "apollo33@mailinator.com";
fluent_wait.until(ExpectedConditions.presenceOfElementLocated(By.id("businessemail"))).sendKeys(email);

Он вставляет имя, но не полностью вставляет идентификатор электронной почты.

Ответы [ 3 ]

0 голосов
/ 05 апреля 2019

Я столкнулся с аналогичной проблемой при автоматизации одного из моих тестовых случаев при вводе предварительно отформатированного поля номера телефона. Вот что я сделал, чтобы скрипт мог вводить текст в текстовое поле:

  • Проверьте вручную, принимает ли текстовое поле длину текста, который пытается ввести скрипт. Это никогда не повредит, чтобы проверить дважды :).
  • Введите значение с помощью 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. Надеюсь, что вы сможете быстро найти решение вашей проблемы. Удачи!

0 голосов
/ 05 апреля 2019

Как правило thumb при попытке отправить последовательность символов вместо вызова presenceOfElementLocated() всегда вызывайте elementToBeClickable(), и вы можете использовать следующее решение :

fluent_wait.until(ExpectedConditions.elementToBeClickable(By.id("businessname"))).sendKeys("New Apollo33");
fluent_wait.until(ExpectedConditions.elementToBeClickable(By.id("businessemail"))).sendKeys("apollo33@mailinator.com");
0 голосов
/ 04 апреля 2019

Я часто нахожу, что sendKeys () движется слишком быстро или вводит неполные строки.Вам нужно будет обернуть это в цикл while с очень небольшой задержкой:

while(element.text != input) {
    element.sendKeys(Keys.chord(Keys.CONTROL, "a"), input); //or whatever
    Thread.sleep(100) //100ms not 100sec
}

Я знаю, что thread.sleep сильно недоволен, однако waitFor () займет столько же времени, сколько и

element.clear()

также работает, но используйте ввод clear () или Ctrl + a +, так как использование обоих избыточно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...