在 Selenium 中执行 findElement 时找不到元素
Element not found when executing findElement in 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 页面元素截图:http://prntscr.com/qvi6hc
这很奇怪,因为页面源与表单不同!
来自 <body>
标签的 PageSource,包含...
<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>
...表示 driven Browsing Context was detected as a BOT and the navigation was blocked due to presence of reCAPTCHA.
有不同的方法可以解决 captcha / recaptcha。您可以在以下位置找到一些相关讨论:
更新
从您现在的评论中可以清楚地看出您想要填写表格中的字段:
此时值得一提的是,由于以下任一原因,您被重定向到此页面:
- 您 EmailID / UserID 被 banned / blocked 从访问网站。
- 您 EmailID / UserID 被黑名单 禁止访问该站点。
因为您使用了 BOT 到 access/scrape 可能违反了 T&C 的网站。
解决方案
很难提出自动填写字段的解决方案,因为 BAN APPEAL REQUEST 页面中的元素可能受到 Invisible reCAPTCHA and you may have to Programmatically invoke the challenge[=18 的保护=]
正如其他人所建议的那样,RuneScape 的网站似乎检测到您正在使用机器人与他们的网站进行交互。你手动解决了验证码并不重要,因为他们仍然可以在没有验证码的情况下很容易地检测到自动行为(不,navigator.webdriver
标志不是他们检测到这一点的唯一方法)。
验证码旨在防止与他们的网站进行自动交互,这意味着他们不希望您使用 Selenium/WebDriver 与其进行交互。你应该尊重这一点,尤其是当你似乎希望你的帐户被解除封禁时(通过粘贴的片段和屏幕截图),所以试图做他们不想做的事情不会为你赢得任何好处。
我没时间解决你的问题。如果你想自己做,请在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()
暂时..
经过一些研究,你就会了解影子根。
希望我答对了..
试试这个功能,不行的话我稍后再帮你。祝你好运。
我正在尝试依次填写多个表格,因为我确保添加
,所以所有表格都可以快速填写且没有错误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 页面元素截图:http://prntscr.com/qvi6hc
这很奇怪,因为页面源与表单不同!
来自 <body>
标签的 PageSource,包含...
<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>
...表示
有不同的方法可以解决 captcha / recaptcha。您可以在以下位置找到一些相关讨论:
更新
从您现在的评论中可以清楚地看出您想要填写表格中的字段:
此时值得一提的是,由于以下任一原因,您被重定向到此页面:
- 您 EmailID / UserID 被 banned / blocked 从访问网站。
- 您 EmailID / UserID 被黑名单 禁止访问该站点。
因为您使用了 BOT 到 access/scrape 可能违反了 T&C 的网站。
解决方案
很难提出自动填写字段的解决方案,因为 BAN APPEAL REQUEST 页面中的元素可能受到 Invisible reCAPTCHA and you may have to Programmatically invoke the challenge[=18 的保护=]
正如其他人所建议的那样,RuneScape 的网站似乎检测到您正在使用机器人与他们的网站进行交互。你手动解决了验证码并不重要,因为他们仍然可以在没有验证码的情况下很容易地检测到自动行为(不,navigator.webdriver
标志不是他们检测到这一点的唯一方法)。
验证码旨在防止与他们的网站进行自动交互,这意味着他们不希望您使用 Selenium/WebDriver 与其进行交互。你应该尊重这一点,尤其是当你似乎希望你的帐户被解除封禁时(通过粘贴的片段和屏幕截图),所以试图做他们不想做的事情不会为你赢得任何好处。
我没时间解决你的问题。如果你想自己做,请在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()
暂时..
经过一些研究,你就会了解影子根。
希望我答对了..
试试这个功能,不行的话我稍后再帮你。祝你好运。