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

17

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

    
задан Afamee 19.03.2009 в 17:54
источник
  • Вы имеете в виду автозаполнение как функцию AJAX, а не как встроенный браузер? –  guerda 20.03.2009 в 08:21

17 ответов

16

Команда типа может оказаться недостаточной для запуска автозаполнения. Предложения Дэйва Уэбба в других местах. Мое единственное дополнение было бы в том, что вам может понадобиться команда typeKeys , которая вызывает несколько разных событий JavaScript, которые могут быть с большей вероятностью запускать виджет автозаполнения.

    
ответ дан Patrick Lightbody 20.03.2009 в 02:22
источник
  • Хороший вопрос о типе и typeKeys. –  Dave Webb 20.03.2009 в 09:05
  • Используйте оба типа и typeKeys в этом порядке. –  chim 14.08.2013 в 12:25
8

Я бы сделал это следующим образом:

  • type , чтобы ввести значение в текстовое поле.
  • waitForTextPresent или verifyTextPresent для проверки содержимого автозаполнения.
  • click или mouseDown , чтобы щелкнуть элемент в списке автозаполнения.

Фокус в том, что окончательный click будет находиться в нужном месте. Вы должны иметь возможность использовать выражение XPath, которое ищет текст, который вы ожидаете найти.

    
ответ дан Dave Webb 19.03.2009 в 18:07
источник
6

Для 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();
    
ответ дан Prashanth Sams 16.05.2013 в 12:36
источник
  • Спасибо !!! :-) –  Laura Liparulo 13.03.2014 в 17:02
  • Большое спасибо! Thread.sleep - это то, что мне не хватало –  Laura Liparulo 13.03.2014 в 17:06
  • Где я могу найти локатор? –  Siddharth 26.11.2016 в 17:14
  • Как определяется локатор? –  Siddharth 06.12.2016 в 18:14
3

Я использовал следующую последовательность в IDE,

  1. typeKeys
  2. waitForTextPresent
  3. MouseOver
  4. clickAt

и хорошо работал

    
ответ дан Thiyagarajan Veluchamy 19.10.2011 в 09:15
источник
3
ответ дан Jason Buberel 11.07.2010 в 20:08
источник
  • вы герой, я следил за вашим сообщением в блоге, и он отлично работает, спасибо большое –  sameera207 15.01.2012 в 18:02
2

Ваш вопрос немного неоднозначен.

В большинстве браузеров хранится кеш значений, основанный на имени поля: это значение, которое предлагается в качестве автозаполнения браузером, даже если вы, возможно, никогда не посещали сайт раньше. Эта функция нестандартна для всех браузеров, и для селена не будет стандартного способа обнаружения / анализа этого. Вы все еще можете это сделать, но вам придется выполнять функции javascript, которые сами определяют значения. Затем вы можете использовать «eval» в selenium для выполнения этих функций. Я не видел никаких js-библиотек, которые могли бы рассказать вам эти значения кросс-браузерным способом.

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

    
ответ дан krosenvold 19.03.2009 в 18:00
источник
  • Я понимаю, почему мой вопрос может быть неоднозначным, но то, во что я ехал, находится во второй части вашего ответа. В моем случае у меня есть текстовое поле на основе ajax, которое предоставляет пользователю параметры, основанные на частично введенном значении. Можете ли вы использовать селен для захвата этих параметров и проверки ожидаемого значения в нем? –  Afamee 19.03.2009 в 18:07
1

Я обнаружил, что мне нужно сделать фокус в поле, прежде чем делать typeKeys , чтобы заставить его работать.

    
ответ дан johnnymire 26.10.2009 в 18:02
источник
  • это действительно настоящий ответ! –  Necronet 07.02.2011 в 23:41
1

Это может не работать для всех, но я просто добавил в метод, который позволил мне вводить символы с задержкой.

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, который содержит результирующий набор и метку значения - это значение, которое я хочу щелкнуть.

Опять же, это может не сработать для всех, но это сработало для меня, и я подумал, что разумно делиться.

    
ответ дан Zoidberg 20.02.2014 в 04:00
источник
0

Используйте типKeys вместо типа. Также используйте mouseDown вместо щелчка. Он отлично работает.

    
ответ дан Guru Padmanabhan 08.09.2009 в 07:22
источник
0

Ответ Patrick определенно важен, я также обнаружил, что фокус и mouseDown необходимы в последних версиях JQuery UI. Я записал видео с тестом, чтобы увидеть, как он работает в Sauce Labs: Ссылка

    
ответ дан Santi 10.01.2011 в 21:59
источник
0

У нас были некоторые проблемы с typeKeys. sendKeys кажется окончательным решением, но оно все еще экспериментально. Из справки:

  

Эта команда экспериментальна. Он может заменить команду typeKeys в будущем.

     

Для тех, кто интересуется деталями, в отличие от команды typeKeys, которая пытается запустить keyDown, события keyUp и keyPress, эта команда поддерживается атомами Selenium 2 и обеспечивает гораздо более надежную реализацию, которая будет поддерживаться в будущем.

    
ответ дан Kees van Dieren 24.05.2013 в 13:33
источник
0

В тексте справки для команды typeKeys говорится:

  

В некоторых случаях вам может потребоваться использовать команду «type», чтобы установить значение поля, а затем команду «typeKeys» для отправки событий нажатия клавиш, соответствующих тому, что вы только что набрали.

Поэтому используйте эту комбинацию

type(selector, text);
typeKeys(selector, text);

Кажется, что это хорошо работает.

    
ответ дан chim 14.08.2013 в 12:24
источник
0

Когда-то TypeKeys не работает. В это время вы можете использовать keyDown

щелкните поле ввода и введите значение и введите в поле значение.

    
ответ дан cyberoot 04.07.2014 в 09:24
источник
0

Мне удалось решить эту проблему, используя следующую функцию: Функция ниже принимает текст, который вы хотите выбрать в качестве параметра. Пример: если вы хотите выбрать «javascript», просто введите «java» в текстовое поле & amp; передать текст, который вы хотите выбрать, в этом конкретном случае это «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");
    }
}
    
ответ дан Raghu 08.10.2015 в 01:50
источник
0

Небольшая вариация с использованием ответа Прашанта:

    /**
 * 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();
}

Надеюсь, это поможет!

    
ответ дан MRodriguez08 06.10.2016 в 15:29
источник
0

Я использовал эти команды в Selenium IDE 2.9.1. Версия для автозаполнение текстового поля. sendKeys (локатор, значение) clickAt (локатор, CoordString) нажмите (локатор)

    
ответ дан Sofia 25.10.2016 в 15:58
источник
0

Здесь есть несколько ответов с кодом. Итак, я сделаю свой вклад.

Код, который я использую, чтобы выбрать элемент в компоненте автозаполнения из 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();
    
ответ дан Dherik 29.11.2017 в 16:39
источник