selenium Grid全集
1.selenium node启动报错信息如下:
22:26:07.086 INFO [RequestHandler.process] - Error forwarding the new session cannot find : Capabilities {browserName: chrome, platform: MAC, version: 10}
org.openqa.grid.common.exception.CapabilityNotPresentOnTheGridException: cannot find : Capabilities {browserName: chrome, platform: MAC, version: 10}
原因:代码里的capability和node.json里的capability不一致导致,改成一样的就行
2.运行报错:
10:43:53.451 INFO [RequestHandler.process] - Error forwarding the new session Empty pool of VM for setup Capabilities {browserName: chrome, version: }
org.openqa.grid.common.exception.GridException: Empty pool of VM for setup Capabilities {browserName: chrome, version: }
原因:只启动了hub节点,没有启动node节点:
3.运行报错:
selenium.common.exceptions.WebDriverException: Message: Error forwarding the new session cannot find : Capabilities {browserName: chrome, platform: MAC, seleniumProtocol: WebDriver, version: 10}
原因:
1)没有对应的node.json文件
2)node启动时没有挂对应的node.json文件
selenium的node.json文件格式:
{
"capabilities":
[
{
"browserName": "chrome",
"maxInstances": 5,
"seleniumProtocol": "WebDriver",
"platform": "MAC",
"version": "10"
}
],
"proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
"maxSession": 5,
"port": -1,
"register": true,
"registerCycle": 5000,
"hub": "http://localhost:4444",
"nodeStatusCheckTimeout": 5000,
"nodePolling": 5000,
"role": "node",
"unregisterIfStillDownAfter": 60000,
"downPollingLimit": 2,
"debug": false,
"servlets" : [],
"withoutServlets": [],
"custom": {}
}
node节点启动挂对应的node.json文件命令:
$ java -jar selenium-server-standalone-141.59.jar -role node -port 4445 -nodeConfig node.json
4.selenium Grid举例:
步骤1:启动hub节点:
$ java -jar selenium-server-standalone-3.141.59.jar -role hub -port 4444
步骤2:启动node节点:
$ java -jar selenium-server-standalone-141.59.jar -role node -port 4445 -nodeConfig node.json
步骤3:编辑代码:
import time
import pytest
from selenium import webdriver
class TestGrid:
def test_hub(self):
capabilities={
"browserName": "chrome",
"seleniumProtocol": "WebDriver",
"platform": "MAC",
"version": "10"
}
driver = webdriver.Remote('http://192.168.56.1:4444/wd/hub',capabilities)
driver.get('https://wwww.baidu.com')
time.sleep(5)
driver.quit()
运行完成后:
hub打印的日志:
10:55:50.342 INFO [RequestHandler.process] - Got a request to create a new session: Capabilities {browserName: chrome, platform: MAC, seleniumProtocol: WebDriver, version: 10}
10:55:50.343 INFO [TestSlot.getNewSession] - Trying to create a new session on test slot {server:CONFIG_UUID=d4379450-1f66-40da-a32e-c88d017ea32d, seleniumProtocol=WebDriver, browserName=chrome, maxInstances=5, platformName=MAC, version=10, platform=MAC}
node打印的日志
10:55:50.355 INFO [ActiveSessionFactory.apply] - Capabilities are: {
"browserName": "chrome",
"goog:chromeOptions": {
},
"platform": "MAC",
"seleniumProtocol": "WebDriver",
"version": "10"
}
10:55:50.355 INFO [ActiveSessionFactory.lambda$apply$11] - Matched factory org.openqa.selenium.grid.session.remote.ServicedSession$Factory (provider: org.openqa.selenium.chrome.ChromeDriverService)
Starting ChromeDriver 86.0.4240.22 (398b0743353ff36fb1b82468f63a3a93b4e2e89e-refs/branch-heads/4240@{#378}) on port 9813
Only local connections are allowed.
Please see https://chromedriver.chromium.org/security-considerations for suggestions on keeping ChromeDriver safe.
[1607223350.408][WARNING]: FromSockAddr failed on netmask
ChromeDriver was started successfully.
10:55:52.126 INFO [ProtocolHandshake.createSession] - Detected dialect: W3C
10:55:52.128 INFO [RemoteSession$Factory.lambda$performHandshake$0] - Started new session 6f9a43d0829ccb56e37540afca296450 (org.openqa.selenium.chrome.ChromeDriverService)
10:55:58.383 INFO [ActiveSessions$1.onStop] - Removing session 6f9a43d0829ccb56e37540afca296450 (org.openqa.selenium.chrome.ChromeDriverService)
5.docker+selenium Grid
第一步:启动selenium hub容器:
$ docker run --name=hub -p 5555:4444 -e GRID_TIMEOUT=30000 -e GRID_THROW_ON_CAPABILITY_NOT_PRESENT=true -e GRID_NEW_SESSION_WAIT_TIMEOUT=5000 -e GRID_BROWSER_TIMEOUT=15000 -e GRID_CLEAN_UP_CYCLE=30000 -d selenium/hub
第二步:启动node容器:
ps:这里启动【node-chrome-debug】镜像是为了更好的调试,这里可以下载VNC View来看运行结果
--link选项是用来和hub容器进行关联,但是这个选项只能是hub和node部署于同一台机器才行
$ docker run --name=chrome -p 5900:5900 -e NODE_MAX_INSTANCES=5 -e NODE_MAX_SESSION=5 -e NODE_REGISTER_CYCLE=5000 --link hub -d selenium/node-chrome-debug
第三步:执行代码:
import os
import time
import pytest
from selenium import webdriver
class TestHubDocker:
def test_hub(self):
capabilities={
"browserName": "chrome",
# 这里注意,不要写下面这几个配置,不然就会报错
# "seleniumProtocol": "WebDriver",
# "platform": "MAC",
# "version": "10"
}
driver = webdriver.Remote('http://127.0.0.1:5555/wd/hub',capabilities)
driver.get('https://wwww.baidu.com')
time.sleep(5)
driver.quit()
6.如果是要把Appium服务注册到selenium Grid的话,方法和node.json和selenium的都不一样
官方参考连接为:https://appium.io/docs/cn/advanced-concepts/grid/
复制官方的注意,它在【"hubHost":】这一行最后少了一个逗号
appium的node.json格式如下:
{
"capabilities":
[
{
"browserName": "ANDROID",
"version":"6.0",
"maxInstances": 1,
"platform":"ANDROID"
}
],
"configuration":
{
"cleanUpCycle":2000,
"timeout":30000,
"proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
"url":"http://localhost:4723/wd/hub",
"host": "localhost",
"port": 4723,
"maxSession": 1,
"register": true,
"registerCycle": 5000,
"hubPort": 4444,
"hubHost": "192.168.91.78",
"hubProtocol": "http"
}
}
启动节点命令:
$ appium --nodeconfig node_app1.json
7.第二个appium node启动报错,报错如下:
Could not start REST http interface listener. The requested port may already be in use. Please make sure there is no other instance of this server running already.
Fatal Error: listen EADDRINUSE: address already in use 0.0.0.0:4723
at Server.setupListenHandle [as _listen2] (net.js:1301:14)
at listenInCluster (net.js:1349:12)
at doListen (net.js:1488:7)
at processTicksAndRejections (internal/process/task_queues.js:81:21)
原因有2,需要具体排查:
1)这个node要启动的appium的端口和已启动的端口重复了,要把node.json文件中【configuration】的【url、port】这俩参数里涉及到端口的改成和已经启动的node节点的配置不一样的,比如上面第2点中是我第一个启动的node节点,那我第二个要启动的node节点的node.json的配置就改成下面这样的
{
"capabilities":
[
{
"browserName": "ANDROID",
"version": "6.0",
"maxInstances": 1,
"platform": "ANDROID"
}
],
"configuration":
{
"cleanUpCycle":2000,
"timeout":30000,
"proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
"url":"http://localhost:4724/wd/hub",
"host": "localhost",
"port": 4724,
"maxSession": 1,
"register": true,
"registerCycle": 5000,
"hubPort": 4444,
"hubHost": "192.168.91.78",
"hubProtocol": "http"
}
}
启动节点命令:
$ appium --nodeconfig node_app2.json
补充知识:
Grid的节点连接情况可以从【hub的服务器地址/grid】这个连接中,点击【console】跳转的页面查看,grid这个页面点击【wiki】可以跳转到selenium grid的github wiki文档地址【https://github.com/SeleniumHQ/selenium/wiki/Grid2】,这里主要是说明selenium node连接hub的,appium的不在这里,appium的是在【https://appium.io/docs/cn/advanced-concepts/grid/】


浙公网安备 33010602011771号