Selenium/WebdriverIO在Chrome无头模式下工作吗?

23

是否可以使用Selenium/WebdriverIO在Chrome无头模式下进行自动化浏览器测试?

据说Chrome --headless现在是一个事情,但我无法让他们的示例工作。我希望Selenium有一个选项可以实现这一点?


我这样初始化WebdriverIO:

const WebdriverIO = require('webdriverio');

let driver = WebdriverIO.remote({
    desiredCapabilities: {
        browserName: browser, // "chrome" or "firefox"
    },
});

我正在使用selenium-standalone启动Selenium:

selenium-standalone start > /dev/null 2>&1

现在看来,puppeteer 是更好的选择。它默认是无头的,并且运行速度更快。 - mpen
6个回答

27

WebdriverIO

这里有一个使用WebdriverIO的工作示例:https://github.com/OliverJAsh/webdriverio-chrome-headless/blob/5f231990310023f63f9ea8581567e0d56e2d53ea/src/index.ts

基本思路:

 import * as webdriverio from 'webdriverio';

// Headless is supported in Chrome >= 58. Not currently stable, so using dev
// build.
const CHROME_BIN_PATH = '/Applications/Google Chrome Dev.app/Contents/MacOS/Google Chrome';

const options = {
    desiredCapabilities: {
        browserName: 'chrome',
        chromeOptions: {
            binary: CHROME_BIN_PATH,
            args: [
                'headless',
                // Use --disable-gpu to avoid an error from a missing Mesa
                // library, as per
                // https://chromium.googlesource.com/chromium/src/+/lkgr/headless/README.md
                'disable-gpu',
            ],
        },
    },
};
webdriverio
    .remote(options)
    .init()
    .url('http://www.google.com')
    .getTitle().then(title => {
        console.log({ title });
    })
    .end();

WebDriverJS

以下是使用WebDriverJs的实际示例(WebDriver的官方JavaScript客户端):https://github.com/OliverJAsh/webdriverjs-chrome-headless/blob/554ea2f150e962257119703c2473753b90842087/src/index.ts

基本思想:

import * as webdriver from 'selenium-webdriver';
import * as chromeDriver from 'selenium-webdriver/chrome';

// Headless is supported in Chrome >= 58. Not currently stable, so using dev
// build.
const CHROME_BIN_PATH = '/Applications/Google Chrome Dev.app/Contents/MacOS/Google Chrome';

const options = new chromeDriver.Options();
options.setChromeBinaryPath(CHROME_BIN_PATH);
options.addArguments(
    'headless',
    // Use --disable-gpu to avoid an error from a missing Mesa library, as per
    // https://chromium.googlesource.com/chromium/src/+/lkgr/headless/README.md
    'disable-gpu',
);

const driver = new webdriver.Builder()
    .forBrowser('chrome')
    .setChromeOptions(options)
    .build();

@OliverJosephAsh 运行webdriverIO示例时没有任何输出。脚本似乎退出得太快了,以至于我认为它无法连接到任何东西,但没有输出错误。有什么调试的想法吗? - oligofren
发现删除设置端口的行后一切正常工作。更新示例代码,以便其他人不会掉入同样的陷阱。 - oligofren
1
禁用GPU不再需要。 - Tally Barak

20

您可以在wdio.conf.js文件中使用功能

capabilities: [{

    maxInstances: 1,
    browserName: 'chrome',
    'goog:chromeOptions': { 
         args: ["--headless", "user-agent=...","--disable-gpu","--window-size=1440,735"]
    }

2

我自己还没有尝试过,但是你可以从这个Docker镜像中下载--headless版本:

https://hub.docker.com/r/justinribeiro/chrome-headless/

或者自己构建(这需要几个小时,并且需要大量的RAM :) ) http://www.zackarychapple.guru/chrome/2016/08/24/chrome-headless.html

然后你应该能够在启动Chrome脚本时指定--headless,并使用chromedriver,根据开发邮件列表中的这个问题: https://groups.google.com/a/chromium.org/forum/#!topic/headless-dev/aAGFq8n_s6g


启动哪个启动脚本?是 webdriverio.remote 选项吗?还是 selenium-standalone start?我从未自己启动过 Chrome 驱动程序。 - mpen
我相信这一定是Chrome的启动脚本,所以应该是/usr/bin/google-chrome。 - cvakiitho

2
你可以通过添加chromeOptions来为你的驱动程序增加功能,这将把参数设置为一个字符串数组'--headless'。翻译后的结果:

通过添加chromeOptions来增加驱动程序功能,将参数设置为字符串数组'--headless'

 capabilities: [{

        maxInstances: 1,

        browserName: 'chrome',
        chromeOptions: {
            args: ['--headless'],
        },

    }],

0
除了HTML Unit驱动程序之外,另一种帮助在非GUI模式下使用webdriver的方法是在Linux上使用XVirtual帧缓冲区。使用它,您可以利用Chrome和Firefox驱动程序。整个解决方案,包括Jenkins、Selenium Firefox驱动程序和Blazemeter,在Linux上使用XVirtual帧缓冲区的无头执行Selenium测试在这里描述:Jenkins中无头执行Selenium测试。当然,您也可以使用Chrome驱动程序。

-1

你可以使用HtmlUnitDriver()和Selenium一起实现无头浏览器测试。

driver = new HtmlUnitDriver();
driver.get(URL); 
String title =  driver.getTitle();
System.out.println(title);

但我明白你想要使用Chrome进行特定的无头浏览器测试,让我试一试并回复你。


这个在 https://dev59.com/lWox5IYBdhLWcg3wcTzr 上的讨论可能会有所帮助。 - Dharam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接