Я пытаюсь использовать 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 (кнопка отправки также отсутствует на исходной странице), если я не могу найти ни один из этих элементов?
РЕДАКТИРОВАТЬ:
В соответствии с просьбой, здесь более подробная картина того, что неправильно:
URL страницы, к которой обращается WebDriver, - http://www.ycharts.com, используя строку
driver.get("http://www.ycharts.com/login");
Если вы перейдете на эту страницу с помощью своего фактического веб-браузера, щелкните правой кнопкой мыши по строке поиска и выберите "Проверить элемент", вы увидите, что его идентификатор "searchBox", а его имя "q". Однако, если вы перейдете к тому же самому источнику страницы, вы увидите, что в HTML нет такого элемента. Понятно, поэтому WebDriver не может его найти.
driver
был инициирован следующим образом:
WebDriver driver = new HtmlUnitDriver();
Когда я пытаюсь что-то вроде
WebElement search = driver.findElement(By.id("searchBox"));'
Возвращаемое исключение:
Exception in thread "main" org.openqa.selenium.NoSuchElementException: Unable to locate element with ID: searchBox
Итак, вернемся к исходному вопросу: ясно, что элемент есть, но он не в HTML - как вы с ним взаимодействуете?
Проблема связана с тем, что окно поиска добавляется к загрузке страницы html с помощью javascript.
HTML, возвращаемый http://ycharts.com/, не содержит поисковый запрос, поэтому, когда Selenium считает, что страница завершила загрузку (т.е. состояние готовности DOM), нет окна поиска.
Чтобы взаимодействовать с полем поиска, вам нужно сказать Selenium, пока он не появится в DOM.
Самый простой способ добиться этого - с помощью WebDriverWait;
WebDriverWait wait = new WebDriverWait(webDriver, timeoutInSeconds);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id<locator>));