Как я могу последовательно удалить текст по умолчанию из элемента ввода с помощью Selenium?

Я пытаюсь использовать Selenium WebDriver для ввода текста в элемент ввода GWT, который имеет текст по умолчанию, "введите идентификатор пользователя". Вот несколько способов, которыми я пытался заставить это работать:

        searchField.click();
        if(!searchField.getAttribute("value").isEmpty()) {
            // clear field, if not already empty 
            searchField.clear();
        }
        if(!searchField.getAttribute("value").isEmpty()) {
            // if it still didn't clear, click away and click back
            externalLinksHeader.click();
            searchField.click();
        }

        searchField.sendKeys(username);

странное дело, как это работает только некоторое время. Иногда это заканчивается поиском "Enter User IDus", в основном начиная вводить" username " после текста по умолчанию-и даже не заканчивая этим.

любые другие лучшие, более надежные способы очистки по умолчанию текст из элемента GWT?

редактировать, чтобы добавить: HTML элемента ввода. К сожалению, там не так много, чтобы увидеть, благодаря горячей JS/GWT. Вот поле, когда оно не выбрано:

<input type="text" class="gwt-TextBox empty" maxlength="40">

после того, как я щелкнул его и дал ему фокус вручную, текст по умолчанию и "пустой" класс удаляются.

JS to setDefaultText() вызывается как onBlur() и onChange() если изменение приводит к пустому текстовому полю. Угадайте, почему searchField.clear() не помогает.

Я также прошел через этот метод в режиме отладки, и в этом случае он никогда не работает. Когда он работает нормально, он работает большую часть времени. Не могу сказать почему.

4 ответов


хорошо, сценарий, очевидно, срабатывает, когда clear() метод очищает input и оставляет его пустым. Решения, которые она предложила, приведены ниже.

  1. наивного один, прессы Backspace 10 раз:

    String b = Keys.BACK_SPACE.toString();
    searchField.sendKeys(b+b+b+b+b+b+b+b+b+b + username);
    

    (StringUtils.repeat() из Apache Commons Lang или Google Guava's Strings.repeat() может пригодится)

  2. более приятное использование Ctrl+A, удалить:

    String del = Keys.chord(Keys.CONTROL, "a") + Keys.DELETE; 
    searchField.sendKeys(del + username);
    
  3. удалить контент input через JavaScript:

    JavascriptExecutor js = (JavascriptExecutor)driver;
    js.executeScript("arguments[0].value = '';", searchField);
    searchField.sendKeys(username);
    
  4. Параметр Значение input через JavaScript в целом:

    JavascriptExecutor js = (JavascriptExecutor)driver;
    js.executeScript("arguments[0].value = '" + username + "';", searchField);
    

обратите внимание, что javascript не всегда может работать, как показано здесь:почему я не могу очистить поле ввода с помощью JavaScript?


для чего это стоит, у меня очень похожая проблема. С WebDriver 2.28.0 и 18.0.1 Firefox и

Я также использую GWT, но могу воспроизвести его с помощью простого HTML / JS:

<html>
<body>
<div>
<h3>Box one</h3>
<input id="boxOne" type="text" onfocus="if (this.value == 'foo') this.value = '';" onblur="if (this.value == '') this.value = 'foo';"/>
</div>
<div>
<h3>Box two</h3>
<input id="boxTwo" type="text" />
</div>
</body>
</html>

этот тест терпит неудачу большую часть времени:

@Test
public void testTextFocusBlurDirect() throws Exception {
  FirefoxDriver driver = new FirefoxDriver();

  driver.navigate().to(getClass().getResource("/TestTextFocusBlur.html"));

  for (int i = 0; i < 200; i++) {
      String magic = "test" + System.currentTimeMillis();
      driver.findElementById("boxOne").clear();
      Thread.sleep(100);
      driver.findElementById("boxOne").sendKeys(magic);
      Thread.sleep(100);
      driver.findElementById("boxTwo").clear();
      Thread.sleep(100);
      driver.findElementById("boxTwo").sendKeys("" + i);
      Thread.sleep(100);
      assertEquals(magic, driver.findElementById("boxOne").getAttribute("value"));
  }

  driver.quit();
}

это может быть просто ОС, отвлекающая внимание от браузера таким образом, что WebDriver не может контролировать. Мы, похоже, не получаем эту проблему на сервере CI, возможно, это так.


Я не могу добавить комментарий, поэтому я ставлю его в качестве ответа здесь. Я хочу сообщить вам, что если вы хотите использовать только javascript для очистки и / или редактирования входного текстового поля, то подход javascript, данный @slanec не будет работать. Вот пример: почему я не могу очистить поле ввода с помощью JavaScript?


In case you use c# then solution would be :

// provide some text
webElement.SendKeys("aa");
// this is how you use this in C# , VS
String b = Keys.Backspace.ToString();

// then provide back space few times 
webElement.SendKeys(b + b + b + b + b + b + b + b + b + b);