微软开源 Python 自动化神器 Playwright

背景

逛博客时候突然看到 Playwright web自动化,感觉很有意思,就翻看了很多博客,简单记录一下。

简介

 Playwright是一个强大的Python库,仅用一个API即可自动执行Chromium、Firefox、WebKit等主流浏览器自动化操作,并同时支持以无头模式、有头模式运行。

 添加了默认等待时间增加脚本稳定性,并提供视频录制、网络请求支持、自定义的定位器、自带调试器等新特性。

 支持Linux、Mac以及Windows操作系统。

安装

安装playwright库
pip install playwright
安装浏览器驱动文件
python -m playwright install

录制

命令行键入 --help 可看到所有选项
python -m playwright codegen
codegen的用法可以使用--help查看,如果简单使用就是直接在命令后面加上url链接,如果有其他需要可以添加options。

options含义:

  • -o:将录制的脚本保存到一个文件
  • --target:规定生成脚本的语言,有JS和Python两种,默认为Python
  • -b:指定浏览器驱动

以百度为例:在搜索,用chromium驱动,将结果保存为baidu.py。

python -m playwright codegen --target python -o baidu.py -b chromium https://www.baidu.com

关闭浏览器,保存生成自动化脚本到baidu.py文件中。

from playwright.sync_api import sync_playwright #导入playwright

def run(playwright):
    browser = playwright.chromium.launch(headless=False) # 创建chromium的browser对象,当前使用的是playwright安装的自带的chromium,headless=False有头模式,True无头模式
    context = browser.new_context() #创建context对象

    # Open new page
    page = context.new_page() # 创建page对象,真正打开浏览器界面

    # Go to https://www.baidu.com/
    page.goto("https://www.baidu.com/") # 跳转到百度url

    # Click input[name="wd"]
    page.click("input[name=\"wd\"]") # 定位在搜索框点击

    # Fill input[name="wd"]
    page.fill("input[name=\"wd\"]", "软件测试")# 定位在搜索框中输入"软件测试"

    # Press Enter
    # with page.expect_navigation(url="https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95&fenlei=256&rsv_pq=0xd33492f3000b66d2&rsv_t=7145nMfAB9Fhb5tkliRqZqj9RKsimjMqBXoFayyaZh5kiDbctolZSBfx5DAf&rqlang=en&rsv_enter=1&rsv_dl=tb&rsv_sug3=4&rsv_sug1=1&rsv_sug7=100&rsv_sug2=0&rsv_btype=i&prefixsug=rua&rsp=5&inputT=2158&rsv_sug4=2906"):
    with page.expect_navigation():
        page.press("input[name=\"wd\"]", "Enter")#回车

    # Close page
    page.close()

    # ---------------------
    context.close()# 关闭context
    browser.close()# 关闭browser

with sync_playwright() as playwright:
    run(playwright)

playwright还提供了同步和异步。

同步

from playwright.sync_api import sync_playwright


with sync_playwright() as p:
 for browser_type in [p.chromium, p.firefox]:
        browser = browser_type.launch(headless=False)
        context = browser.new_context()

        page = browser.new_page()
        page.goto("https://www.baidu.com/")
        page.click("input[name=\"wd\"]")
        page.fill("input[name=\"wd\"]", "软件测试")
        with page.expect_navigation():
            page.press("input[name=\"wd\"]", "Enter")

        # Close page
        page.close()

        # ---------------------
        context.close()
        browser.close()

异步

import asyncio
from playwright.async_api import async_playwright
async def main():
    async with async_playwright() as p:
        for browser_type in [p.chromium, p.firefox]:
            browser = await browser_type.launch(headless=False)
            #context = await browser.new_context()

            page = await browser.new_page()
            await page.goto("https://www.baidu.com/")
            await page.click("input[name=\"wd\"]")
            await page.fill("input[name=\"wd\"]", "软件测试")
            await page.press("input[name=\"wd\"]", "Enter")

            # Close page
            await page.close()

            # ---------------------
            #await context.close()
            await browser.close()
asyncio.get_event_loop().run_until_complete(main())

 

posted @ 2023-03-03 15:54  叶修_z  阅读(169)  评论(0编辑  收藏  举报