无头ChromeDriver会引发ElementNotVisibleException

时间:2018-03-15 07:27:51

标签: java selenium selenium-webdriver selenium-chromedriver google-chrome-headless

我是硒的新人。我需要一个没有图形界面的浏览器,因为项目将从Jenkins开始。我决定在Headdless模式下使用ChromeDriver。

当我在正常模式下使用ChrimeDriver时,我可以点击所有元素:

WebDriver driver = new ChromeDriver();
List<WebElement> allElem = driver.findElements(By.ByXPath("//div[@id='accordian']/div/ul/li"));

for(int i=0; i<allElem.getSize(); i++){
   allElem.get(i).click(); // is ok
}

但是当我使用Headdless模式时,我有:ElementNotVisibleException:元素不可见。可能有什么不对?谢谢你的每一个线索。

    ChromeOptions chromeOptions = new ChromeOptions();
    chromeOptions.addArguments("--headless");
    //chromeOptions.addArguments("--start-maximized");
    WebDriver driver = new ChromeDriver(chromeOptions);
    List<WebElement> allElem = driver.findElements(By.ByXPath("//div[@id='accordian']/div/ul/li"));

    for(int i=0; i<allElem.getSize(); i++){
        allElem.get(i).click();//ElementNotVisibleException dont see next li elements 
        //div[@id='accordian']/div/ul/li
    }

2 个答案:

答案 0 :(得分:0)

无头模式下使用 Selenium Client v3.11.0 Chrome驱动程序v2.36 Chrome浏览器v65.x ,您需要在初始化 WebDriver Web浏览器时通过 ChromeOptions 类的实例传递以下参数,如下所示:

System.setProperty("webdriver.chrome.driver", "C:\\path\\to\\chromedriver.exe");
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.addArguments("--headless");
chromeOptions.addArguments("start-maximized");
chromeOptions.addArguments("--disable-gpu");
chromeOptions.addArguments("--disable-extensions"); 
WebDriver driver =  new ChromeDriver(chromeOptions);
driver.get("https://www.google.co.in");

答案 1 :(得分:0)

您需要传递"--headless",如下所示的chrome选项。

ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.addArguments("--headless");
WebDriver driver =  new ChromeDriver(chromeOptions);

有关chrome选项的完整列表,请参考以下URL。它详细解释了每个命令行开关。

https://peter.sh/experiments/chromium-command-line-switches/

在使用无头模式时,我遇到org.openqa.selenium.UnhandledAlertException是由于未处理从警报框弹出的问题。因此,最好处理警报框。

                    String alertText = alert.getText();
                    System.out.println("ERROR: (ALERT BOX DETECTED) - ALERT MSG : " + alertText);
                    alert.accept();
                    File outputFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
                    String imageDetails = "D://Images"
                    File screenShot = new File(imageDetails).getAbsoluteFile();
                    FileUtils.copyFile(outputFile, screenShot);
                    System.out.println("Screenshot saved: {}" + imageDetails);
                    driver.close();