Я пытаюсь использовать 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() не помогает.
Я также использовал этот метод в режиме отладки, и в этом случае он никогда не работает. При нормальном запуске он работает большую часть времени. Я не могу сказать, почему.
Ответ 1 · рейтинг 22 · Petr Janeček
Хорошо, сценарий, очевидно, срабатывает, когда метод clear() очищает input и оставляет его пустым. Решения, которые он придумал, приведены ниже.
Наивный, нажимает 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() может пригодиться)
Лучше использовать Ctrl+A, Удалить:
String del = Keys.chord(Keys.CONTROL, "a") + Keys.DELETE;
searchField.sendKeys(del + username);
Удаление содержимого input через JavaScript:
JavascriptExecutor js = (JavascriptExecutor)driver;
js.executeScript("arguments[0].value = '';", searchField);
searchField.sendKeys(username);
Установка значения input с помощью JavaScript:
JavascriptExecutor js = (JavascriptExecutor)driver;
js.executeScript("arguments[0].value = '" + username + "';", searchField);
Обратите внимание, что javascript может работать не всегда, как показано здесь: Почему может не очистить ли поле ввода с помощью javascript?
Ответ 2 · salk31
Для чего это стоит У меня очень похожая проблема. 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, возможно, это так.