自动化测试工具playwright中文文档-------7.开始使用

目录

安装

Pip

Conda 

使用

第一个脚本

交互式模式(REPL)

Pyinstaller

已知问题

time.sleep() 导致状态过时

与Windows上asyncio的SelectorEventLoop不兼容

线程


安装

Pip

pip install --upgrade pip
pip install playwright
playwright install

Conda 

conda config --add channels conda-forge
conda config --add channels microsoft
conda install playwright
playwright install

这些命令会下载Playwright包,并安装Chromium、Firefox和WebKit的浏览器二进制文件。要修改此行为,请参阅安装参数 installation parameters

使用

安装完成后,您可以在Python脚本中导入Playwright,并启动三种浏览器中的任何一种(chromium、firefox和webkit)。

from playwright.sync_api import sync_playwright  
  
# 使用with语句确保Playwright资源被正确清理  
with sync_playwright() as p:  
    # 启动Chromium浏览器  
    browser = p.chromium.launch()  
    # 创建一个新页面  
    page = browser.new_page()  
    # 导航到Playwright的官方网站  
    page.goto("http://playwright.dev")  
    # 打印当前页面的标题  
    print(page.title())  
    # 关闭浏览器  
    browser.close()

这段代码展示了如何使用Playwright的同步API来启动一个Chromium浏览器实例,导航到一个网页,打印出该网页的标题,并最后关闭浏览器。sync_playwright()函数用于创建一个Playwright实例,该实例提供了访问不同浏览器(如chromium)的接口。每个浏览器实例都可以用来创建新的页面(browser.new_page()),执行各种页面操作(如page.goto()用于导航),并获取页面信息(如page.title()用于获取页面标题)。最后,使用browser.close()来关闭浏览器。

Playwright支持两种API变体:同步和异步。如果您的现代项目使用asyncio,则应该使用异步API:

import asyncio  
from playwright.async_api import async_playwright  
  
async def main():  
    # 使用async with语句确保Playwright资源被正确清理  
    async with async_playwright() as p:  
        # 异步启动Chromium浏览器  
        browser = await p.chromium.launch()  
        # 异步创建一个新页面  
        page = await browser.new_page()  
        # 异步导航到Playwright的官方网站  
        await page.goto("http://playwright.dev")  
        # 异步打印当前页面的标题  
        print(await page.title())  
        # 异步关闭浏览器  
        await browser.close()  
  
# 运行异步主函数  
asyncio.run(main())

展示了如何使用Playwright的异步API来异步地启动一个Chromium浏览器实例,导航到一个网页,异步地打印出该网页的标题,并最后异步地关闭浏览器。async_playwright()函数用于创建一个异步的Playwright实例,该实例同样提供了访问不同浏览器的接口。注意,在异步API中,所有涉及I/O操作(如启动浏览器、创建页面、导航等)的函数都需要使用await关键字来等待操作完成。最后,使用asyncio.run(main())来运行异步的主函数。

第一个脚本

在我们的第一个脚本中,我们将导航到 Fast and reliable end-to-end testing for modern web apps | Playwright 并使用WebKit浏览器截取屏幕截图。

from playwright.sync_api import sync_playwright  
  
# 使用with语句来确保Playwright资源被正确管理  
with sync_playwright() as p:  
    # 启动WebKit浏览器  
    browser = p.webkit.launch()  
    # 创建一个新页面  
    page = browser.new_page()  
    # 导航到Playwright的官方网站  
    page.goto("https://playwright.dev/")  
    # 截取当前页面的屏幕截图,并保存到example.png文件中  
    page.screenshot(path="example.png")  
    # 关闭浏览器  
    browser.close()

page.screenshot(path="example.png")这行代码负责截取屏幕截图,并将截图保存到当前目录下的example.png文件中。

默认情况下,Playwright以无头模式运行浏览器。要查看浏览器用户界面,请在启动浏览器时传递headless=False标志。您还可以使用slow_mo来减慢执行速度。在调试工具部分可以了解更多信息。

firefox.launch(headless=False, slow_mo=50)

代码展示了如何以非无头模式(即带有用户界面的模式)启动Firefox浏览器,并通过设置slow_mo=50来减慢执行速度,使得每个操作之间的时间间隔为50毫秒。这有助于您在调试时更清楚地看到浏览器执行操作的过程。

交互式模式(REPL)

您可以启动Python的交互式解释器(REPL):

python

然后在其中启动Playwright以进行快速实验:

from playwright.sync_api import sync_playwright
playwright = sync_playwright().start()
# Use playwright.chromium, playwright.firefox or playwright.webkit
# Pass headless=False to launch() to see the browser UI
browser = playwright.chromium.launch()
page = browser.new_page()
page.goto("https://playwright.dev/")
page.screenshot(path="example.png")
browser.close()
playwright.stop()

异步REPL,如asyncio REPL:

python -m asyncio
from playwright.async_api import async_playwright
playwright = await async_playwright().start()
browser = await playwright.chromium.launch()
page = await browser.new_page()
await page.goto("https://playwright.dev/")
await page.screenshot(path="example.png")
await browser.close()
await playwright.stop()

Pyinstaller

您可以使用Pyinstaller与Playwright结合来创建独立的可执行文件。这样,您的Python脚本(包括Playwright操作)就可以在没有安装Python环境的机器上运行了。

以下是一个简单的main.py脚本示例,

# main.py  
from playwright.sync_api import sync_playwright  
  
# 使用with语句来确保Playwright资源被正确管理  
with sync_playwright() as p:  
    browser = p.chromium.launch()  # 启动Chromium浏览器  
    page = browser.new_page()  # 创建一个新页面  
    page.goto("https://playwright.dev/")  # 导航到Playwright的官方网站  
    page.screenshot(path="example.png")  # 截取屏幕截图并保存到example.png  
    browser.close()  # 关闭浏览器

如果你想要将浏览器与可执行文件一起打包:

# Bash
PLAYWRIGHT_BROWSERS_PATH=0 playwright install chromium
pyinstaller -F main.py

PLAYWRIGHT_BROWSERS_PATH=0 playwright install chromium 实际上是在告诉 Playwright 忽略系统上的任何已安装的浏览器,并使用 Playwright 管理的浏览器版本。这里,PLAYWRIGHT_BROWSERS_PATH=0 是一个环境变量设置,它告诉 Playwright 不要从默认的浏览器路径(如环境变量中指定的路径)查找浏览器,而是使用 Playwright 下载的浏览器。

当你运行 pyinstaller -F main.py 时,-F 或 --onefile 选项会告诉 PyInstaller 创建一个单独的可执行文件,该文件包含了你的 Python 脚本及其依赖项(但不包括浏览器二进制文件,因为 Playwright 会根据需要下载它们)。

重要的是要确保在打包后的可执行文件运行的环境中,Playwright 能够访问互联网以下载所需的浏览器版本(如果尚未下载的话)。如果这不可行,你可能需要考虑在打包之前手动下载浏览器并将其放置在 Playwright 能够找到的位置,但这通常不是推荐的做法,因为它增加了打包的复杂性和可执行文件的大小。

# PowerShell

$env:PLAYWRIGHT_BROWSERS_PATH="0"
playwright install chromium
pyinstaller -F main.py
# Batch
set PLAYWRIGHT_BROWSERS_PATH=0
playwright install chromium
pyinstaller -F main.py

请注意
将浏览器与可执行文件捆绑在一起将生成更大的二进制文件。建议只绑定您使用的浏览器。

已知问题

time.sleep() 导致状态过时

很可能你不需要手动等待,因为 Playwright 提供了自动等待功能。如果你仍然需要依赖它,你应该使用 page.wait_for_timeout(5000) 而不是 time.sleep(5)。而且,最好不要设置超时等待,但有时在调试时它是有用的。在这些情况下,请使用我们的等待(wait_for_timeout)方法代替 time 模块的方法。这是因为我们在内部依赖于异步操作,而使用 time.sleep(5) 时,这些异步操作无法被正确处理。

与Windows上asyncio的SelectorEventLoop不兼容

Playwright在子进程中运行驱动程序,因此在Windows上它需要asyncio的ProactorEventLoop,因为SelectorEventLoop不支持异步子进程。

在Windows Python 3.7上,Playwright会将默认事件循环设置为ProactorEventLoop,因为从Python 3.8+开始,这就是默认设置。这意味着在Windows平台上,如果你使用的是Python 3.7或更低版本,并且希望使用Playwright,那么你可能需要确保你的代码或Playwright的某些部分能够正确设置事件循环为ProactorEventLoop,以便能够支持异步子进程。不过,请注意,从Python 3.8开始,这通常是自动处理的,因此不需要额外设置。

线程

Playwright 的 API 不是线程安全的。如果你在多线程环境中使用 Playwright,你应该为每个线程创建一个 Playwright 实例。更多详情,请参阅线程问题threading issue相关文档。

这意味着,在多线程应用程序中,你不能在多个线程之间共享同一个 Playwright 实例,因为这样做可能会导致数据竞争和其他并发问题。相反,每个线程都应该创建并管理自己的 Playwright 实例,以确保操作的独立性和线程安全。

  • 19
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值