Как я могу последовательно удалить текст по умолчанию из элемента ввода с помощью 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);

Странно то, что вышесказанное работает только иногда. Иногда это заканчивается поиском «Введите идентификатор пользователя», в основном начиная вводить «имя пользователя» после текста по умолчанию — и даже не заканчивая это.

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

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

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

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

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

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


person mcole    schedule 28.06.2012    source источник
comment
Можете ли вы опубликовать копию HTML элемента управления, и есть ли какой-либо javascript, который взаимодействует с элементом управления?   -  person Arran    schedule 28.06.2012
comment
Текст по умолчанию в input исходит из атрибута placeholder HTML5 или это какой-то onfocus и onblur JavaScript?   -  person Petr Janeček    schedule 29.06.2012


Ответы (3)


Хорошо, сценарий, очевидно, срабатывает, когда метод 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 или Strings.repeat() может пригодиться)

  2. Лучше использовать Ctrl< /kbd>+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?

person Petr Janeček    schedule 01.07.2012
comment
Большое спасибо за идеи. Я попробовал 2, который работает в первый раз, но когда я возвращаюсь к поиску второго пользователя, удаляется только последний символ первого имени пользователя. Очень странно. В решении номер 4 кнопка «Найти», которую необходимо нажать для поиска, не активируется, поскольку не было событий щелчка или редактирования. Решение № 3 отлично работает для меня. Спасибо! - person mcole; 06.07.2012
comment
Хм. Я думал, что номер 2 был верной ставкой. В любом случае, я рад, что это помогло! - person Petr Janeček; 06.07.2012

Для чего это стоит У меня очень похожая проблема. WebDriver 2.28.0 и FireFox 18.0.1

Я также использую 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, возможно, это так.

person salk31    schedule 05.02.2013

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

person MasterJoe    schedule 15.08.2016