【问题标题】:Element not found when executing findElement in Selenium在 Selenium 中执行 findElement 时找不到元素
【发布时间】:2020-01-31 01:50:57
【问题描述】:

我正在尝试填写多个表单,所有表单都可以快速填写,没有错误,因为我确保添加

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

结果:与上一个相同..不同的页面..

火狐页面来源:https://pastebin.com/Kv15V2SK

Firefox Inspect Element 页面截图:http://prntscr.com/qvi6hc

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

【问题讨论】:

  • 首先,您可能需要提供 URL,甚至是整页源代码,以便我们查看。其次,请检查您的元素是否在 iframe 下。如果是这样,您必须将您的框架切换到该 iframe 才能找到您的元素。第三,如果它不在 iframe 下,则您的 xpath 可能是问题所在。您应该使用相对 xpath 而不是完整 xpath。
  • @MinhDao 谢谢你的回复,我已经在页面源代码中添加了..我右键单击表单并单击查看页面源..它很奇怪,因为它与表单本身不同..
  • 好吧,您的网站已阻止您的浏览器,并返回错误消息:Error: Unsupported Browser。在您的页面源代码中,检查第 93 行,它与您的屏幕截图看起来相同,但错误显示在第 99 行。
  • 老实说,我从来没有遇到过这个错误。在我看来,您需要更新您的浏览器和驱动程序,并尝试其他浏览器以发现任何差异。希望这会有所帮助。
  • 浏览器是最新更新的,我在 Firefox 上使用 gecko 驱动程序并在 Chrome 上使用 chromedriver79 进行了尝试

标签: java selenium captcha invisible-recaptcha findelement


【解决方案1】:

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

暂时……

研究一下你就会明白影子根了。

我希望我的问题是正确的..

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

【讨论】:

    【解决方案2】:

    来自&lt;body&gt; 标签的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>
    

    ...暗示WebDriver 驱动的浏览上下文 被检测为BOT,并且由于reCAPTCHA 的存在而阻止导航。

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


    更新

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

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

    • 您的 EmailID / UserID禁止 / 阻止访问该网站。
    • 您的 EmailID / UserID列入黑名单,无法访问该网站。

    由于您使用 BOT 访问/抓取可能违反 T&C 的网站。


    解决方案

    很难提出一个自动填充字段的解决方案,因为大概 BAN APPEAL REQUEST 页面中的元素可能受Invisible reCAPTCHA 保护,而您可能必须Programmatically invoke the challenge p>

    【讨论】:

    • 在我进入该页面之前,我使用 2captcha 的 api 解决了一个 recaptcha。我怎么能这样做,因为我猜它是一个不可见的 recaptcha?
    • @DMMalkawi 是的,它是 invisible captcha,使用 sitekey
    • 啊哈,我应该提交什么?解决验证码?我可以生成一个响应令牌。
    • 即使我在我的普通浏览器上尝试..没有硒并且我点击查看源..它显示不支持的浏览器
    • @DMMalkawi 我仍然不确定您是否尝试填写此 form 中的字段内的字段,或者它是您尝试自动化操作的结果屏幕。
    【解决方案3】:

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

    验证码旨在防止与他们的网站进行自动交互,这意味着他们不希望您使用 Selenium/WebDriver 与之交互。您应该尊重这一点,尤其是因为您似乎希望取消禁止您的帐户(通过粘贴的 sn-ps 和屏幕截图),因此尝试完全按照他们不想要的方式去做不会为您赢得任何好处。

    【讨论】:

    • 我明白这一点,但我真的很想解决这个问题。它会给我这个领域的知识。
    • 究竟解决什么问题?如果是验证码,你就做不到,因为有一些大型且非常有能力的公司正在开发这项技术。例如谷歌,他们对它非常有信心,以至于他们对任何能够击败它的人都提供了非常丰厚的奖励。如果它是自动化 RuneScape 的网站,那么他们的网站不是你的游乐场。如果你想练习,你可以自己制作一个简单的网站来练习并在本地托管它(无需支付实际服务器的费用),现在这实际上很容易。这将为您提供更多该领域的经验。
    • 我已经使用 2captcha api 解决了前 2 个验证码.. 但是这个页面.. 我需要它的页面源是可见的
    • 我说错了。我不应该只是说验证码。您通过的是非常旧版本的验证码。你不会通过的是自动行为检测。即使可以,您仍然会滥用他们的网站。就像我说的,这不是你的游乐场。通过制作自己的网站、在本地托管并为此编写自动化脚本,您将在该领域获得更好的体验。如果您想要最好的体验,请为您的约会网站定义自己的接受标准,并为其编写自动化测试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-21
    • 2015-12-30
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    相关资源
    最近更新 更多