python+selenium+grid+多进程实现分布式

一.前言

实现场景:同时实现两个用户在不同电脑上登录。
前提:必须安装jdk

二.grid环境部署

1.master机上部署grid

grid下载地址:http://selenium-release.storage.googleapis.com/index.html,下载的版本一定要与master机的selenium版本一致。我的是3.141.0
python+selenium+grid+多进程实现分布式_第1张图片

将下载好的jar包放在某个路径下,输入命令启动grid,成功如下图

java -jar selenium-server-standalone-3.141.0.jar -role hub

python+selenium+grid+多进程实现分布式_第2张图片
通过http://192.168.10.117:4444/grid/console可直接访问Grid控制台。IP根据自己的实际情况而定。
python+selenium+grid+多进程实现分布式_第3张图片

2.slave及启动grid(连接master机)
将jar包复制到slave机上某个路径下,输入命令启动grid,成功如下图。注意:slave机里chromedriver.exe一定要与其谷歌浏览器版本对应,不然会出错

java -Dwebdriver.chrome.driver="C:\Users\Administrator\Desktop\grid\chromedriver.exe" -jar selenium-server-standalone-3.141.0.jar -role webdriver -hub http://192.168.10.117:4444/grid/register/ -port 7778 -maxSession 5

-Dwebdriver.chrome.driver:表明驱动路径
-hub:表示master机的grid地址
-port:指定端口
-maxSession:一台计算机同时允许打开多少个浏览器窗口(建立会话)
python+selenium+grid+多进程实现分布式_第4张图片

三.代码实现

1.代码

from core import driver
from Page import UpFile
from time import sleep
from selenium import webdriver
from multiprocessing import Pool


class GridLogin():

    def upfile(self, username):
        '''
        进行登录
        @param username: 用户名
        @return:
        '''
        if username == 'username100':
            '''判断用户,若是username100在本地打开浏览器'''
            self.driver = driver()
            self.lw = UpFile(self.driver)
            sleep(2)

        else:
            '''判断用户,若是username200远程启动192.168.10.158:7778打开浏览器'''
            chrome_capabilities = {
                "browserName": "chrome",
                "version": "81.0.4044.138",  # 注意版本号一定要写对
                "platform": "ANY",
                "javascriptEnabled": True,
                "marionette": True
            }
            self.driver = webdriver.Remote("http://192.168.10.158:7778/wd/hub",
                                           desired_capabilities=chrome_capabilities)  # 注意端口号4444是我们上文中映射的宿主机端口号
            self.lw = UpFile(self.driver)

        self.lw.open()
        self.lw.sign_in(username=username, password='admin123', captcha=1)
        self.lw.quit()

    def run(self):
        '''
        多进程执行
        @return:
        '''
        # 配置登录的账号
        username = ['username100', 'username200']
        # 设置线程数
        pool = Pool(processes=2)
        for i in username:
            '''
             (1)循环遍历,将2个子进程添加到进程池(相对父进程会阻塞)'
             (2)每次执行2个子进程,等一个子进程执行完后,立马启动新的子进程。(相对父进程不阻塞)'
            '''
            pool.apply_async(self.upfile, args=(i,))
        pool.close()
        pool.join()


if __name__ == '__main__':
    GridLogin().run()

2.代码解释
self.lw = UpFile(self.driver):这行代码我在类的底层进行封装了一些方法,所以我在这里必须实例化,具体的使用要根据你们真实情况而定。

self.driver = webdriver.Remote:这行代码主要是连接salve机,IP是slave的IP地址,端口是启动slave时输入的端口 -p

run:这个方法主要是实现多进程,详情可参考:https://blog.csdn.net/qq_36076898/article/details/106137131

你可能感兴趣的:(python自动化)