【自动化】使用PlayWright+代理IP实现多环境隔离

这篇具有很好参考价值的文章主要介绍了【自动化】使用PlayWright+代理IP实现多环境隔离。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Playwright是由微软公司2020年初发布的新一代自动化测试工具,相较于目前最常用的Selenium,它仅用一个API即可自动执行Chromium、Firefox、WebKit等主流浏览器自动化操作。

对各种开发语言也有非常好的支持。常用的NodeJs、Java、python都有支持,且有丰富的文档参考。

Python环境下的安装使用

1、安装依赖库
pip install playwright

2、安装浏览器驱动文件
安装好依赖库之后,会自动注册全局命令。下面2种方式都可以快速安装驱动文件(驱动就是内置的浏览器)
python -m playwright install
或者:
playwright install

如果命令是python3,替换为pip3 install 和python3 -m 即可。

网上有非常多的教程。安装并非本文的重点。

多环境隔离的应用场景

常见的如爬虫,可能需要使用代理IP隔离开不同的浏览器进行数据抓取。

像另一些需要多号操作的营销内容,也需要多个浏览器互相隔离开。更高要求的才会使用代理+隔离的方式。

产生完全不一样的浏览器环境。比如大量的号去做不同的事。

还有很多常用的场景。独立干净的浏览器环境+Playwright的自动化。可以实现非常多的有趣的应用。

Playwright启动浏览器有几种模式。我们需要先进行了解。

1、普通的无痕模式,用完即销毁。这种方式下,浏览器的历史记录之类的不会保存。适合用于爬虫性的工作。

代码大致是这样的。

browser = pw.chromium.launch(headless=headless, proxy=my_proxy,
                                         ignore_default_args=ignore_args,
                                 args=default_args)

browserContext = browser.new_context(user_agent=userAgent, storage_state=storage_state)

可以指定UserAgent,这是我们模拟不同操作系统和浏览器数据的必填项。
也可以指定headless无头模式,这样浏览器不会有界面出现。背后去工作。

2、普通的持久模式,需要指定用户的数据目录。实现数据的隔离。
比如1号浏览器存到data1,2号存到data2,数据不会冲突,各干各的事,可以同时登陆一个网站的多个账号,互不影响。

不方便的地方在于,每次执行完任务,浏览器会随着程序关闭而关闭。

copy一段网上的示例

# 获取 google chrome 的本地缓存文件
USER_DIR_PATH = f"C:\\Users\\{getpass.getuser()}\\AppData\Local\Google\Chrome\\User Data"

with sync_playwright() as p:
    browser = p.chromium.launch_persistent_context(
                        # 指定本机用户缓存地址,这是隔离环境的主要点,指定不同的目录存放用户的数据。
                        user_data_dir=USER_DIR_PATH,
                        # 接收下载事件,允许下载需要
                        accept_downloads=True,
                        # 设置 GUI 模式,可以看到浏览器界面
                        headless=False,
                        bypass_csp=True,
                        slow_mo=1000,
                        channel="chrome",
                    )

    page = browser.new_page()
    page.goto("https://www.cnblogs.com/yoyoketang")

    page.pause()

3、直连系统的Chrome。如果系统有Chrome浏览器,playwright可以直接连接,并进行操作。但是需要做一些配置。

这也是我目前用得最多的模式。

核心的原理就是使用CDP连接上Chrome。需要开启Chrome时,指定一个调试端口,供我们远程连接上去使用。

官方提供的具体函数是
pw.chromium.connect_over_cdp(cdp_url, timeout=0)

优点在于:
脚本和浏览器分离。脚本开不开,浏览器都不影响。只是需要自动化的时候,脚本才去工作。

缺点:
就是配置略麻烦。好在封装好之后,就是一次的麻烦,后面也会比较顺畅。

如何封装属于自己的快速启动类,python和java都可以,下次再聊。

下面以Chrome浏览器+动态代理为例构建多个不同的环境

由于Chrome自带的proxy 代理功能并不支持带账号密码的代理方式。
而我们采购的代理,肯定都是有账号密码的。

所以核心点是添加一个插件,配置上代理,能支持http和socks5的代理,并支持账号密码进行连接。

然后再通过python,调用系统的浏览器,产生不同的环境,使用不同的代理IP。就能达到目标。

直接上图
【自动化】使用PlayWright+代理IP实现多环境隔离

没有好用的收费代理,本地模拟了一个HK节点的代理。

可以看到4个浏览器的指纹已经不一样了。配合上代理,就是干净的环境了。

核心的逻辑在于启用不同的DataDir用户数据目录,加个独立的代理插件来支持http和socks5的代理,

1、核心1,使用python来快速启动Chrome

if sys.platform.startswith('linux'):  # Linux
    exe_name = 'chrome'
    extParam.append('--no-sandbox')
elif sys.platform.startswith('win'):  # Windows
    win_path = 'C:\Program Files\Google\Chrome\Application\chrome.exe'
    exe_name = win_path if os.path.exists(win_path) else 'chrome.exe'
elif sys.platform.startswith('darwin'):  # Mac
    exe_name = '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome'
    extParam.append('--no-sandbox')

# 启用UA
if config.get('user_agent'):
    extParam.append(fr'--user-agent="{config.get("user_agent")}"')

# 启用无痕
if config.get('incognito'):
    extParam.append('--incognito')

# 无开屏
if config.get('no_window'):
    extParam.append('--no-startup-window')
        
command = fr'"{exe_name}" --remote-debugging-port={port} --user-data-dir="{data_dir}" --no-sandbox --disable-gpu --disable-software-rasterize --disable-background-networking --disable-background-mode --disable-sync --disable-blink-features=AutomationControlled --disable-client-side-phishing-detection --disable-default-apps --disable-desktop-notifications --disable-hang-monitor --disable-infobars --disable-notifications --disable-plugins-discovery --no-first-run --dns-prefetch-disable --ignore-certificate-errors --allow-running-insecure-content --test-type --origin-trial-disabled-features=WebGPU --no-default-browser-check --no-service-autorun --disable-popup-blocking --password-store=basic --disable-web-security --disable-dev-shm-usage --disable-component-update --disable-features=RendererCodeIntegrity --disable-features=FlashDeprecationWarning,EnablePasswordsAccountStorage {" ".join(extParam)}'

os.popen(command)

还有不少代码,就不往上面贴了。

2、核心点2,动态加载插件进不同的Chrome环境,各用各的代理。

def create_proxyauth_extension(proxy_host, proxy_port,
                               proxy_username, proxy_password,
                               scheme='http', plugin_dir=None):
    """
    代理认证插件,返回代理插件的地址
    Chrome使用带账号密码的代理IP
    插件来源:https://github.com/henices/Chrome-proxy-helper
    参考:https://ask.hellobi.com/blog/cuiqingcai/10307#articleHeader5
    https://my.oschina.net/sunboy2050/blog/1858508
    https://github.com/aneasystone/selenium-test/blob/master/08-proxy-with-password.py
    https://developer.chrome.com/extensions/proxy
    args:
        proxy_host (str): 你的代理地址或者域名(str类型)
        proxy_port (int): 代理端口号(int类型)
        proxy_username (str):用户名(字符串)
        proxy_password (str): 密码 (字符串)
    kwargs:
        scheme (str): 代理方式 默认http
        plugin_dir (str): 扩展的目录路径

    return str -> plugin_path
    """

    # 插件目录
    if not plugin_dir:
        plugin_dir = os.path.join(get_data_dir('chrome_plugin'), f'custom_proxyauth_plugin')
    if not os.path.exists(plugin_dir):
        os.makedirs(plugin_dir)

    # 生成的Zip文件地址
    plugin_file = os.path.join(plugin_dir, f"proxy_plugin_{proxy_host}_{proxy_port}.zip")
    # 旧文件清理掉
    if os.path.exists(plugin_file):
        os.remove(plugin_file)

    manifest_json = """
    {
        "version": "1.0.0",
        "manifest_version": 2,
        "name": "Chrome Proxy",
        "permissions": [
            "proxy",
            "tabs",
            "unlimitedStorage",
            "storage",
            "<all_urls>",
            "webRequest",
            "webRequestBlocking"
        ],
        "background": {
            "scripts": ["background.js"]
        },
        "minimum_chrome_version":"22.0.0"
    }
    """

    background_js = string.Template(
        """
        var config = {
                mode: "fixed_servers",
                pacScript: {},
                rules: {
                  singleProxy: {
                    scheme: "${scheme}",
                    host: "${host}",
                    port: ${port}
                  },
                  bypassList: ["foobar.com"]
                }
              };

        chrome.proxy.settings.set({value: config, scope: "regular"}, function() {});

        function callbackFn(details) {
            return {
                authCredentials: {
                    username: "${username}",
                    password: "${password}"
                }
            };
        }

        chrome.webRequest.onAuthRequired.addListener(
                    callbackFn,
                    {urls: ["<all_urls>"]},
                    ['blocking']
        );
        """
    ).substitute(
        host=proxy_host,
        port=proxy_port,
        username=proxy_username,
        password=proxy_password,
        scheme=scheme,
    )

    # 先写ZIP
    with zipfile.ZipFile(plugin_file, 'w') as zp:
        zp.writestr("manifest.json", manifest_json)
        zp.writestr("background.js", background_js)

    # 再手写文件过去
    with open(os.path.join(plugin_dir, 'manifest.json'), 'w+') as fi:
        fi.write(manifest_json)

    with open(os.path.join(plugin_dir, 'background.js'), 'w+') as fi:
        fi.write(background_js)

    return plugin_file

Java也可以用同样的方式实现。后续配上Java的多线程。相信开100个窗口干活,不是什么难事。

Playwright在下载上传方面,比以前的Selenium要强很多。还有很多功能,下次再分享。

关注我的公众号:青塬科技,定期分享经验文章。文章来源地址https://www.toymoban.com/news/detail-837877.html

到了这里,关于【自动化】使用PlayWright+代理IP实现多环境隔离的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Playwright】了解 Playwright 自动化测试工具中 Headless 和非 Headless 模式的使用场景

    在现代 Web 开发中,测试是一个至关重要的部分。自动化测试可以帮助开发人员和测试人员验证应用程序的正确性,并确保在构建过程中不会引入新的问题。Playwright 是一个流行的自动化测试工具,它支持 Headless 和非 Headless 两种模式。 在本文中,田辛老师将探讨这两种模式的

    2024年02月03日
    浏览(46)
  • Python使用HTTP代理实现网络请求的自动化

    随着网络技术的发展,网络请求成为了许多应用的重要组成部分。然而,手动发送网络请求不仅效率低下,而且容易出错。为了解决这个问题,我们可以使用Python来实现网络请求的自动化。而HTTP代理可以帮助我们更好地控制和管理这些请求。 在Python中,有许多库可以用来发

    2024年01月19日
    浏览(47)
  • 【0基础学爬虫】爬虫基础之自动化工具 Playwright 的使用

    大数据时代,各行各业对数据采集的需求日益增多,网络爬虫的运用也更为广泛,越来越多的人开始学习网络爬虫这项技术,K哥爬虫此前已经推出不少爬虫进阶、逆向相关文章,为实现从易到难全方位覆盖,特设【0基础学爬虫】专栏,帮助小白快速入门爬虫,本期为自动化

    2024年02月01日
    浏览(49)
  • python+playwright+pytest+allure+pom+yaml实现UI自动化测试

    https://gitee.com/giteetangll/playwright-demo Auth:登录认证保存后的认证信息 BasePage:封装playwright的基础方法 BuildInLibrary:环境变量存放文件夹,可进行用例参数关联 Common:存放公共方法抽离文件夹 Config:配置文件存放文件夹 Logs:存放断言失败的记录 Pages:存放页面对象文件 Test

    2024年02月11日
    浏览(81)
  • playwright自动化项目搭建

    关键技术: pylaywright测试库 pytest单元测试框架 pytest-playwright插件 非关键技术: pytest-html插件 pytest-rerunfailures插件 seldom 测试框架 实现功能: 元素定位与操作分离 失败自动截图并保存到HTML报告 失败重跑 可配置不同的浏览器执行 可配置 headless/headful  模式 实现参数化读取数

    2024年02月14日
    浏览(35)
  • playwright自动化上传附件

    自动设置上传头像 1. 首先保存本地一个文件,例如 aaa.php 2. 获取输入类型为 \\\"file\\\" 的按钮 3. 将本地保存的图片路径赋值 4. 点击上传按钮

    2024年02月07日
    浏览(45)
  • 使用python调用微步在线接口实现自动化查询IP情报

    目录 一、微步在线接口说明 二、官方示例 三、自动化查询IP情报信息         针对入站场景的IP进行分析, 能够提供IP的地理位置、ASN信息,通过判定规则精准判别IP是否恶意、风险严重级别、可信度级别;识别威胁类型,如:漏洞利用(exploit)、傀儡机(Zombie)、代理

    2024年02月13日
    浏览(49)
  • 自动化神器 Playwright 的 Web 自动化测试解决方案

      1. 主流框架的认识 总结: 由于Selenium在3.x和4.x两个版本的迭代中并没有发生多大的变化,因此Selenium一统天下的地位可能因新框架的出现而变得不那么稳固。 后续的Cypress、TestCafe、Puppeteer被誉为后Selenium时代Web UI自动化的三驾马车。但是由于这三个框架都是基于JavaScript开发

    2024年02月02日
    浏览(60)
  • 基于Playwright自动化测试部署方案

    基于playwright框架,搭建了自动化测试项目,在服务器上使用Docker起容器跑镜像,镜像内容基于playwright的官方镜像,并向其中移入了host文件,以便切换测试用例运行所在的环境(测试/线上环境)。 引入测试用例的管理后台,方便测试用例与测试报告的管理。管理后台中可以

    2024年02月13日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包