SELENIUM文档 - Grid

Docker-selenium 文档

内容

  1. 主要写一下maxSession和maxInstance的作用和使用方式
  2. docker-chrome的默认状态是什么?可能会出现什么错误?怎么修改?

命令

我们在使用进行Selenium测试。对于某些测试,我们需要序列化测试(不并发),以便最多一个浏览器(在我们的例子中,它也是一个用户)。可以使用-maxSession参数限制会话;有些时候我们的节点机器配置可能不是太好,不能够同时启动多个浏览器,可以使用-maxInstance参数限制;

使用selenium grid模式去设计我们的selenium UI自动化,那么在启动节点服务的命令是这样的:

java -Xrs -jar selenium-server.jar 
  -role node 
  -port 4444 
  -hub http://10.10.10.10:4450/grid/register 
  -firefoxProfileTemplate SeleniumProfile
  -maxSession 5
  -timeout 300000 
  -browser "browserName=firefox,maxInstances=10,platform=ANY,seleniumProtocol=WebDriver" 
  -browser "browserName=chrome,maxInstances=10,platform=ANY,seleniumProtocol=WebDriver"

或是

java -jar selenium-server-standalone.jar 
 -role node 
 -Dwebdriver.chrome.driver=chromedriver.exe
 -nodeConfig node1Config.json

其中的参数-nodeConfig node1Config.json (官网示例)

{
  "capabilities": [
    {
      "browserName": "firefox",
      "acceptSslCerts": true,
      "javascriptEnabled": true,
      "takesScreenshot": false,
      "firefox_profile": "",
      "browser-version": "27",
      "platform": "WINDOWS",
      "maxInstances": 5,
      "firefox_binary": "",
      "cleanSession": true
    },
    {
      "browserName": "chrome",
      "maxInstances": 5,
      "platform": "WINDOWS",
      "webdriver.chrome.driver": "C:/Program Files (x86)/Google/Chrome/Application/chrome.exe"
    },
    {
      "browserName": "internet explorer",
      "maxInstances": 1,
      "platform": "WINDOWS",
      "webdriver.ie.driver": "C:/Program Files (x86)/Internet Explorer/iexplore.exe"
    }
  ],
  "configuration": {
    "_comment" : "Configuration for Node",
    "cleanUpCycle": 2000,
    "timeout": 30000,
    "proxy": "org.openqa.grid.selenium.proxy.WebDriverRemoteProxy",
    "port": 5555,
    "host": ip,
    "register": true,
    "hubPort": 4444,
    "maxSession": 5
  }
}

说明

  -role node :  作为节点
  -port 4444 : 暴露selenium hub调用的服务端口
  -hub http://******:4450/grid/register     : hub服务注册中心
  -maxSession 5     : 最大的并发量
  -firefoxProfileTemplate SeleniumProfile		: firefox配置文件
  -timeout 300000 				: 超时时间
  -browser "browserName=firefox,maxInstances=10,platform=ANY,seleniumProtocol=WebDriver"   :注册firefox
  -browser "browserName=chrome,maxInstances=10,platform=ANY,seleniumProtocol=WebDriver" :注册chrome

注册完的信息可以在 hub服务的http://10.10.10.10:4450/grid/console页面看到

MaxInstances

相同版本的浏览器可以在远程系统上运行多少个实例;

-browser browserName=firefox,version=12,maxInstances=5,platform=LINUX
-browser browserName=InternetExplorer,version=9.0,maxInstances=5,platform=LINUX

可以在远程机器上同时运行5个Firefox 12实例和5个IE9实例。因此,hub调用的时候可以并行运行10个不同浏览器的实例(FF12和IE9)。

MaxSession

在远程系统中,一次可以并行运行多少个浏览器(任何浏览器和任何版本)。因此,这将覆盖maxInstances设置,并可以限制可以并行运行的浏览器实例的数量;

  • maxSession=1,时强制您运行的浏览器不会超过1;
  • maxSession=2,可以同时进行2次chrome测试,或者1次Internet Explorer和1次Firefox测试)无论您定义了什么MaxInstances。

可以理解为

MaxInstances:(默认值:5)这为每个节点提供了更多的插槽,例如,MaxInstances=5每个节点最多允许5个浏览器;

MaxSession:(默认值:5)设置可以在节点中同时运行的最大测试数量。如果MaxInstances=5,则MaxSession也应该至少为5;

因此MaxSession与整个Grid相关,它应该与hub配置一起使用,如果我们的selenium只有一个节点或者说我们采用直连node,也可以使用;MaxInstances因为它与特定浏览器的实例数有关,它应该与节点配置一起使用

备注:默认的参数可以通过standalone.jar的源码去查看;还有就是理解我们一个脚本命令的流转流程(脚本->hub->node->webdriver->browserDriver->browser)

关于docker-selenium

我们主要会使用docker版的browser,其中包含了selenium node的服务,和普通window模式一样;这里需要注意的是,我们经常使用的selenium/standalone-chrome-debug,启动服务后他的maxSessionmaxInstance是多少?

node-base(docker-Dockerfile 部分内容,他们直接的继承关系就不用说了,可以去dockerhub或github上看)

...
#========================
# Selenium Configuration
#========================
# As integer, maps to "maxInstances"
ENV NODE_MAX_INSTANCES 1
# As integer, maps to "maxSession"
ENV NODE_MAX_SESSION 1
# As address, maps to "host"
ENV NODE_HOST 0.0.0.0
# As integer, maps to "port"
ENV NODE_PORT 5555
# In milliseconds, maps to "registerCycle"
ENV NODE_REGISTER_CYCLE 5000
# In milliseconds, maps to "nodePolling"
ENV NODE_POLLING 5000
# In milliseconds, maps to "unregisterIfStillDownAfter"
ENV NODE_UNREGISTER_IF_STILL_DOWN_AFTER 60000
# As integer, maps to "downPollingLimit"
ENV NODE_DOWN_POLLING_LIMIT 2
# As string, maps to "applicationName"
ENV NODE_APPLICATION_NAME ""
# Debug
ENV GRID_DEBUG false

可以看出

# As integer, maps to "maxInstances"
ENV NODE_MAX_INSTANCES 1
# As integer, maps to "maxSession"
ENV NODE_MAX_SESSION 1

官网提供的docker-chrome最大并发是1,所以如果由并发超过1的测试任务,可能回报出SessionNotCreatedException错误

org.openqa.selenium.SessionNotCreatedException: A new session could not be created. 

那么,我们想在docker-chrome上提高并发,怎么真么办?好办,改Dockerfile
,你可以通过继承方式去从头到尾地改,或者直接改启动命令

docker run --env NODE_MAX_INSTANCES 5 --env NODE_MAX_SESSION 5 ...

当前我还没有得出修改限制后的运行效果,可能docker-chrome就不支持并发,待更后续的试验结果

参考
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐