超级浏览器Webdriver自动化开发

一、概述

通过Webdriver实现对超级浏览器内的店铺进行,自动化控制以及数据抓取,主要流程分为以下两个部分

(一)与超级浏览器主进程通信。

这个部分是通过Socket实现与超级浏览器主进实现通讯的,主要工作是获取店铺列表以及准备店铺环境,一个店铺相当于一个独立浏览器。

import json
import subprocess
from socket import *
from selenium import webdriver
from db.db_redis import DBRedis
from common.utility import Utility
from common.mapping import Mapping
from common.global_logger import logger
from selenium.webdriver import ActionChains
from selenium.common.exceptions import NoSuchElementException


class SuperBrowser(object):

    # 基础配置
    utils = Utility()
    config = utils.confg

    # 初始化Redis服务
    obj_redis = DBRedis()

    # 获取业务类型
    business_type = config.get(\'business_type\')
    logger.info("business_type: %s" % business_type)

    # 指定使用英语
    __LANGUAGE = config.get(\'language\')

    # ----------------------------------------->> Socket通信地址端口
    host = config.get(\'socket_host\')
    port = int(config.get(\'socket_port\'))
    logger.info(\'socket > host: %s, port: %s\' % (host, port))
    # ----------------------------------------->> 请求紫鸟超级浏览器API方法
    __GET_BROWSER_LIST = "getBrowserList"         # 获取店铺列表
    __START_BROWSER = "startBrowser"              # 启动店铺(主程序)
    __STOP_BROWSER = "stopBrowser"                # 关闭店铺窗口
    __GET_BROWSER_ENV_INFO = "getBrowserEnvInfo"  # 启动店铺(webdriver)
    __HEARTBEAT = "heartbeat"                     # 非必要接口,只是用于保活Socket连接
    __EXIT = "exit"                               # 正常退出超级浏览器主进程,会自动关闭已启动店铺并保持店铺cookie等信息。

    def __init__(self):
        logger.info("初始化Socket连接...")
        logger.info("启动紫鸟浏览器......")

        self.buf_size = int(self.config.get(\'socket_buf_size\'))
        self.IS_HEADLESS = self.config.get(\'browser_is_headless\')     # 浏览器是否启用无头模式 false 否、true 是

        # 获取紫鸟·超级浏览器安装路径
        path_super_browser = self.config.get(\'path_super_browser\')
        cmd = "{} --run_type=web_driver --socket_port={}".format(path_super_browser, self.port)
        subprocess.Popen(cmd)
        try:
            # ------------------------------创建套接字通道
            self.address = (self.host, self.port)
            self.tcpCliSock = socket(AF_INET, SOCK_STREAM)  # 创建套接字
            self.tcpCliSock.connect(self.address)           # 主动初始化TCP服务器连接
        except ConnectionRefusedError as e:
            logger.error(e)
            subprocess.Popen(\'taskkill /f /im superbrowser.exe\')
        except Exception as e:
            logger.error(e)

    def browser_api(self, action, args=None):
        """
        紫鸟·超级浏览器API
        :param action: 方法
        :param args: 可选参数
        :return:
        """
        REQUEST_ID = "0123456789"  # 全局唯一标识
        user_info = json.dumps({   # 用户信息
            "company": self.config.get(\'browser_company_name\'),
            "username": self.config.get(\'browser_username\'),
            "password": self.config.get(\'browser_password\')
        })
        # 默认为获取店铺列表
        common = {"userInfo": user_info, "action": self.__GET_BROWSER_LIST, "requestId": REQUEST_ID}
        if action == self.__START_BROWSER or action == self.__GET_BROWSER_ENV_INFO or action == self.__STOP_BROWSER:
            common[\'browserOauth\'] = args[\'browserOauth\']
            common[\'isHeadless\'] = args[\'isHeadless\']
        common[\'action\'] = action
        return common  

    def socket_communication(self, params):
        """
        Socket通信
        :param params: 参数对象
        :return:
        """
        try:
            args = (str(params) + \'\r\n\').encode(\'utf-8\')
            # 将 string 中的数据发送到连接的套接字
            self.tcpCliSock.send(args)
            # 接收的最大数据量
            res = self.tcpCliSock.recv(self.buf_size)
            return json.loads(res)
        except ConnectionResetError as e:
            logger.warning("ConnectionResetError: %s" % e)
            logger.info("socket 连接已关闭")
        except Exception as e:
            logger.error("socket_communication error: %s" % e)
        pass

    # 举个栗子
版权声明:本文为skyxing7原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/skyxing7/p/14929290.html