python中Playwright 数据提取和验证

 更新时间:2026年01月23日 09:10:11   作者:yingjuxia.com  
Playwright 提供了强大的数据提取和验证功能,支持多种语言,通过 Locator API 可提取元素文本、属性值、输入框内容等数据,具有一定的参考价值,感兴趣的可以了解一下

数据提取(Extraction)和验证(Assertion)是 Playwright 在自动化测试和爬虫场景中最核心的部分。Playwright 提供了强大且可靠的 Locator APIWeb-First 断言,能自动等待元素就绪,确保测试稳定。下面以 Node.js/TypeScript(Playwright Test)为主,附 Python 示例。

1.数据提取(常见方式)

提取目标代码示例(推荐 Locator)说明
单个元素文本const text = await page.getByRole('heading', { name: '欢迎' }).textContent();返回字符串(null 如果不存在)
输入框值const value = await page.getByLabel('用户名').inputValue();适用于 input/textarea
属性值const href = await page.getByRole('link', { name: '详情' }).getAttribute('href');获取 href、src、data-* 等
多个元素文本const items = await page.getByRole('listitem').allTextContents();返回 string[] 数组
多个元素内文本const texts = await page.getByTestId('price').allInnerTexts();innerText(不含子元素隐藏文本)
元素计数const count = await page.getByRole('article').count();返回元素数量
表格数据提取```const
JSON/API 数据const response = await page.waitForResponse('**/api/users');
const json = await response.json();
拦截网络响应提取数据

2.验证(断言)——Playwright 最强大特性

Playwright 的 expectWeb-First 断言:会自动重试直到超时(默认 30s),极大减少 flaky 测试。

import { test, expect } from '@playwright/test';

// 页面标题
await expect(page).toHaveTitle('Playwright - 首页');
await expect(page).toHaveTitle(/Playwright/);  // 正则匹配

// URL
await expect(page).toHaveURL('https://playwright.dev/');
await expect(page).toHaveURL(/docs/);

// 元素可见/隐藏
await expect(page.getByText('加载成功')).toBeVisible();
await expect(page.getByText('加载中')).toBeHidden();

// 元素文本
await expect(page.getByRole('heading')).toHaveText('欢迎使用');
await expect(page.getByTestId('status')).toContainText('成功');  // 包含

// 元素属性
await expect(page.getByRole('link')).toHaveAttribute('href', '/docs');
await expect(page.getByRole('img')).toHaveAttribute('src', /logo/);

// 输入框值
await expect(page.getByLabel('搜索')).toHaveValue('Playwright');

// 元素数量
await expect(page.getByRole('listitem')).toHaveCount(5);

// Checkbox/Radio 状态
await expect(page.getByRole('checkbox')).toBeChecked();
await expect(page.getByRole('radio', { name: '男' })).toBeChecked();

// 元素启用/禁用
await expect(page.getByRole('button')).toBeEnabled();
await expect(page.getByRole('button')).toBeDisabled();

3.高级验证技巧

// 软断言(不立即失败,继续执行)
expect.soft(page.getByText('错误提示')).toBeHidden();

// 自定义超时
await expect(page.getByText('加载完成'), { timeout: 10000 }).toBeVisible();

// 轮询断言(复杂条件)
await expect(async () => {
  const count = await page.getByRole('listitem').count();
  expect(count).toBeGreaterThan(0);
}).toPass({ timeout: 15000 });

// 截图断言(视觉回归)
await expect(page).toHaveScreenshot('homepage.png', { maxDiffPixels: 100 });

// 全页面截图比较(像素级)
await expect(page).toHaveScreenshot({ fullPage: true });

4.实战示例:提取并验证搜索结果

test('百度搜索 Playwright 并验证结果', async ({ page }) => {
  await page.goto('https://www.baidu.com');
  await page.getByLabel('搜索输入框').fill('Playwright');
  await page.getByRole('button', { name: '百度一下' }).click();

  // 等待结果加载
  await page.waitForLoadState('networkidle');

  // 提取第一个结果标题
  const firstTitle = await page.getByRole('heading').first().textContent();
  console.log('第一个结果标题:', firstTitle);

  // 验证结果包含关键词
  await expect(page.getByRole('heading').first()).toContainText('Playwright');
  await expect(page.getByRole('heading')).toHaveCount(10);  // 通常一页 10 条

  // 提取所有结果链接
  const links = await page.getByRole('link', { name: /Playwright/ }).all();
  console.log(`找到 ${links.length} 个相关链接`);
});

5.Python 版提取与验证示例

from playwright.sync_api import sync_playwright, expect

with sync_playwright() as p:
    browser = p.chromium.launch(headless=False)
    page = browser.new_page()
    page.goto("https://playwright.dev")

    # 提取
    title = page.title()
    heading = page.get_by_role("heading", name="Fast and reliable").text_content()
    print(f"标题: {title}, 副标题: {heading}")

    # 验证
    expect(page).to_have_title("Playwright")
    expect(page.get_by_role("link", name="Get started")).to_be_visible()
    expect(page.get_by_text("Playwright is a")).to_contain_text("reliable")

    browser.close()

最佳实践总结

  • 提取:优先用 getByRole + textContent() / inputValue()
  • 验证:全部使用 expect(),让 Playwright 自动重试。
  • 测试专用属性:在被测应用中添加 data-testid="xxx",最稳定。
  • 调试:失败时自动生成 trace(截图 + 视频 + 网络日志),用 npx playwright show-trace 查看。

到此这篇关于python中Playwright 数据提取和验证的文章就介绍到这了,更多相关Playwright 数据提取和验证内容请搜索脚本之家以前的文章或继续浏览

相关文章

  • Python中venv虚拟环境超详细讲解

    Python中venv虚拟环境超详细讲解

    虚拟环境是一个独立的Python环境,它与系统的全局Python环境隔离,这篇文章主要介绍了Python中venv虚拟环境的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-04-04
  • 使用Selenium在Python中实现录屏功能

    使用Selenium在Python中实现录屏功能

    Selenium 是一个强大的用于自动化测试的工具,但你知道它也可以用来录制浏览器操作的视频吗?本文将介绍如何使用 Selenium 在 Python 中实现录屏功能,以便记录和分享你的网页操作过程,需要的朋友可以参考下
    2023-11-11
  • Python import与from import使用及区别介绍

    Python import与from import使用及区别介绍

    Python程序可以调用一组基本的函数(即内建函数),比如print()、input()和len()等函数。接下来通过本文给大家介绍Python import与from import使用及区别介绍,感兴趣的朋友一起看看吧
    2018-09-09
  • python去除扩展名的实例讲解

    python去除扩展名的实例讲解

    下面小编就为大家分享一篇python去除扩展名的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-04-04
  • 13个有趣又好玩的Python游戏代码分享

    13个有趣又好玩的Python游戏代码分享

    今天小编跟大家分享13个有趣又好玩的Python小游戏示例代码,教你如何通过边打游戏边学编程!感兴趣的小伙伴快跟随小编一起学习起来
    2022-02-02
  • Python读写Redis数据库操作示例

    Python读写Redis数据库操作示例

    Redis是一个开源的非关系型数据库,它采用C语言编写,是一个key-value存储系统,它存储的value类型很多,包括string(字符串),list(链表),set(集合),zset(有序集合),hash(哈希)
    2014-03-03
  • 用Python+OpenCV对比图像质量的几种方法

    用Python+OpenCV对比图像质量的几种方法

    这篇文章主要介绍了用Python+OpenCV对比图像质量过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • Python中装饰器学习总结

    Python中装饰器学习总结

    这篇文章主要介绍了Python中装饰器学习总结,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • Python迭代器定义与简单用法分析

    Python迭代器定义与简单用法分析

    这篇文章主要介绍了Python迭代器定义与简单用法,结合实例形式分析了迭代器的概念、原理、创建及使用方法,需要的朋友可以参考下
    2018-04-04
  • 与Django结合利用模型对上传图片预测的实例详解

    与Django结合利用模型对上传图片预测的实例详解

    今天小编就为大家分享一篇与Django结合利用模型对上传图片预测详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08

最新评论