Python使用selenium操作Docker里的Chrome浏览器的技巧

1. 介绍

1.1 介绍

今天福哥要带着大家学习如何使用selenium去调用部署在Docker环境里面的Chrome浏览器的方法。为什么我们要把chromedriver部署到Docker里面呢?因为把Chrome浏览器部署到Docker里面有如下几个优点:

  • 不用担心Chrome升级导致的需要手动升级chromedriver驱动的问题。
  • 部署方便,Chrome浏览器和chromedriver驱动都安装好了,启动起来即可。
  • 支持多节点部署,可以轻松部署多个Chrome浏览器环境的处理中心,提高执行效率。

接下来大家就跟着福哥学习使用Docker环境里面的Chrome浏览器处理我们的selenium程序的方法吧~

2. selenium/standalone-chrome

这是一个单机版本的镜像,这个里面包括一个chrome浏览器,可以用来调试selenium程序。

2.1 拉取镜像

selenium/standalone-chrome

2.2 启动容器

chromedriver的默认端口是4444(真吉利啊~~),福哥给映射到宿主机的9515端口上面了。

docker run -tid --name selenium-standalone-chrome -h selenium-standalone-chrome --memory 1g --memory-swap -1 -p 9515:4444 selenium/standalone-chrome

2.3 测试

这里有一点要说明下,这个和前面福哥讲的Windows环境的远程chromedriver不太一样的是,这里的远程地址要加上“/wd/hub”路径才行。

# set opts
# chrome = webdriver.Chrome(options=opts)
chrome = webdriver.Remote("http://192.168.2.88:9515/wd/hub", options=opts)

3. selenium/standalone-chrome-debug

这是一个单机版本的镜像,这个里面包括一个chrome浏览器,可以用来调试selenium程序。它和selenium/standalone-chrome的区别在于,这个里面还会启动一个VNC服务,可以通过VNC客户端连接进来浏览器的执行情况,便于调试selenium程序。

3.1 拉取镜像

selenium/standalone-chrome-debug

3.2 启动容器

福哥除了映射了chromedriver的默认端口4444到宿主机的9515端口外,还将VNC的5900端口也映射到宿主机的5900端口上面了。

docker run -tid --name selenium-standalone-chrome-debug -h selenium-standalone-chrome-debug --memory 1g --memory-swap -1 -p 9515:4444 -p 5900:5900 selenium/standalone-chrome-debug

3.3 测试服务

# set opts
# chrome = webdriver.Chrome(options=opts)
chrome = webdriver.Remote("http://192.168.2.88:9515/wd/hub", options=opts)

3.4 测试VNC

打开VNC软件,设置VNC主机为192.168.2.88:5900,进入后可以看到chromedriver环境的桌面,启动selenium程序后,可以看到浏览器执行过程。

VNC默认密码是secret!!!

连接到VNC可以看到这样的桌面。

启动selenium程序后,可以看到浏览器正在打开“同福网”页面。

我们可以进入到chromedriver虚拟机里面进行F12调试操作。

4. selenium/hub和selenium/node-chrome

这是一个hub和node组成的多节点处理中心,它可以将多个Chrome浏览器集中到一起进行任务处理,可以实现给执行相同任务的Chrome浏览器扩容的目的。

4.1 拉取镜像

selenium/hub
selenium/node-chrome

4.2 启动hub容器

先启动hub镜像,使用GRID_MAX_SESSION设置开启的最大会话数量。为了后面的node方便连接福哥给这个容器加到了bridge2网络里面了。因为我们的selenium访问的是这个hub容器,所以福哥将它的4444端口映射到了宿主机的9515端口上面。

docker run -tid --name selenium-hub -h selenium-hub \
-e GRID_MAX_SESSION=10 \
--memory 128m --memory-swap -1 --net bridge2 -p 9515:4444 selenium/hub

启动信息里的XPUB端口和XSUB端口请记住,后面会用到它们!

4.3 启动node容器

接下来启动node镜像,这里的SE_EVENT_BUS_HOST就是上面hub的名称,SE_EVENT_BUS_PUBLISH_PORT就是hub的XPUB端口,SE_EVENT_BUS_SUBSCRIBE_PORT就是hub的XSUB端口。同样的福哥将这个容器加到了bridge2网络里面了。

docker run -tid --name selenium-node-chrome -h selenium-node-chrome \