在 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&amp;ssl=1&amp;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&amp;ssl=1&amp;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.

有不同的方法可以解决 / 。您可以在以下位置找到一些相关讨论:


更新

从您现在的评论中可以清楚地看出您想要填写表格中的字段:

此时值得一提的是,由于以下任一原因,您被重定向到此页面:

  • EmailID / UserIDbanned / 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()

暂时..

经过一些研究,你就会了解影子根。

希望我答对了..

试试这个功能,不行的话我稍后再帮你。祝你好运。