Подтвердить что ты не робот

Может ли селен обрабатывать автозаполнение?

У меня есть тестовый пример, который требует ввода частичного значения в текстовое поле, основанное на ajax, и проверка списка имеет ожидаемый контент. Если это так, выберите контент. Любая идея, как сделать эту работу?

4b9b3361

Ответ 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();

Ответ 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();