selenium 之 获取浏览器Network请求和响应 个人使用习惯

1,067 阅读2分钟

导读

前几篇文章,写了关于selenium 获取浏览器Network请求和响应的常用方法,那这篇就记录一下小编的个人使用,记录一下,以后或许还能用得上

正文

根据 selenium 之 driver.get_logselenium 之 selenium-wireselenium 之 Browsermob-Prox 这三中网络上常见的方法,其实不难发现,selenium-wire 与 Browsermob-Prox 的逻辑是十分相似的;结合个人的实际使用场景,小编这波的综合体 是把Browsermob-Prox 给丢弃了,于是出现了以下综合方案:

上干货!!!

class elementsMethod:

    def drivers(self, _type, driverpath):

        """
        :service : from selenium.webdriver.chrome.service import Service 要使用selenium 4.1.0 以上
        :param driverpath:
        :return:
        """
        if _type == "1":
            from seleniumwire import webdriver
        else:
            from selenium import webdriver


        driverP = Service(r"{}".format(driverpath))

        option = self.chrome_options(_type)
        capabilitie = self.capabilities_options()
        driver = webdriver.Chrome(desired_capabilities=capabilitie, options=option, service=driverP)


        return driver

    def chrome_options(self, _type):
        """定制的options让他看起来更像一个webapp页面"""
        if _type == "1":
            from seleniumwire import webdriver
        else:
            from selenium import webdriver

        options = webdriver.ChromeOptions()

        # # 打开控制台
        # chrome_options.add_argument("--auto-open-devtools-for-tabs")

        # 无界面模式
        # options.add_argument('headless')

        # 指定用户客户端-模拟手机浏览
        # options.add_argument('user-agent="MQQBrowser/26 Mozilla/5.0 (Linux; U; Android 2.3.7; zh-cn; MB200 Build/GRJ22; CyanogenMod-7) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1"')

        # 语言
        options.add_argument('lang=zh_CN.UTF-8')
        # 禁用图片加载
        # options.add_argument('blink-settings=imagesEnabled=false')
        # Chrome 添加参数 log-level
        options.add_argument('--log-level=3')

        # 隐身模式(无痕模式)
        options.add_argument('incognito')

        # 自动打开开发者工具
        # options.add_argument("auto-open-devtools-for-tabs")

        # 设置窗口尺寸,注意宽高之间使用逗号而不是x
        options.add_argument('window-size=1024,768')

        # 设置窗口启动位置(左上角坐标)
        options.add_argument('window-position=0,0')

        # 禁用gpu渲染
        # options.add_argument('disable-gpu')

        # 全屏启动
        # options.add_argument('start-fullscreen')

        # 全屏启动,无地址栏
        # options.add_argument('kiosk')

        # 启动时,不激活(前置)窗口
        # options.add_argument('no-startup-window')

        # 去掉开发者警告
        options.add_experimental_option('useAutomationExtension', False)

        # 去掉黄条
        options.add_experimental_option('excludeSwitches', ['enable-automation'])

        options.add_argument('--ignore-certificate-errors-spki-list')

        options.add_argument('--no-sandbox')

        options.add_experimental_option('perfLoggingPrefs', {'enableNetwork': True})

        return options

    def capabilities_options(self):
        caps = DesiredCapabilities.CHROME
        # 记录性能日志

        caps['goog:loggingPrefs'] = {'performance': 'ALL'}
        return caps

细心的同学 是不是已经发现了!!!

if _type == "1":
    from seleniumwire import webdriver
else:
    from selenium import webdriver

整个方法封装的重点,就在于上述那么4行代码!! 就把 driver.get_log 跟 selenium-wire 根据场合随意切换使用;到这里,应该也会有很多小伙伴有同样的疑问:为什么 用driver.get_log 还要selenium-wire呢?根据 window 11 的运行结果来看 selenium-wire 应该是未来的趋势,另外一点,driver.get_log 限制其实会比较多,没有selenium-wire灵活方便 欢迎各位分享,或指正确,让driver 封装的更强大