无界面自动化测试 - 基于Node.js和Selenium Webdriver

26

我正在使用一个自动化工具,需要在Ubuntu服务器上部署,我想知道是否可能使用Selenium Webdriver以无声的方式使用Chrome浏览器。

到目前为止,我尝试了以下代码,但它一直在打开浏览器(我在Windows 10中进行测试):

    var webdriver = require('selenium-webdriver'),
        chrome    = require('selenium-webdriver/chrome')
        By        = webdriver.By,
        until     = webdriver.until,
        options   = new chrome.Options();
        options.addArguments('--headless');
    var path = require('chromedriver').path;
    var service = new chrome.ServiceBuilder(path).build();
        chrome.setDefaultService(service);
    var driver = new webdriver.Builder().forBrowser('chrome').withCapabilities(options.toCapabilities()).build();

driver.get('https://www.google.com');
注意,addArguments('--headless')是应该使导航无声的参数,但显然它不能正常工作,或者我缺少某些我不知道的东西。
如果有我不知道的内容,请告诉我,因为我不知道我想做的事情是否可能,因为这是我第一次使用这种技术。
谢谢。

你使用的是哪个版本的Chrome?--headless从59版本开始支持,在Windows上需要60版本。 - SiKing
4个回答

71

2018年2月更新的答案。

参考Selenium Webdriver NodeJS Examples (提交记录5bf50c4)

const chrome = require('selenium-webdriver/chrome');
const firefox = require('selenium-webdriver/firefox');
const {Builder, By, Key, until} = require('selenium-webdriver');

const screen = {
  width: 640,
  height: 480
};

let driver = new Builder()
    .forBrowser('chrome')
    .setChromeOptions(new chrome.Options().headless().windowSize(screen))
    .setFirefoxOptions(new firefox.Options().headless().windowSize(screen))
    .build();

自2017年4月以来,主要版本59.0已提供无头Chrome。

自2017年9月以来,主要版本56.0已提供无头Firefox。


1
谢谢,那很有帮助。您可以简单地修复屏幕对象:{宽度:640,高度:480}。 - westor

12

试试这个:

var webdriver = require('selenium-webdriver'),
    chrome    = require('selenium-webdriver/chrome')
    By        = webdriver.By,
    until     = webdriver.until,
    options   = new chrome.Options();
    options.addArguments('headless'); // note: without dashes
    options.addArguments('disable-gpu')
var path = require('chromedriver').path;
var service = new chrome.ServiceBuilder(path).build();
    chrome.setDefaultService(service);
var driver = new webdriver.Builder()
    .forBrowser('chrome')
    .withCapabilities(webdriver.Capabilities.chrome()) 
    .setChromeOptions(options)                         // note this
    .build();

driver.get('https://www.google.com');

By 和 Until 有什么作用? - Luke Vanzweden

10

很抱歉,Webdriver JS中不再存在headless()方法。

请使用

const seleniumWebdriver = require('selenium-webdriver');
const chrome = require('selenium-webdriver/chrome');

var driver = new Builder().forBrowser('chrome')
            .setChromeOptions(new chrome.Options().addArguments('--headless'))
            .build();

而不是。


感谢您的评论,目前我们停止使用Selenium WebDriver并转向Puppeteer,这是我们场景中更可靠的解决方案。 - avilac
@avilac,我已经使用selenium-webdriver完成了这个项目,但现在我发现puppeteer也是一个更好的解决方案。在下一个项目中,我会尝试一下它。 - Zeeshan Ahmad Khalil

2
要在Chrome中启动无头模式,只需调用Options.headless()。目前,在无头模式下启动也会禁用GPU加速。以下是代码:
  var seleniumWebdriver = require('selenium-webdriver');
  var chrome    = require('selenium-webdriver/chrome');

  var options   = new chrome.Options().headless();

  var driver = new seleniumWebdriver.Builder()
    .forBrowser('chrome')
    .setChromeOptions(options)
    .build();

注意:为了安全起见,Chrome 在无头模式下默认禁用下载。您可以调用setDownloadPath来重新启用下载。


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