У меня есть тестовый пример, который требует ввода частичного значения в текстовое поле, основанное на ajax, и проверка списка имеет ожидаемый контент. Если это так, выберите контент. Любая идея, как сделать эту работу?
Может ли селен обрабатывать автозаполнение?
Ответ 1
Команда типа может оказаться недостаточной для запуска автозаполнения. Предложения Дэйва Уэбба в других местах. Мое единственное дополнение было бы в том, что вам может понадобиться команда typeKeys, которая вызывает несколько разных событий JavaScript, которые могут быть с большей вероятностью запускать виджет автозаполнения.
Ответ 2
Я бы сделал это следующим образом:
-
type
, чтобы ввести значение в текстовое поле. -
waitForTextPresent
илиverifyTextPresent
, чтобы проверить содержимое автозаполнения -
click
илиmouseDown
, чтобы щелкнуть элемент в списке автозаполнения
Трюк будет делать окончательный click
как раз в нужном месте. Вы должны иметь возможность использовать выражение XPath, которое ищет текст, который вы ожидаете найти.
Ответ 3
Для WebDriver попробуйте
Ниже приведен код для автоматического поиска текста с помощью автоматического предложения; в основном для элемента списка.
driver.findElement(By.id("your searchBox")).sendKeys("your partial keyword");
Thread.sleep(3000);
List <WebElement> listItems = driver.findElements(By.xpath("your list item locator"));
listItems.get(0).click();
driver.findElement(By.id("your searchButton")).click();
Ответ 4
Недавно я написал HOWTO по этой теме - с помощью Selenium для тестирования автозаполнения JQuery, управляемого AJAX:
Ответ 5
Я использовал следующую последовательность в IDE,
- typeKeys
- waitForTextPresent
- MouseOver
- clickAt
и хорошо работал
Ответ 6
Ваш вопрос немного неоднозначен.
В большинстве браузеров хранится кеш значений, основанный на имени поля: это значение, которое предлагается в качестве автозаполнения браузером, даже если вы, возможно, никогда не посещали сайт раньше. Эта функция нестандартна для всех браузеров, и для селена не будет стандартного способа обнаружения/анализа этого. Вы все еще можете это сделать, но вам придется выполнять функции javascript, которые сами определяют значения. Затем вы можете использовать "eval" в selenium для выполнения этих функций. Я не видел никаких js-библиотек, которые могли бы рассказать вам эти значения кросс-браузерным способом.
Другой альтернативой является то, что вы используете ajax для отправки на стороне сервера частично введенного значения. В этом случае это просто вопрос ввода значений в текстовое поле и утверждение, что ожидаемые значения появятся. Обычно предложения автозаполнения отображаются на некотором уровне на стороне клиента.
Ответ 7
Я обнаружил, что мне нужно сделать фокус в поле, прежде чем делать typeKeys, чтобы заставить его работать.
Ответ 8
Это может не работать для всех, но я просто добавил в метод, который позволил мне вводить символы с задержкой.
Actions builder = new Actions(this.webDriver);
WebElement element = this.getWebElement();
for (char c : value.toCharArray()) {
builder = builder.sendKeys(element, c + "");
builder.pause(100);
}
builder.build().perform();
Затем я нашел элемент, который я хотел щелкнуть (
resultsElement.findElement(By.xpath("//li[.='" + valueLabel + "']"))
Где контейнер - это результат. Элемент - это элемент WebElement, который содержит результирующий набор и метку значения - это значение, которое я хочу щелкнуть.
Опять же, это может не сработать для всех, но это сработало для меня, и я подумал, что разумно делиться.
Ответ 9
Используйте типKeys вместо типа. Также используйте mouseDown вместо щелчка. Он отлично работает.
Ответ 10
Ответ Patrick определенно важен, я также обнаружил, что фокус и mouseDown необходимы в последних версиях JQuery UI. Я записал видео с тестом, чтобы увидеть, как он работает в Sauce Labs: https://saucelabs.com/jobs/ad8c561be39bb7a42c9bb3a063214c95
Ответ 11
У нас были некоторые проблемы с typeKeys. sendKeys кажется окончательным решением, но оно все еще экспериментально. Из справки:
Эта команда экспериментальна. Он может заменить команду typeKeys в будущем.
Для тех, кто интересуется деталями, в отличие от команды typeKeys, которая пытается запустить keyDown, события keyUp и keyPress, эта команда поддерживается атомами Selenium 2 и обеспечивает гораздо более надежную реализацию, которая будет поддерживаться в будущем.
Ответ 12
В тексте справки для команды typeKeys говорится:
В некоторых случаях вам может потребоваться использовать команду "type", чтобы установить значение поля, а затем команду "typeKeys" для отправки событий нажатия клавиш, соответствующих тому, что вы только что набрали.
Поэтому используйте эту комбинацию
type(selector, text);
typeKeys(selector, text);
Кажется, что это хорошо работает.
Ответ 13
Когда-то TypeKeys не работает. В это время вы можете использовать keyDown
щелкните поле ввода и введите значение и введите в поле значение.
Ответ 14
Мне удалось решить эту проблему, используя следующую функцию: Функция ниже принимает текст, который вы хотите выбрать в качестве параметра. Пример: если вы хотите выбрать "javascript", просто введите "java" в текстовое поле и передайте текст, который вы хотите выбрать, в этом конкретном случае это "javascript".
public void selectOptionWithText(String textToSelect) {
try {
//Add the below sleep if necessary
// Thread.sleep(1000);
WebElement autoOptions = driver.findElement(By.className("autocomplete"));
List<WebElement> optionsToSelect = autoOptions().findElements(By.tagName("div"));
for (WebElement option : optionsToSelect) {
if (option.getText().equals(textToSelect)) {
System.out.println("Trying to select: " + textToSelect);
option.click();
break;
}
}
}
catch(Exception e){
System.out.println("Error");
}
}
Ответ 15
Небольшая вариация с использованием ответа Прашанта:
/**
* Selects the element at position idx from the autocomplete combo, considering the partialKeyword
* @param driver
* @param element
* @param partialKeyword
* @param idx
* @throws InterruptedException
*/
public static void selectAutoCompleteValue(WebDriver driver, WebElement element, String partialKeyword, Integer idx) throws InterruptedException{
element.sendKeys(partialKeyword);
Thread.sleep(1000);
List <WebElement> listItems = driver.findElements(By.cssSelector(".ui-autocomplete-item.ui-autocomplete-list-item"));
listItems.get(idx).click();
}
Надеюсь, это поможет!
Ответ 16
Я использовал эти команды в Selenium IDE 2.9.1. Версия для автозаполнение текстового поля. sendKeys (локатор, значение) clickAt (локатор, CoordString) нажмите (локатор)
Ответ 17
Здесь есть несколько ответов с кодом. Итак, я сделаю свой вклад.
Код, который я использую, чтобы выбрать элемент в компоненте автозаполнения из PrimeFaces 2.2:
driver.findElement(By.id(codigoBanco_input)).sendKeys("text");
waitForElementLocated(By.cssSelector(listItensSelector), 5);
List<WebElement> listItems = driver.findElements(By.cssSelector(listItensSelector));
Actions builder = new Actions(driver);
builder.moveToElement(listItems.get(0)).build().perform();
WebDriverWait wait = new WebDriverWait(driver, 5);
wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector(itemSelector)));
driver.findElement(By.cssSelector(itemSelector)).click();