Java 在Selenium中执行findElement时未找到元素

Java 在Selenium中执行findElement时未找到元素,java,selenium,captcha,invisible-recaptcha,findelement,recaptcha,Java,Selenium,Captcha,Invisible Recaptcha,Findelement,Recaptcha,我正在尝试填写多个表格,每个表格后面都有,所有表格都会快速填写,没有错误,因为我确保添加 WebDriverWait wait = new WebDriverWait(driver, 20); wait.until(ExpectedConditions.elementToBeClickable(By.xpath(""))); 在新的页面上做任何事情之前,我知道我在正确的页面上 在最后一个表单中,我遇到了以下错误: Exception in thread "main" org.openqa.se

我正在尝试填写多个表格,每个表格后面都有,所有表格都会快速填写,没有错误,因为我确保添加

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); }

更新 以下是表单截图:

以下是执行结果:

代码:

结果:表格中有文本

代码:

结果:另一个页面:(

<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>
结果:与上一页相同..不同的页面

Firefox页面来源:

Firefox检查页面屏幕截图的元素:

这很奇怪,因为页面源与表单不同!

来自
标记的页面源,包含

<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>

错误:不支持的浏览器

我们不支持您的web浏览器。请在下面选择一个浏览器来使用受支持的web浏览器。


…意味着驱动浏览上下文被检测为BOT,并且导航被阻止,因为存在

有不同的解决方法。您可以在以下内容中找到一些相关的讨论:


更新 从您现在的评论可以清楚地看出,您希望填写表单中的字段:

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

  • 您的电子邮件ID被禁止访问该网站
  • 电子邮件ID/用户ID列入黑名单,无法访问该网站
由于您使用了机器人访问/刮取可能违反T&C的站点


解决方案
很难提出自动填充字段的解决方案,因为据推测,禁止上诉请求页面中的元素可能受到保护,并且您可能必须

正如其他人所建议的那样,RuneScape的网站似乎检测到您正在使用机器人与他们的网站进行交互。这无关紧要u手动解决了验证码问题,因为他们仍然可以在没有验证码的情况下很容易地检测到自动行为(不,
navigator.webdriver
标志不是他们检测自动行为的唯一方法)


验证码旨在防止自动与他们的站点交互,这意味着他们不希望您使用Selenium/WebDriver与之交互。您应该尊重这一点,尤其是因为您似乎希望您的帐户未绑定(查看粘贴的片段和屏幕截图),所以尝试做他们不想做的事不会给你带来任何好处。

我找不到时间来解决你的问题。如果你想自己做,请在谷歌上搜索“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()

现在

经过一些研究,你将了解阴影的根源

我希望我没弄错


试试这个功能,如果你不能,我以后会帮助你。祝你好运。

首先,你可能想提供URL,甚至是完整的页面源代码,这样我们可以查看一下。其次,请检查你的元素是否在iframe下。如果是这样,你必须将框架切换到该iframe才能找到你的元素。第三,如果它不在iframe下,你可以r xpath可能是问题所在。您应该使用相对xpath而不是完整xpath。@MinhDao感谢您的回复,我在页面源中添加了。我右键单击表单并单击查看页面源。这很奇怪,因为它与表单本身不同。嗯,您的网站已阻止您的浏览器,并返回错误消息:
error:不支持的浏览器
。在您的页面源代码中,检查第93行,它看起来与您的屏幕截图相同,但错误显示在第99行。老实说,我从未遇到过此错误。在我看来,您需要同时更新浏览器和驱动程序,并尝试其他浏览器以找到任何差异。希望这会有所帮助。浏览器是最新更新的e、 我用gecko驱动在Firefox上试过,用ChromeDriver79在Chrome上试过。在我进入该页面之前,我用2captcha的api解决了一个recaptcha。我怎么能这样做呢,因为我猜这是一个不可见的recaptcha?@DMMalkawi是的,它是不可见的captcha,使用sitekeyaha,我应该提交什么?解决captcha?我可以生成一个响应令牌。即使在我的普通浏览器上尝试..没有selenium,我单击“查看源代码..它显示不受支持browser@DMMalkawi我仍然不确定您是否正在尝试填充此字段中的字段,或者这是您尝试自动执行的操作的结果屏幕。我理解这一点,但我确实想这样做解决这个问题,它会给我这方面的知识
 String pagesource = driver.getPageSource();
        System.out.println(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>
public static WebElement expand_shadow_element(WebElement element)
    {
        WebElement shadow_root = (WebElement)((JavascriptExecutor)driver).executeScript("return arguments[0].shadowRoot", element);
        return shadow_root;
    }