日常工作中,我们不可能避免得使用浏览器来完成一些工作,Python 也有不少浏览器自动化的工具,我用过 selenium、splinter、playwright,最终还是选择了微软的 playwright,之所以选择它,是因为它可以自动安装浏览器,不需要手动下载浏览器的驱动程序,比如 chromedriver,这样写出来的自动化工具很容易移植到其他系统中运行。

Playwright 可通过单个 API 自动执行 Chromium,Firefox 和 WebKit浏览器,支持无头浏览器(headless),Linux、macOS、Windows 下均可以使用,Playwright提供的自动化技术是绿色的,功能强大,稳定且速度快。你可以充分发挥空间,想象它可以实现什么样的功能。

安装:

官方文档 https://playwright.dev/python/docs/intro/

  1. pip install playwright
  2. playwright install

playwright install 将会安装 Chromium,Firefox 和 WebKit 浏览器的二进制文件,非常方便,需要 Python 3.7 及以上版本才行。

先来一段示例代码:

  1. from playwright.sync_api import sync_playwright
  2. with sync_playwright() as p:
  3. browser = p.chromium.launch()
  4. page = browser.new_page()
  5. page.goto("http://playwright.dev")
  6. print(page.title())
  7. browser.close()

运行程序后,程序会自动打开浏览器,访问 http://playwright.dev,并打印网站的标题。

自动生成代码

Playwright 最吸引我的地方在于它可以自己记录你对浏览器的操作,并将这些操作生成可以执行的代码,这简直就是神器,大大提升了浏览器自动化的效率。生成代码只需要执行

  1. python -m playwright codegen baidu.com

可以生成如下代码:

  1. from playwright.sync_api import Playwright, sync_playwright
  2. def run(playwright: Playwright) -> None:
  3. browser = playwright.chromium.launch(headless=False)
  4. context = browser.new_context()
  5. # Open new page
  6. page = context.new_page()
  7. # Go to https://www.baidu.com/
  8. page.goto("https://www.baidu.com/")
  9. # Click input[name="wd"]
  10. page.click("input[name=\"wd\"]")
  11. # Fill input[name="wd"]
  12. page.fill("input[name=\"wd\"]", "playwright ")
  13. # Press CapsLock
  14. page.press("input[name=\"wd\"]", "CapsLock")
  15. # Fill input[name="wd"]
  16. page.fill("input[name=\"wd\"]", "playwright 教程")
  17. # Press Enter
  18. # 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"):
  19. with page.expect_navigation():
  20. page.press("input[name=\"wd\"]", "Enter")
  21. # Click text=Playwright-python 教程_天下任我行-CSDN博客
  22. # with page.expect_navigation(url="https://blog.csdn.net/lb245557472/article/details/111572119"):
  23. with page.expect_navigation():
  24. with page.expect_popup() as popup_info:
  25. page.click("text=Playwright-python 教程_天下任我行-CSDN博客")
  26. page1 = popup_info.value
  27. # Click text=×
  28. page1.click("text=×")
  29. # ---------------------
  30. context.close()
  31. browser.close()
  32. with sync_playwright() as playwright:
  33. run(playwright)

如何与浏览器的元素进行交互

先熟悉一些概念

浏览器

浏览器就是指浏览器的一个实例,可以是 Chromium, Firefox 或 WebKit,Playwright 脚本通常从打开一个浏览器开始,以关闭浏览器作为结束,可以使用无头浏览器模式,也就是说虽然打开了浏览器,但是看不到浏览器启动和操作的过程,这是隐藏的。

  1. from playwright.sync_api import sync_playwright
  2. with sync_playwright() as p:
  3. browser = p.chromium.launch(headless=False)
  4. browser.close()

浏览器上下文

浏览器上下文是浏览器实例中孤立的匿名会话。浏览器上下文创建速度快且价格低廉。我们建议在自己的新浏览器上下文中运行每个测试场景,以便在测试之间隔离浏览器状态。浏览器上下文还可用于模拟涉及移动设备、权限、区域设置和配色方案的多页场景。

  1. browser = playwright.chromium.launch()
  2. context = browser.new_context()

页面和框架

浏览器上下文可以有多个页面。页面是指浏览器上下文中的单个选项卡或弹出窗口。它应该用于导航到 URL 并与页面内容交互。

  1. page = context.new_page()
  2. # 显式导航,类似于在浏览器中输入URL。
  3. page.goto('http://example.com')
  4. # 填写输入。
  5. page.fill('#search', 'query')
  6. # 点击链接隐式导航。
  7. page.click('#submit')
  8. # 期待一个新的网址。
  9. printpage.url
  10. # 页面可以从脚本导航 - 剧作家将接取。
  11. # window.location.href = 'https://example.com'

一个页面可以附加一个或多个 Frame 对象。 每个页面都有一个主框架,假设页面级交互(如点击)在主框架中运行。

一个页面可以有附加的附加框架和 iframe HTML 标签。 可以访问这些 iframe:

  1. # Get frame using the frame's name attribute
  2. frame = page.frame('frame-login')
  3. # Get frame using frame's URL
  4. frame = page.frame(url=r'.*domain.*')
  5. # Get frame using any other selector
  6. frame_element_handle = page.query_selector('.frame-class')
  7. frame = frame_element_handle.content_frame()
  8. # Interact with the frame
  9. frame.fill('#username-input', 'John')

选择器

选择器就是选取 html 页面内元素的工具。

Playwright 可以使用 CSS 选择器、XPath 选择器、id 等 HTML 属性、data-test-id 甚至文本内容搜索元素。

您可以显式指定您正在使用的选择器引擎,或让 Playwright 检测到它。

Playwright 的选择器是非常直观好用的,在这里了解更多关于选择器和选择器引擎的信息。