Docker版Selenium使用方法
HDUZN

Selenium 包含 3 大组件,Selenium IDE、Selenium WebDriver、Selenium Grid。
Selenium IDE:负责录制、回放脚本,模拟用户对页面的真实操作。
Selenium WebDriver:提供 API 来操作浏览器。
Selenium Grid:用于分布式自动化测试,可以控制多台机器、多个浏览器并行执行测试用例。

此文用的就是Docker版Selenium Grid,用的环境是:服务器CentOS8.2。

Selenium Grid Docker
官方文档:https://github.com/SeleniumHQ/docker-selenium/blob/trunk/README.md

一、pull需要的docker镜像

使用到两个镜像:

1
2
docker pull selenium/hub
docker pull selenium/node-chrome

selenium/node-chrome 是无界面的。

拉取完镜像后,可以用 docker images 查看所有镜像。

要想能看到实时运行界面,需要pull以下镜像:

1
docker pull selenium/standalone-chrome-debug

二、创建容器

1.创建一个新的 Docker 网络

1
docker network create my-grid

可以通过 docker network ls命令查看结果。

1.Hub节点的容器

1
docker run -d -p 4442-4444:4442-4444 --net my-grid --name selen-hub selenium/hub

2.Node节点的容器

1
2
3
4
5
6
7
8
docker run -d --net my-grid -e SE_EVENT_BUS_HOST=selen-hub \
--shm-size="2g" \
-e SE_EVENT_BUS_PUBLISH_PORT=4442 \
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 \
-p 5900:5900 \
-p 7900:7900 \
-v /dev/shm:/dev/shm \
--name selen-node-chrome1 selenium/node-chrome

5900 端口是给VNC客户端用的
7900 端口是给noVNC用的

容器可以通过 docker ps -a命令查看 。

服务起来了,可以在浏览器中查看(我的服务器ip为:43.142.94.65):
http://43.142.94.65:4444

结果如下:

点开版本号上面的1,可以看到有如下信息(这些信息有用的,记一下,代码里会用到这些参数):

1
{"browserName":"chrome","browserVersion":"102.0","platformName":"Linux","se:noVncPort":7900,"se:vncEnabled":true}

3. 使用docker-compose创建

如果不想用上面这种依次创建容器的方法,就直接用docker-compose一起创建(内容对照上面的一样的)。

docker-compose.yml 文件模板如下(Github上也有模板):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# To execute this docker-compose yml file use `docker-compose -f docker-compose-v3.yml up`
# Add the `-d` flag at the end for detached execution
# To stop the execution, hit Ctrl+C, and then `docker-compose -f docker-compose-v3.yml down`
version: "3"
services:
chrome:
image: selenium/node-chrome:latest
shm_size: 2gb
depends_on:
- selenium-hub
environment:
- SE_EVENT_BUS_HOST=selen-hub
- SE_EVENT_BUS_PUBLISH_PORT=4442
- SE_EVENT_BUS_SUBSCRIBE_PORT=4443
networks:
- my-grid
ports:
- "5900:5900"
- "7900:7900"

firefox:
image: selenium/node-firefox:latest
shm_size: 2gb
depends_on:
- selenium-hub
environment:
- SE_EVENT_BUS_HOST=selen-hub
- SE_EVENT_BUS_PUBLISH_PORT=4442
- SE_EVENT_BUS_SUBSCRIBE_PORT=4443
networks:
- my-grid
ports:
- "5901:5900"
- "7901:7900"

selenium-hub:
image: selenium/hub:latest
container_name: selen-hub
ports:
- "4442:4442"
- "4443:4443"
- "4444:4444"
networks:
- my-grid

networks:
my-grid:

把docker-compose.yml 文件上传到服务器,然后进入文件所在目录下,执行以下命令运行容器:

1
docker-compose up -d

-d :后台运行

如果文件名没用默认的 docker-compose.yml,就参考上面的提示,加上-f 的文件参数就行:

1
docker-compose -f docker-compose-v3.yml up -d

执行完后,通过docker ps -a查看容器列表,如图所示,添加了3个容器(容器需要加name的,自己添加一下container_name参数;还有个firefox不需要的就删除或者注释掉就行。):

要删除这些容器也简单,可以一键删除:

1
docker-compose -f docker-compose-v3.yml down

三、使用Python调用Selenium Grid

这反正跟平常的Selenium WebDriver一样的,参考之前的文章:Python Selenium使用举例

主要就是开头设置有些不一样。这里就需要用到 http://43.142.94.65:4444 运行后的这些信息。

1
{"browserName":"chrome","browserVersion":"102.0","platformName":"Linux","se:noVncPort":7900,"se:vncEnabled":true}

代码举例(test.py):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#!/usr/bin/env python
# -*- encoding: utf-8 -*-

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

selenium_grid_url = 'http://43.142.94.65:4444/wd/hub'

# selenium
option = webdriver.ChromeOptions()
option.set_capability("browserName", "chrome")
option.set_capability("browserVersion", "102.0")
option.set_capability("platformName", "Linux")
wd = webdriver.Remote(command_executor=selenium_grid_url, options=option)

wd.implicitly_wait(10)

# 调用WebDriver 对象的get方法 可以让浏览器打开指定网址
wd.get('https://cn.bing.com/')

print(wd.title) # 打印网页标题

# 根据id选择元素,返回的就是该元素对应的WebElement对象
# element = wd.find_element_by_id('c') # selenium3写法
element = wd.find_element(By.ID,'sb_form_q')

# 通过该 WebElement对象,就可以对页面元素进行操作了
# 比如输入字符串到 这个 输入框里
# element.send_keys('五四青年节\n')
element.send_keys('五四青年节')

time.sleep(5)

element2 = wd.find_element(By.ID, 'search_icon')
element2.click()
time.sleep(5)

wd.quit()

用命令运行这个Python文件,python test.py就可以看到运行结果了。也可以用下面远程观看的方式看到运行过程。

四、远程观看

Selenium 提示VNC客户端和浏览器两种远程方法。

1.VNC客户端

vnc viewer是一款优秀的远程控制工具软件。
官网下载地址:https://www.realvnc.com/en/connect/download/viewer/

安装好以后 File->New connection,在弹出的界面中输入node的ip和端口号(比如我这就是43.142.94.65:5900,Name随意),保存后双击启动。
连接,会要求输入密码,默认密码:secret

连接上后,再运行Python selenium的代码,就能看到运行过程了。(结果就像上面那张图一样)

2.使用浏览器(noVNC)

我的服务器ip为:43.142.94.65,映射出来的端口也是7900,那打开地址就是:

http://43.142.94.65:7900/vnc.html

默认密码:secret

效果跟上面也是一样的。

PS.注意服务器防火墙设置里这几个用到的端口开一下。(docker-compose.yml 文件里那些个端口)

小结的话

有了这些可以做些什么呢?

加上前面一篇文章:服务器 Docker搭建Flask应用(一),就在服务器上用Docker创建了3个容器,分别是:

  • Flask应用的容器
  • selenium hub的容器
  • selenium node-chrome的容器

这样就可以在Flask应用的容器中,代码用selenium爬取数据,写一个get接口,返回json数据;或者做自动化测试。

  • 本文标题:Docker版Selenium使用方法
  • 本文作者:HDUZN
  • 创建时间:2022-05-29 00:19:31
  • 本文链接:http://hduzn.cn/2022/05/29/Docker版Selenium使用方法/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
 评论