首页 > 解决方案 > Selenium 找不到任何元素

问题描述

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

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

标签: javahtmlselenium

解决方案


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']"))));
    

参考

您可以在以下位置找到关于NoSuchElementException的详细讨论:


推荐阅读