java - Selenium 找不到任何元素
问题描述
所以我有一个网络爬虫,首先需要通过给定网站的 cookie 横幅。通常我只是通过 id 或 classname 定位元素并完成它,但是在这个站点上没有一个元素可以被定位。我已经尝试/检查了以下内容:
- 感兴趣的元素是
<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
解决方案
要click()
在元素上,ALLES ACCEPTEREN您可以使用以下任一Locator Strategies:
cssSelector
:driver.findElement(By.cssSelector("div#cookiescript_accept")).click();
xpath
:driver.findElement(By.xpath("//div[@id='cookiescript_accept']")).click();
但是,该元素是一个动态元素,因此click()
您需要在该元素上诱导WebDriverWait并且elementToBeClickable()
您可以使用以下任一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']"))));
参考
推荐阅读
- git - Android Studio Git 推送到 bitbucket 被拒绝
- ios - 简单英语的 iOS 电源状态
- python - 修改pandas MultiIndex DataFrame中每组的最后一行
- haskell - Haskell/GHC - Haskell 有没有办法只返回 16 位小数?
- amazon-ec2 - 食谱与手动设置 statsD/metric 收集服务器?
- database - 颤振搜索用户名是否存在
- javascript - React JS 和 CSS,向上滚动数据库中的所有文本评论
- batch-file - 在不关闭 explorer.exe 的情况下刷新图标缓存
- python - 我将如何创建一个具有 aa 列的唯一值并对其进行计数的新数据框?
- javascript - 如何在 YouTube 上以编程方式加载评论部分?(无滚动)(JS/HTML/DOM)