准备工作
所有的操作都是在docker 里面进行
- docker
- selnium grid
- python
- VNC (密码secret)
- selenium/standalone-chrome (一个独立系统)
- selenium/node-chrome (节点 7900连接网页版vnc )
- selenium/hub (主要节点)
开始
selenium/hub
docker network create grid 创建专用网络,下面所有的node hub 都要加入这个网络
docker run -d -p 4442-4444:4442-4444 --net grid --name selenium-hub selenium/hub:latest
-v 挂载命令,主要针对一些文件上传,本地没有文件就建,服务没有人家会自己这建立的。 注意【node1】,如果想多线程进行,就把node 改成node2,重新复制代码在开一个容器,就可以多线程操作了 -p 7900:7900 是为了能访问novnc
docker run -d -p:7900:7900 -v D:\img:/home/img --net grid -e SE_EVENT_BUS_HOST=selenium-hub --shm-size="2g" -e SE_EVENT_BUS_PUBLISH_PORT=4442 -e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 --name node1 selenium/node-chrome
连接vnc/ novnc
novnc 网页版,novnc 必须开放7900端口
http://localhost:7900/?autoconnect=1&resize=scale&password=secret.
连接多个 novnc
只需要将 在docker 命令中 将电脑端口映射到node 7900 端口就行 例如 :-p 7901:7900
docker run -d -p:7901:7900 -v D:\img:/home/img --net grid -e SE_EVENT_BUS_HOST=selenium-hub --shm-size="2g" -e SE_EVENT_BUS_PUBLISH_PORT=4442 -e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 --name node1 selenium/node-chrome
结果如下:
地址如下: 请直接下载view ,不用下载服务server
https://www.realvnc.com/en/connect/download/viewe
** 密码:secret**
**再次注意,下面客户端VNC是用来连接 selenium/standalone-chrome **
必须是5900端口,因为vnc 的端口是5900
docker run -d -p 4444:4444 -p 5900:5900 --shm-size="2g" selenium/standalone-chrome:latest
selenium grid
本地如下 浏览器输入localhost:4444 就可以打开 只有一个是因为我只开了一个node,如果要多开只需要多开几个node 就行
代码运行
多线程代码
class Thread:
def __init__(self, func, thread_num=1):
"""
:param func: 任务名称
:param thread_num: 默认2 只是为了测试后期可以改
"""
self.thread_num = thread_num
self.func = func
def creat_thread_pool(self):
with ThreadPoolExecutor(max_workers=self.thread_num) as pool:
worker_list = []
for workerId in range(self.thread_num):
# workerId 用来传值给func,区分不同的任务执行不同的脚本文件
worker_result = pool.submit(self.func, workerId)
worker_list.append(worker_result)
# 获得其他线程返回给主线程的结果
for future in as_completed(worker_list):
data = future.result()
print(f"main: {data} tid: {threading.get_ident()}")
启动程序代码
WIDTH = 320
HEIGHT = 640
PIXEL_RATIO = 3.0
mobileEmulation = {"deviceMetrics": {"width": WIDTH, "height": HEIGHT, "pixelRatio": PIXEL_RATIO}}
selenium_grid_url = "http://localhost:4444/wd/hub"
chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option('mobileEmulation', mobileEmulation)
driver = webdriver.Remote(options=chrome_options,
command_executor=selenium_grid_url)
driver.get(path)