【问题标题】:Selenium can't locate ANY elementSelenium 找不到任何元素
【发布时间】:2021-12-22 16:12:42
【问题描述】:

所以我有一个网络爬虫,首先需要通过给定网站的 cookie 横幅。通常我只是通过 id 或 classname 定位元素并完成它,但在this site 上找不到任何元素。我已经尝试/检查了以下内容:

  • 感兴趣的元素是<div id="cookiescript_accept" tabindex="0" role="button" data-cs-i18n-text="[]">Alles accepteren</div>
  • 元素不是 iframe 的一部分
  • 该元素不是影子 DOM 的一部分
  • 使用 wait.until(ExpectedConditions.visibilityOfElementLocated 会达到 15 秒超时
  • 使用driver.executeScript("return document.getElementById('cookiescript_accept');"); 也不起作用
  • 父元素和parent的父元素也找不到

我对 Selenium 和 HTML 还很陌生,所以我一定遗漏了一些东西,如果你知道那是什么,请告诉我

代码:

public void loadUrl(String url) {
    System.out.println("\t\t- loadUrl " + url);
    idle5000();

    driver.get(url);
    idle5000();

    setWindowSize();
    idle5000();
    printFirefoxCPU();

    scrollViewport();
    idle5000();
    printFirefoxCPU();
}
loadUrl("https://www.schoolplaten.com/");
prepRunnable.getDriver().findElement(By.id("cc-cookiescript_accept")).click();
//  -> NoSuchElementException
WebDriverWait wait = new WebDriverWait(prepRunnable.getDriver(), 15);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("cookiescript_accept")));
//  -> Timeout
WebElement elem = (WebElement) prepRunnable.getDriver().executeScript("return document.getElementById('cookiescript_accept');");
elem.click();
//  -> elem is null

【问题讨论】:

  • 显示使用你的代码。
  • 在您的代码执行时元素是否已呈现在屏幕上?如果没有,您应该在找到元素之前等待,或者尝试经典的 sleep 10 秒并查看结果?

标签: java html selenium


【解决方案1】:

我可以使用下面的 XPath 找到 Web 元素

//*[name()='div' and @id='cookiescript_accept']

并且可以在下面的代码的帮助下执行点击它:

WebDriverWait wait = new WebDriverWait(driver, 30);
wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//*[name()='div' and @id='cookiescript_accept']"))).click();

【讨论】:

  • 对我来说,这段代码与所有其他 wait.until 尝试有同样的问题,它达到了超时,然后仍然找不到元素
  • 难以置信,我使用了准确的代码,它就像一个魅力!你必须使用这个 xpath //*[name()='div' and @id='cookiescript_accept']
  • loadUrl("https://www.schoolplaten.com/"); WebDriverWait wait = new WebDriverWait(driver, 30); wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//*[name()='div' and @id='cookiescript_accept']"))).click(); 这就是我正在运行的内容
  • 抛出了什么错误?
  • TimeoutException: Expected condition failed: waiting for element to be clickable: By.xpath: //*[name()='div' and @id='cookiescript_accept'] (tried for 30 second(s) with 500 milliseconds interval) 之后:NoSuchElementException: Unable to locate element: //*[name()='div' and @id='cookiescript_accept'
【解决方案2】:

对于元素 ALLES ACCEPTEREN 上的 click(),您可以使用以下任一 Locator Strategies

  • cssSelector:

    driver.findElement(By.cssSelector("div#cookiescript_accept")).click();
    
  • xpath:

    driver.findElement(By.xpath("//div[@id='cookiescript_accept']")).click();
    

但是,元素是动态元素,所以要在元素上click() 需要诱导WebDriverWaitelementToBeClickable() 并且可以使用以下Locator Strategies 之一:

  • cssSelector:

    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.cssSelector("div#cookiescript_accept"))).click();
    
  • xpath:

    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//div[@id='cookiescript_accept']"))).click();
    

另类

您也可以使用executeScript(),如下所示:

  • cssSelector:

    ((JavascriptExecutor)driver).executeScript("arguments[0].click();", new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.cssSelector("div#cookiescript_accept"))));
    
  • xpath:

    ((JavascriptExecutor)driver).executeScript("arguments[0].click();", new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//div[@id='cookiescript_accept']"))));
    

参考

你可以在NoSuchElementException找到详细讨论:

【讨论】:

  • 不幸的是,等到可点击达到 20 秒超时,然后再次找不到该元素
  • 你检查了 xpathcss 吗?
  • 是的,我做了,都无济于事
  • 查看更新的答案并让我知道状态
  • 替代方案产生相同的错误:s
猜你喜欢
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
  • 2019-01-02
  • 2021-03-14
  • 1970-01-01
相关资源
最近更新 更多