Selenium webdriver 无法在 chrome 无头模式下定位元素

Posted

技术标签:

【中文标题】Selenium webdriver 无法在 chrome 无头模式下定位元素【英文标题】:Selenium webdriver is unable to locate element in chrome headless mode 【发布时间】:2018-01-19 08:29:01 【问题描述】:

我编写了以下脚本来练习 Selenium 浏览器自动化。它访问 Steam 的网站并更改您的 Steam 用户名。如果在没有 Chrome 的无头模式的情况下运行,它可以完美运行,但如果以 options.addArguments("headless") 开头,则无法找到第一个元素。代码:

@Test
public void steamPowered() throws IOException 

    System.setProperty("webdriver.chrome.driver", "C:\\Driver\\chromedriver.exe");

    ChromeOptions options = new ChromeOptions();
    options.addArguments("--user-data-dir=C://Users/Evan/Downloads/Profile8Aug17");
    options.addArguments("headless");
    options.addArguments("window-size=1200x600");

    ChromeDriver driver = new ChromeDriver(options);

    driver.navigate().to("https://store.steampowered.com/");

    WebElement element = (new WebDriverWait(driver, 10))
            .until(ExpectedConditions.presenceOfElementLocated(By.id("account_pulldown")));
    element.click();

    element = (new WebDriverWait(driver, 10))
            .until(ExpectedConditions.presenceOfElementLocated(By.xpath("//*[@id=\"account_dropdown\"]/div/a[4]")));
    element.click();

    element = (new WebDriverWait(driver, 10))
            .until(ExpectedConditions.presenceOfElementLocated(By.xpath
            ("/html/body/div[1]/div[7]/div[2]/div[1]/div[1]/div/div/div/div[3]/div[2]/a/span")));
    element.click();

    element = (new WebDriverWait(driver, 10))
            .until(ExpectedConditions.presenceOfElementLocated(By.id("personaName")));
    element.clear();
    element.sendKeys(scramble(USERNAME));

    driver.findElement(By.xpath("//span[text()='Save Changes']")).click();

    driver.quit();

崩溃时的intellij打印输出:

org.openqa.selenium.NoSuchElementException: no such element: Unable to locate 
element: "method":"id","selector":"account_pulldown"
  (Session info: headless chrome=60.0.3112.90)
  (Driver info: chromedriver=2.31.488763 
(092de99f48a300323ecf8c2a4e2e7cab51de5ba8),platform=Windows NT 6.1.7601 SP1 
x86_64) (WARNING: The server did not provide any stacktrace information)

这令人困惑,因为以下代码完美运行(从https://medium.com/@eliasnogueira/running-selenium-tests-with-chrome-headless-5edd624efb92 复制粘贴)

@Test
public void testExecution() throws IOException 
    System.setProperty("webdriver.chrome.driver", "C:\\Driver\\chromedriver.exe");

    // Add options to Google Chrome. The window-size is important for responsive sites
    ChromeOptions options = new ChromeOptions();
    options.addArguments("--user-data-dir=C://Users/Evan/Downloads/Profile8Aug17");
    options.addArguments("headless");
    options.addArguments("window-size=1200x600");

    WebDriver driver = new ChromeDriver(options);
    driver.get("http://seleniumhq.org");

    // a guarantee that the test was really executed
    assertTrue(driver.findElement(By.id("q")).isDisplayed());

    driver.quit();

那么我在这里错过了什么?我看不出两者之间有任何严重的区别。是什么阻止了我的脚本在无头模式下定位页面元素?

【问题讨论】:

获取无头模式的PageSource,看看有没有问题 "--user-data-dir=C://Users/Evan/Downloads/Profile8Aug17" 到底是什么?您是否正在尝试加载 Chrome 配置文件? @DebanjanB 没错。这是我遇到的问题的(可能是幼稚的)解决方案。使用我的默认配置文件时,chrome 实例无法导航。 chrome 窗口将打开,但在一分钟左右后冻结并关闭,intellij 抛出错误org.openqa.selenium.WebDriverException: unknown error: Chrome failed to start: crashed。因此,我将驱动程序指向了一个任意位置,例如 /Downloads/,它创建了一个新的配置文件,在我尝试无头模式之前,我一直在使用该配置文件而没有问题。 @TarunLalwani PageSource 有 1910 行长,并且在没有无头模式运行时包含 24 个关键字“account”实例,但是当使用 --headless 运行时,PageSource 仅 1729 行长并且包含 3 个实例“帐户”。所以我认为你正在做某事。然而,我在网上找到的关于 chrome headless 的内容都没有说明 PageSource 在无头模式下被更改,所以我不确定这里发生了什么。 @evanyoho,问题是无头是一个非常新的功能,这可能会对您的 JS 中的框架可能正在使用的一些 JS 行为产生微小的变化。所以我希望这些东西会一直存在,直到无头功能在 chrome 中成熟。但是您需要找到导致 HTML 不同的原因 【参考方案1】:

尝试将屏幕尺寸更改为“1920x1080”,有时屏幕尺寸不合适时您会发现问题。

【讨论】:

【参考方案2】:

你能试试下面的设置吗:

options.addArguments("window-size=1400,800");
options.addArguments("headless");

【讨论】:

【参考方案3】:

为了在java中使用ChromeOptions使用headless chrome,你应该使用--headless,你可以替换:

options.addArguments("headless");

与:

options.addArguments("--headless");

【讨论】:

这无济于事,当 chrome 窗口打开时一切正常,当我添加 .addArguments("--headless") 或 .setHeadless(true) 我得到:“org.openqa.selenium .NoSuchElementException: 没有这样的元素" 那么如何解决这个问题呢?

以上是关于Selenium webdriver 无法在 chrome 无头模式下定位元素的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Selenium Webdriver 中设置 cookie

无法在 python selenium 中使用 selenium chrome webdriver 定位元素

无法运行 selenium webdriver

Selenium-Webdriver (Java) 无法始终执行“悬停和单击”功能

通过 Selenium WebDriver 接受“共享位置”浏览器弹出窗口

Selenium webdriver错误无法在(竹子)上找到元素