日常工作中,我们不可能避免得使用浏览器来完成一些工作,Python 也有不少浏览器自动化的工具,我用过 selenium、splinter、playwright,最终还是选择了微软的 playwright,之所以选择它,是因为它可以自动安装浏览器,不需要手动下载浏览器的驱动程序,比如 chromedriver,这样写出来的自动化工具很容易移植到其他系统中运行。
Playwright 可通过单个 API 自动执行 Chromium,Firefox 和 WebKit浏览器,支持无头浏览器(headless),Linux、macOS、Windows 下均可以使用,Playwright提供的自动化技术是绿色的,功能强大,稳定且速度快。你可以充分发挥空间,想象它可以实现什么样的功能。
安装:
官方文档 https://playwright.dev/python/docs/intro/
pip install playwrightplaywright install
playwright install 将会安装 Chromium,Firefox 和 WebKit 浏览器的二进制文件,非常方便,需要 Python 3.7 及以上版本才行。
先来一段示例代码:
from playwright.sync_api import sync_playwrightwith sync_playwright() as p:browser = p.chromium.launch()page = browser.new_page()page.goto("http://playwright.dev")print(page.title())browser.close()
运行程序后,程序会自动打开浏览器,访问 http://playwright.dev,并打印网站的标题。
自动生成代码
Playwright 最吸引我的地方在于它可以自己记录你对浏览器的操作,并将这些操作生成可以执行的代码,这简直就是神器,大大提升了浏览器自动化的效率。生成代码只需要执行
python -m playwright codegen baidu.com
可以生成如下代码:
from playwright.sync_api import Playwright, sync_playwrightdef run(playwright: Playwright) -> None:browser = playwright.chromium.launch(headless=False)context = browser.new_context()# Open new pagepage = context.new_page()# Go to https://www.baidu.com/page.goto("https://www.baidu.com/")# Click input[name="wd"]page.click("input[name=\"wd\"]")# Fill input[name="wd"]page.fill("input[name=\"wd\"]", "playwright ")# Press CapsLockpage.press("input[name=\"wd\"]", "CapsLock")# Fill input[name="wd"]page.fill("input[name=\"wd\"]", "playwright 教程")# 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=playwright%20%E6%95%99%E7%A8%8B&fenlei=256&rsv_pq=880cdb05002fe1ed&rsv_t=19abqiURFrqQT3i6%2F84nvsfVrJlI%2B1T6XbVpQkOap78JGssznOJ4%2FVasRzE&rqlang=cn&rsv_dl=tb&rsv_enter=1&rsv_sug3=23&rsv_sug1=20&rsv_sug7=100&rsv_sug2=0&rsv_btype=i&inputT=6608&rsv_sug4=11435&rsv_jmp=fail"):with page.expect_navigation():page.press("input[name=\"wd\"]", "Enter")# Click text=Playwright-python 教程_天下任我行-CSDN博客# with page.expect_navigation(url="https://blog.csdn.net/lb245557472/article/details/111572119"):with page.expect_navigation():with page.expect_popup() as popup_info:page.click("text=Playwright-python 教程_天下任我行-CSDN博客")page1 = popup_info.value# Click text=×page1.click("text=×")# ---------------------context.close()browser.close()with sync_playwright() as playwright:run(playwright)
如何与浏览器的元素进行交互
先熟悉一些概念
浏览器
浏览器就是指浏览器的一个实例,可以是 Chromium, Firefox 或 WebKit,Playwright 脚本通常从打开一个浏览器开始,以关闭浏览器作为结束,可以使用无头浏览器模式,也就是说虽然打开了浏览器,但是看不到浏览器启动和操作的过程,这是隐藏的。
from playwright.sync_api import sync_playwrightwith sync_playwright() as p:browser = p.chromium.launch(headless=False)browser.close()
浏览器上下文
浏览器上下文是浏览器实例中孤立的匿名会话。浏览器上下文创建速度快且价格低廉。我们建议在自己的新浏览器上下文中运行每个测试场景,以便在测试之间隔离浏览器状态。浏览器上下文还可用于模拟涉及移动设备、权限、区域设置和配色方案的多页场景。
browser = playwright.chromium.launch()context = browser.new_context()
页面和框架
浏览器上下文可以有多个页面。页面是指浏览器上下文中的单个选项卡或弹出窗口。它应该用于导航到 URL 并与页面内容交互。
page = context.new_page()# 显式导航,类似于在浏览器中输入URL。page.goto('http://example.com')# 填写输入。page.fill('#search', 'query')# 点击链接隐式导航。page.click('#submit')# 期待一个新的网址。print(page.url)# 页面可以从脚本导航 - 剧作家将接取。# window.location.href = 'https://example.com'
一个页面可以附加一个或多个 Frame 对象。 每个页面都有一个主框架,假设页面级交互(如点击)在主框架中运行。
一个页面可以有附加的附加框架和 iframe HTML 标签。 可以访问这些 iframe:
# Get frame using the frame's name attributeframe = page.frame('frame-login')# Get frame using frame's URLframe = page.frame(url=r'.*domain.*')# Get frame using any other selectorframe_element_handle = page.query_selector('.frame-class')frame = frame_element_handle.content_frame()# Interact with the frameframe.fill('#username-input', 'John')
选择器
选择器就是选取 html 页面内元素的工具。
Playwright 可以使用 CSS 选择器、XPath 选择器、id 等 HTML 属性、data-test-id 甚至文本内容搜索元素。
您可以显式指定您正在使用的选择器引擎,或让 Playwright 检测到它。
Playwright 的选择器是非常直观好用的,在这里了解更多关于选择器和选择器引擎的信息。
