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 (Java) 无法始终执行“悬停和单击”功能