Элемент не найден при выполнении findElement в Selenium
Я пытаюсь заполнить несколько форм, которые идут друг за другом, все формы заполняются быстро, без ошибок, потому что я обязательно добавляю
WebDriverWait wait = new WebDriverWait(driver, 20);
wait.until(ExpectedConditions.elementToBeClickable(By.xpath("")));
прежде чем делать что-либо на новой странице, и я знаю, что нахожусь на правильной странице.
В последней форме я обнаружил такую ошибку:
Exception in thread "main" org.openqa.selenium.NoSuchElementException: Unable to locate element: //*[@id="formtovalidate"]/fieldset[1]/div/label/input For documentation on this error, please visit: https://www.seleniumhq.org/exceptions/no_such_element.html
Итак, я пошел проверить браузер, сделав снимок экрана, и браузер находится на правильной странице с правильной формой, я также проверил значения xpath и даже попробовал другие атрибуты... похоже, ничего не работает.
Итак, я распечатал PageSource, который показывал совершенно другую страницу (не предыдущую), я также заметил, что эта страница мигала на секунду перед появлением окончательной формы.
Я тоже пробовал driver.navigate().refresh()
но это не сработало. Я все искал и искал, но ничего не появлялось. Еще я сменил браузеры, ничего не сделало..
Это метод, который я пытаюсь выполнить:
private void method() {
WebDriverWait wait = new WebDriverWait(driver, 20);
wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//*[@id=\"formtovalidate\"]/fieldset[1]/div/label/input")));
driver.findElement(By.xpath("//*[@id=\"formtovalidate\"]/fieldset[1]/div/label/input")).sendKeys(email); }
Обновить
Вот скриншот формы:
Вот результаты выполнения:
Код:
String body_text = driver.findElement(By.tagName("body")).getText();
System.out.println(body_text);
Результат: форма, но в тексте
Код:
String body_innerHTML = driver.findElement(By.tagName("body")).getAttribute("innerHTML");
System.out.println(body_innerHTML);
Результат: Другая страница:(
<zendesk-ticketing-form base-url="https://www.runescape.com/a=870/c=K0aO9WO69EI" css-cachebust="129" sitekey="6Lcsv3oUAAAAAGFhlKrkRb029OHio098bbeyi_Hv" grecaptcha="" has-valid-session="true" weblogin-url="https://secure.runescape.com/m=weblogin/a=870/c=K0aO9WO69EI/loginform?mod=www&ssl=1&dest=zendesk/support-form?form=360000065898">
<div class="x-display-none ie-error-display" data-js-ie-error="">
<section class="c-article">
<div class="c-article__content">
<h1>Error: Unsupported Browser</h1>
<p>
We do not support your web browser. Please use a supported web browser by choosing one below.
<br>
<a href="https://www.mozilla.org/firefox/" target="_blank" rel="noopener">FireFox</a>
<br>
<a href="https://www.google.com/chrome/" target="_blank" rel="noopener">Chrome</a>
</p>
</div>
</section>
</div>
Код:
String pagesource = driver.getPageSource();
System.out.println(pagesource);
Результат: То же, что и предыдущий.. другая страница..
Источник страницы Firefox: https://pastebin.com/Kv15V2SK
Firefox Inspect Element на скриншоте страницы: http://prntscr.com/qvi6hc
Это странно, так как исходный код страницы отличается от формы!
3 ответа
У меня не было времени решить твою проблему. Если вы хотите сделать это самостоятельно, поищите это в Google, "Shadow Root, Selenium", у меня раньше была такая ошибка. Я знаю, что вы не можете напрямую связаться с элементом, который находится внутри теневого корня. Вот почему вы не получаете исходный код внутри него.
Что вам нужно сделать, так это шаг за шагом пройти элемент:
Вы должны расширить теневой корень,
Вот функция расширения теневого корня:
public static WebElement expand_shadow_element(WebElement element)
{
WebElement shadow_root = (WebElement)((JavascriptExecutor)driver).executeScript("return arguments[0].shadowRoot", element);
return shadow_root;
}
Вы можете представить эту функцию как
.switchTo.frame()
теперь..
После некоторых исследований вы поймете корень тени.
Надеюсь, я правильно понял проблему..
Попробуйте эту функцию, если не можете, я помогу вам позже. Удачи.
Исходный текст из<body>
тег, содержащий...
<zendesk-ticketing-form base-url="https://www.runescape.com/a=870/c=K0aO9WO69EI" css-cachebust="129" sitekey="6Lcsv3oUAAAAAGFhlKrkRb029OHio098bbeyi_Hv" grecaptcha="" has-valid-session="true" weblogin-url="https://secure.runescape.com/m=weblogin/a=870/c=K0aO9WO69EI/loginform?mod=www&ssl=1&dest=zendesk/support-form?form=360000065898">
<div class="x-display-none ie-error-display" data-js-ie-error="">
<section class="c-article">
<div class="c-article__content">
<h1>Error: Unsupported Browser</h1>
<p>
We do not support your web browser. Please use a supported web browser by choosing one below.
<br>
<a href="https://www.mozilla.org/firefox/" target="_blank" rel="noopener">FireFox</a>
<br>
<a href="https://www.google.com/chrome/" target="_blank" rel="noopener">Chrome</a>
</p>
</div>
</section>
</div>
... означает, что управляемый WebDriverконтекст просмотра был обнаружен как BOT, а навигация была заблокирована из-за наличия reCAPTCHA.
Есть разные подходы к решению капчи / рекапчи. Вы можете найти пару соответствующих обсуждений в:
- Как обойти Google Captcha с помощью Selenium
- Selenium webdriver: изменение флага navigator.webdriver для предотвращения обнаружения селена
Обновить
Из ваших комментариев теперь ясно, что вы хотите заполнить поля в форме:
Здесь стоит упомянуть, что вы были перенаправлены на эту страницу по одной из следующих причин:
- Вы EMAILID / Идентификатор_пользователь будет запрещен / заблокирован доступ к сайту.
- Вы EMAILID / Идентификатор_пользователь является черным списком от доступа к сайту.
Поскольку вы использовали BOT для доступа / очистки сайта, который мог нарушить Условия.
Решение
Было бы трудно предложить решение для автоматического fillup полей как предположительно элементов в REQUEST АПЕЛЛЯЦИОННОГО BAN страницы могут быть защищены невидимом рекапчи, и вы, возможно, придется программного вызова на вызов
Как предполагали другие, похоже, что веб-сайт RuneScape обнаружил, что вы используете бота для взаимодействия с их сайтом. Неважно, что вы решили капчу вручную, так как они могут легко обнаружить автоматизированное поведение и без нее (и нет,navigator.webdriver
flag - не единственный способ обнаружить это).
Капча предназначена для предотвращения автоматического взаимодействия с их сайтом, что означает, что они не хотят, чтобы вы использовали Selenium/WebDriver для взаимодействия с ним. Вы должны уважать это, тем более что кажется, что вы хотите, чтобы ваша учетная запись была разблокирована (исходя из вставленных фрагментов и снимков экрана), поэтому попытки делать именно то, что они не хотят, не принесут вам никакой пользы.