说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
Playwright 是由微软开发的一款跨浏览器自动化测试工具和浏览器自动化库。它提供了一个统一的API,可以用于控制多种不同类型的浏览器,包括 Chromium(包括 Chrome 和 Microsoft Edge)、WebKit 和 Firefox。
Playwright 的目标是为开发人员提供一种简单、可靠和高效的方式来编写浏览器自动化脚本。与其他自动化测试工具相比,Playwright 提供了更广泛的跨浏览器支持,并具有更好的性能和稳定性。
安装 Playwright 及环境:
# 安装库
pip install playwright
conda install -c microsoft playwright
# 安装默认的浏览器(推荐)
playwright install
python -m playwright install # 同上
# 安装指定的浏览器,可用的有:
# chromium, chrome, chrome-beta,
# msedge, msedge-beta, msedge-dev, firefox, webkit
playwright install chromium firefox
执行以上安装命令,Playwright 会自动帮助我们安装浏览器驱动,相比 Selenium 的手动配置,更加省心、简单。
每个版本的Playwright都需要特定版本的浏览器二进制文件才能操作。您需要使用Playwright CLI来安装这些浏览器。
每次发布时,Playwright都会更新其支持的浏览器版本,以便最新的Playwright随时支持最新的浏览器。这意味着每次更新Playwright时,可能需要重新运行install CLI命令。
# 系统依赖项可以自动安装
playwright install-deps
# 您也可以通过将其作为参数传递来安装单个浏览器的依赖项
playwright install-deps chromium
# 还可以将install-dep与install结合起来
playwright install --with-deps chromium
安装后,您可以在Python脚本中导入Playwright,并启动这三种浏览器中的任何一种(chrome、firefox和webkit)。以下是一个简单的使用示例:
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
page.goto("http://playwright.dev")
print(page.title())
browser.close()
异步的版本:
import asyncio
from playwright.async_api import async_playwright
async def main():
async with async_playwright() as p:
browser = await p.chromium.launch()
page = await browser.new_page()
await page.goto("http://playwright.dev")
print(await page.title())
await browser.close()
asyncio.run(main())
默认情况下,Playwright以无头模式运行浏览器。要查看浏览器UI,请在启动浏览器时传递 headless=False
标志。您也可以使用 slow_mo 来降低执行速度。在调试工具部分了解更多信息。
firefox.launch(headless=False, slow_mo=50)
Playwright 的8个主要优点:
1、跨浏览器支持:Playwright支持Chromium、Firefox和WebKit等主流浏览器,可在不同浏览器执行自动化测试。
2、运行速度快:Playwright使用“无头浏览器”技术,不需要打开浏览器窗口,所以测试运行速度更快,可快速执行CI/CD中的测试。
3、简洁易用的API:相比Selenium,Playwright的API更直观简单,易于使用,降低了学习门槛。
4、高可靠性:Playwright提供更多错误处理和调试工具,可以更轻松地定位和解决问题,确保测试的稳定性。
5、易维护:Playwright的API简洁,测试脚本易于编写、调试和维护。同时,丰富的文档和示例可以快速入门。
6、与Python深度集成:Playwright与Python以及Pytest深度集成,编写和调用测试更加方便灵活。
7、双向通信:Playwright基于Websocket,与浏览器双向通信,可以更好地控制浏览器状态和元素,减少由于元素不可操作导致的失败。
8、自动等待机制:Playwright的大部分操作都带自动等待,可以根据操作类型判断元素状态,不需要人为添加等待逻辑,降低测试脚本的复杂度。
Selenium 是最常用的测试库,也经常用于数据爬虫,但它需要自己手动装驱动,同时要防止浏览器升级导致驱动不可用。
Playwright 在浏览器自动化领域具有广泛的应用。下面是一些 Playwright 的主要用途:
总之,Playwright 是一个功能强大的工具,适用于各种浏览器自动化任务,包括测试、截图、数据爬取和自动化流程。它为开发人员提供了一种简单而强大的方式来控制浏览器并与 Web 应用程序进行交互。
browser 对象是 Playwright 库中用于管理浏览器实例的主要对象,它提供了许多方法和属性,用于管理浏览器和上下文(Context),并执行与浏览器相关的操作。
以下是一些 browser 对象的常用方法和属性:
在 browser 对象上执行的方法和操作通常会影响到所有上下文和页面。因此,需要谨慎地使用这些方法和操作,以免对已经打开的页面产生意外的影响。
下面是一个简单的示例,展示如何使用 browser 对象来创建新的上下文和页面:
from playwright.sync_api import sync_playwright
def main():
with sync_playwright() as playwright:
browser = playwright.chromium.launch()
context = browser.new_context()
page = context.new_page()
page.goto('https://www.google.com/')
# 其他操作...
browser.close()
if __name__ == '__main__':
main()
在这个示例中,我们使用 browser 对象的 new_context 方法创建一个新的上下文,并使用 new_page 方法在该上下文中创建新的页面。在这个页面中,我们通过 goto 方法打开了 Google 的主页。最后,我们使用 close 方法关闭了浏览器实例。
Page 对象是 Playwright 库中用于表示浏览器页面的主要对象。通过 Page 对象,你可以执行各种与页面相关的操作,如导航、截图、填充表单、执行 JavaScript 等。
通过 Page 对象,你可以在浏览器页面上执行各种操作,与元素交互,获取页面信息,以及与页面进行交互。这使得 Playwright 成为一个强大的工具,用于自动化测试、数据采集和浏览器自动化等场景。
下面是一个简单的示例,展示如何使用 Page 对象导航到页面并进行截图:
from playwright.sync_api import sync_playwright
def main():
with sync_playwright() as playwright:
browser = playwright.chromium.launch()
context = browser.new_context()
page = context.new_page()
# 导航到指定的网页
page.goto('https://www.example.com')
# 等待页面加载完成
page.wait_for_load_state('networkidle')
# 进行截图并保存到本地
page.screenshot(path='screenshot.png')
# 关闭浏览器
browser.close()
if __name__ == '__main__':
main()
Page 对象在 Playwright 中提供了丰富的操作能力,用于与浏览器页面进行交互和执行各种操作。下面是一些 Page 对象的常见操作能力:
goto(url: str) -> Response
: 导航到指定的 URL。wait_for_load_state(state: str, timeout: Optional[int] = None) -> None
: 等待页面加载到指定的状态,如 'load'、'domcontentloaded' 或 'networkidle'。reload() -> None
: 重新加载页面。go_back() -> None
: 在浏览器历史记录中后退一页。go_forward() -> None
: 在浏览器历史记录中前进一页。click(selector: str) -> None
: 单击匹配给定选择器的元素。fill(selector: str, value: str) -> None
: 将给定的值填充到匹配选择器的输入框中。press(key: str) -> None
: 模拟按下指定的键。hover(selector: str) -> None
: 将鼠标悬停在匹配选择器的元素上。select_option(selector: str, value: str) -> None
: 选择下拉菜单中匹配给定值的选项。evaluate(expression: str) -> Any
: 在页面上下文中执行 JavaScript 表达式,并返回结果。screenshot(path: str, options: Optional[Dict[str, Any]] = None) -> None
: 对当前页面进行截图,并保存到指定的路径。wait_for_selector(selector: str, timeout: Optional[int] = None) -> ElementHandle
: 等待页面上出现匹配给定选择器的元素。query_selector(selector: str) -> Optional[ElementHandle]
: 返回匹配给定选择器的第一个元素。query_selector_all(selector: str) -> List[ElementHandle]
: 返回匹配给定选择器的所有元素。content() -> str
: 返回页面的当前 HTML 内容。title() -> str
: 返回页面的标题。url() -> str
: 返回页面的当前 URL。通过这些操作能力,你可以模拟用户在浏览器页面上的交互和操作,从而实现自动化测试、数据采集、网页截图和用户模拟等场景。大部分 Page 对象的操作方法都是支持异步的(例如 goto、click、fill 等。
下面是示例代码:
from playwright.sync_api import sync_playwright
def main():
with sync_playwright() as playwright:
browser = playwright.chromium.launch()
context = browser.new_context()
page = context.new_page()
page.goto('https://www.example.com')
page.wait_for_load_state('networkidle')
# 填充表单
page.fill('input[name="username"]', 'myusername')
page.fill('input[name="password"]', 'mypassword')
# 点击按钮
page.click('button[type="submit"]')
# 等待页面加载完成
page.wait_for_load_state('networkidle')
# 获取页面内容
page_content = page.content
print(page_content)
# 关闭浏览器
browser.close()
if __name__ == '__main__':
main()
在 Playwright 中,Selectors 对象是一个用于定位页面元素的工具,它提供了不同类型的选择器,用于选择和操作页面上的元素。
以下是 Selectors 对象的一些常用方法:
通过使用 Selectors 对象,你可以方便地选择和操作页面上的元素,例如点击按钮、填充表单、获取文本内容等。选择器可以是 CSS 选择器或 XPath 表达式,取决于你的需求和个人偏好。
下面是一个示例,展示如何使用 Selectors 对象来选择元素并执行一些操作:
from playwright.sync_api import sync_playwright
def main():
with sync_playwright() as playwright:
browser = playwright.chromium.launch()
context = browser.new_context()
page = context.new_page()
page.goto('https://www.example.com')
page.wait_for_load_state('networkidle')
# 使用选择器选择并操作元素
page.fill('input[name="username"]', 'myusername')
page.fill('input[name="password"]', 'mypassword')
page.click('button[type="submit"]')
# 等待页面加载完成
page.wait_for_load_state('networkidle')
# 获取元素的文本内容
welcome_message = page.text('h1.welcome-message')
print(welcome_message)
# 关闭浏览器
browser.close()
if __name__ == '__main__':
main()
在这个示例中,我们使用了 fill 方法填充用户名和密码输入框的值,然后使用 click 方法单击提交按钮。接下来,我们等待页面加载完成,并使用 text 方法获取 <h1>
元素的文本内容,并将其打印到控制台。
通过使用 Selectors 对象,你可以轻松选择和操作页面上的元素,无论是填充表单、点击按钮、获取文本内容还是执行其他与元素交互的操作。Playwright 提供了丰富的选择器和操作方法,使得与页面元素的交互变得更加简单和灵活。
以是对访问的网页进行截图:
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.webkit.launch()
page = browser.new_page()
page.goto("http://www.example.com")
page.screenshot(path="example.png")
browser.close()
很可能你不需要手动等待,因为 Playwright 具有自动等待功能。如果你仍然依赖于手动等待,你应该使用 page.wait_for_timeout(5000)
来替代 time.sleep(5)
,而且最好完全不要等待超时,但有时候在调试过程中等待超时是有用的。在这些情况下,使用我们的等待方法(wait_for_timeout)而不是 time 模块。这是因为我们在内部依赖于异步操作,而使用 time.sleep(5)
时无法正确处理这些操作。
更新时间:2023-05-10 16:38:43 标签:python playwright 测试 爬虫