Как манипулировать панелью поиска, которой нет в источнике HTML, с помощью Selenium?

0

Я пытаюсь использовать Selenium (Java) для автоматизации некоторых поисков.

Когда я searchBox на страницу и нажимаю Inspect Element на панели поиска, я вижу, что у нее есть идентификатор searchBox и имя q, оба из которых потенциально полезны. Тем не менее, эти свойства нигде не найдены в HTML, когда я перехожу к View Source.

Когда я пытаюсь использовать

WebElement search = driver.findElement(By.id("searchBox"));

или

WebElement search = driver.findElement(By.name("q"));

оба возвращаются, так как не могут быть найдены.

Как я могу продолжить заполнение поля поиска, а затем нажать submit (кнопка отправки также отсутствует на исходной странице), если я не могу найти ни один из этих элементов?

РЕДАКТИРОВАТЬ:

В соответствии с просьбой, здесь более подробная картина того, что неправильно:

  1. URL страницы, к которой обращается WebDriver, - http://www.ycharts.com, используя строку

    driver.get("http://www.ycharts.com/login");
    

    Если вы перейдете на эту страницу с помощью своего фактического веб-браузера, щелкните правой кнопкой мыши по строке поиска и выберите "Проверить элемент", вы увидите, что его идентификатор "searchBox", а его имя "q". Однако, если вы перейдете к тому же самому источнику страницы, вы увидите, что в HTML нет такого элемента. Понятно, поэтому WebDriver не может его найти.

  2. driver был инициирован следующим образом:

    WebDriver driver = new HtmlUnitDriver();
    
  3. Когда я пытаюсь что-то вроде

    WebElement search = driver.findElement(By.id("searchBox"));'
    

    Возвращаемое исключение:

    Exception in thread "main" org.openqa.selenium.NoSuchElementException: Unable to locate element with ID: searchBox
    

Итак, вернемся к исходному вопросу: ясно, что элемент есть, но он не в HTML - как вы с ним взаимодействуете?

  • 0
    Пожалуйста, предоставьте реальный код, чтобы его было легче исследовать.
  • 0
    Извините за кажущуюся нехватку информации, но единственный актуальный код уже опубликован, так как не удалось найти идентификатор / имя. Что касается раздела HTML, так как они отсутствуют в источнике, я ничего не могу опубликовать.
Показать ещё 1 комментарий
Теги:
selenium
selenium-webdriver

1 ответ

2
Лучший ответ

Проблема связана с тем, что окно поиска добавляется к загрузке страницы html с помощью javascript.

HTML, возвращаемый http://ycharts.com/, не содержит поисковый запрос, поэтому, когда Selenium считает, что страница завершила загрузку (т.е. состояние готовности DOM), нет окна поиска.

Чтобы взаимодействовать с полем поиска, вам нужно сказать Selenium, пока он не появится в DOM.

Самый простой способ добиться этого - с помощью WebDriverWait;

WebDriverWait wait = new WebDriverWait(webDriver, timeoutInSeconds); 
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id<locator>));
  • 0
    Спасибо. Что касается ожидания, есть ли типичное количество времени, которое нужно ждать (то есть, что такое «timeoutInSeconds»)? Одну секунду? Пять секунд? Или просто продолжайте тестирование, пока какое-то количество не станет приемлемым?
  • 0
    Приведенный выше код будет ждать, пока элемент не станет видимым или не будет достигнут тайм-аут InSeconds, в зависимости от того, что произойдет раньше. Если вам придется подождать пять секунд, я бы поднял ошибку на сайте!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню