微软开源 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:指定浏览器驱动
以百度为例:在http://baidu.com搜索,用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())