HOWTO: Chrome带配置项启动

在使用Selenium进行自动化时,WebDriver启动的浏览器(这里以Chrome为例)是一个纯净的、不带Chrome扩展的实例。而我们常常会对浏览器有些特殊的需求,就需要对WebDriver添加启动参数。本文主要介绍:

  • Chrome的配置项及其在Selenium-WebDriver中的配置方法
  • 为Selenium-WebDriver配置Chrome专用用户的方案

配置方法

在Selenium的其它语言实现,比如Java、Python中,Chrome配置由ChromeOptions类控制,但在JavaScript中,使用的是selenium-webdriver/chrome中的Options类,具体的实现如下:

使用Option添加配置

首先如果没有配置启动参数时,WebDriver调用的写法如下:

  1. require('chromedriver');
  2. const { Builder } = require('selenium-webdriver');
  3. driver = new Builder().forBrowser('chrome').build();

如果我们需要Chrome以最大化的状态启动,需要添加--start-maximized启动参数,可以使用Option.addArguments()方法添加参数。

  1. require('chromedriver');
  2. const { Builder } = require('selenium-webdriver');
  3. const { Options } = require('selenium-webdriver/chrome');
  4. let options = new Options();
  5. options.addArguments('--start-maximized');
  6. driver = new Builder().setChromeOptions(options).forBrowser('chrome').build();

如果还想隐身模式启动浏览器,这就要使用--incognito启动参数,在driver实例化前给options加上这一条参数即可:

  1. options.addArguments('--incognito');

常用配置项

Chrome的配置项非常多,添加启动参数属于比较简单的配置,另外还可以配置浏览器的功能和偏好(Preference)、可执行文件路径、代理等。

常用启动参数

可以配置的启动参数非常多,完整版的可以访问此网站。但是这里我们只列举常用的一些参数。

  1. options.addArguments('--user-data-dir=[path]') // 设置用户数据文件夹
  2. options.addArguments('--headless') // 无头模式
  3. options.addArguments('--disable-gpu') // 禁用GPU加速
  4. options.addArguments('--start-maximized')// 浏览器最大化
  5. options.addArguments('--window-size=1280x1024') // 设置浏览器分辨率(窗口大小)
  6. options.addArguments('log-level=3') // 日志记录级别
  7. // info(default) = 0
  8. // warning = 1
  9. // LOG_ERROR = 2
  10. // LOG_FATAL = 3
  11. options.addArguments('--user-agent=""') // 设置请求头的User-Agent
  12. options.addArguments('--incognito') // 隐身模式(无痕模式)
  13. options.addArguments('--hide-scrollbars') // 隐藏滚动条, 应对一些特殊页面
  14. options.addArguments('--disable-javascript') // 禁用javascript
  15. options.addArguments('--blink-settings=imagesEnabled=false') // 不加载图片, 提升速度
  16. /*--已废弃--*/
  17. options.addArguments('--disable-infobars') // 禁用浏览器正在被自动测试程序控制的提示

禁用Chrome受到自动测试程序控制提示的参数由于被恶意滥用在某次变更中移除了。

添加扩展

使用Option.addExtension(path)方法给浏览器增加扩展程序,path为扩展程序的.crx文件的路径。在浏览器启动时会自动安装添加的扩展。

为Selenium自动化配置一套浏览器

在用Selenium写Web自动化时,可能会因为WebDriver每次都是重启一个全新的干净浏览器而烦恼,可能会导致每次在业务测试脚本开始前先执行一大段配置脚本(比如登录、注册等等)。而如果让WebDriver不要每次都启动一个干净的浏览器而是启动一个跟平时使用没有区别、带用户数据的浏览器,就可以在执行业务测试时,使用已有的cookie或者保持住登录状态,来避免反复的配置操作。

下面介绍如何让WebDriver用上用户数据。

直接使用默认用户启动浏览器

事实上,在常用启动参数一节我们在第一行就介绍了配置用户数据的参数,即--user-data-dir=[path],只要指定到Chrome安装目录下的User Data文件夹,即可打开平时使用的那一套浏览器。添加配置的代码如下:

  1. options.addArguments('--user-data-dir=C:\\Users\\username\\AppData\\Local\\Google\\Chrome\\User Data');

其中的username请替换为实际的用户的Windows登录名,以使上面的路径指向正确的已有路径。接着启动WebDriver即可看到一套熟悉的、与平时使用一样的浏览器启动。当然更多时候你只会看到一串如下的报错

  1. (node:14272) UnhandledPromiseRejectionWarning: InvalidArgumentError: invalid argument: user data directory is already in use, please specify a unique value for --user-data-dir argument, or don't use --user-data-dir

这通常是因为后台已经有一个浏览器实例正在使用该用户数据文件夹,这会导致读写冲突。但这其实只是因为你已经开了一个浏览器,而两个浏览器使用了同一个用户数据文件夹;或者后台仍有相关的进程在使用该用户数据(Chrome为了保证运行速度会在后台保持浏览器扩展,而扩展使用了用户数据)。因此可能需要用将这些Chrome进程结束掉,才能成功启动,这非常的麻烦,当然下面提供了另外一种方案,可以比较好的解决这个问题。

使用新增用户启动浏览器

在上一节中,报错的原因是因为有另一个实例占用了用户数据文件夹,因此我们只要另起一个用户数据文件夹——也就是新建一个浏览器用户,具体的方法如下:

新增用户

  1. 在计算机上打开 Chrome。
  2. 点击右上角的“个人资料”个人资料
  3. 点击管理用户。
  4. 点击添加用户。
  5. 选择名称和照片。
  6. 点击保存。系统会打开一个新窗口,并要求您开启同步功能,这里不需要打开。

这个时候可以再访问原来的用户数据文件夹,即C:\\Users\\username\\AppData\\Local\\Google\\Chrome\\User Data,可以看到目录下出现了新的名为Profile 1的文件夹(数字具体是几取决于你创建过几个账号)。

使用新增的用户数据文件夹

我们将WebDriver启动的数据文件夹改到新增的用户数据路径,即C:\\Users\\username\\AppData\\Local\\Google\\Chrome\\User Data\\Profile 1,接着启动就可以看到打开了一个新的浏览器。

但是你一定注意到了,这里右上角“个人资料”个人资料仍然是空的,而不是刚刚新增用户的时候设定的头像。这是因为Chrome在从命令行第一次启动的时候,会自动的在当前的用户数据文件夹下创建\Default文件夹并使用,因此使用的仍然会是一个空的用户。所幸这并不影响WebDriver保存用户数据。

可以在地址栏中访问chrome://version查看,个人资料路径一栏的路径为C:\\Users\\username\\AppData\\Local\\Google\\Chrome\\User Data\\Profile 1\\Default。 这时你也会发现浏览器在启动后、执行操作前的停留时间变长了,这是因为浏览器是先打开再加载用户数据的,因此会比较费时。也是因为这个原因WebDriver每次都打开纯净的浏览器来保证运行速度。

检查是否能保存浏览数据

接着便可以让WebDriver正常使用用户数据了,例如可以访问GitHub把自己的账号登录上去,接着之后再打开就都可以看到保持登录在登录中状态了。

这个方法也可以有效的隔离用户数据,以Github举例,你可能有个自己的账号,但还有另外一个测试账号。在原来的情况,可能需要经常在Github上切换账号,但是现在就不需要了,两个账号的登录状态保存在不同的用户数据文件夹中,不会产生任何冲突。

如何手动打开新增的用户浏览器

研究了桌面上的Chrome快捷方式以后,就能注意到,启动特定用户Chrome的命令就是"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --profile-directory="Profile1"。而WebDriver刚刚启动的其实是Profile下新创建的Default用户,因此我们将命令改为"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --profile-directory="Profile1\Default"即可。当然也可以直接在快捷方式里面把目标改成上面这个命令。