百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

UI自动化测试框架:Playwright 官方教程(二)—— 异步与动态定位

ccwgpt 2025-06-10 13:39 7 浏览 0 评论

在上一篇中,我们已经安装好 Playwright 的运行环境,并对其进行了简单的介绍,本文将进一步介绍playwright 的高级特性。


一、同步与异步

我们以一个最简单的打开网页并截图为例来初步的演示 playwright 中的同步与异步功能。

1.1 同步

# -*- coding:utf-8 -*-

from playwright.sync_api import sync_playwright


def run(_playwright):
    browser = _playwright.chromium.launch()
    page = browser.new_page()
    page.goto("https://www.baidu.com")
    page.wait_for_load_state("networkidle")
    page.screenshot(path="baidu.png")
    browser.close()


with sync_playwright() as playwright:
    run(playwright)

代码解析:

sync_playwright():启动 Playwright,支持 with 语法,确保程序结束后资源释放。


_playwright.chromium.launch():
启动 Chrome(你也可以用
_playwright.firefox.launch())。

browser.new_page():在新页签打开。

page.goto():访问网址。

page.wait_for_load_state():等待页面加载完成。

page.screenshot():截图。

browser.close():关闭浏览器。

执行完代码,你的项目目录下就会多出一张 baidu.png


1.2 异步

# -*- coding:utf-8 -*-
import asyncio
from playwright.async_api import async_playwright


async def open_baidu(url, png_name):
    async with async_playwright() as playwright:
        browser = await playwright.chromium.launch(headless=False)
        page = await browser.new_page()
        await page.goto(url)
        await page.wait_for_load_state("networkidle")
        await page.screenshot(path=png_name)
        await browser.close()


print('open baidu.')
asyncio.run(open_baidu("https://www.baidu.com/", 'baidu.png'))
print('open playwright docs.')
asyncio.run(open_baidu("https://playwright.dev/docs/intro", 'playwright.png'))

代码解析:

from playwright.async_api import async_playwright:与同步方式不同,异步导入的模块是

playwright.async_api

async def open_baidu(url, png_name): 定义异步方法

async with async_playwright() as playwright:异步的上下文管理器

browser = await playwright.chromium.launch(headless=False):以有头模式异步的打开一个浏览器实例

asyncio.run(open_baidu("https://playwright.dev/docs/intro", 'playwright.png')):异步运行

运行完成后会生成如下图片:


二、元素基础定位

Playwright 定位元素的核心思想:

Playwright 的定位器(Locators)是其自动等待和重试能力的核心,通过智能等待元素加载、重试机制避免因网络延迟或动态渲染导致的定位失败。推荐优先使用语义化定位器(如角色、文本),而非传统 CSS/XPath,以提高代码可读性和稳定性。

2.1. CSS 选择器

通过 HTML 标签、类名、ID 等 CSS 语法定位:

# 定位 ID 为 "username" 的输入框

page.locator("#TANGRAM__PSP_11__userName").fill("admin")

# 定位类名为 "submit-btn" 的按钮

page.locator("button.submit-btn").click()

适用场景:元素有固定 ID/类名,或需层级嵌套选择(如 div > input)。


2.2. XPath 表达式

通过 XML 路径语法定位复杂结构:

# 定位 name 属性为 "email" 的输入框

page.locator("//input[@name='email']").fill("test@example.com")

# 定位包含特定文本的按钮

page.locator("//button[contains(text(), '提交')]").click()

适用场景:元素属性动态变化、需复杂条件筛选时。


2.3. 按角色定位(Role)

基于 ARIA 角色和可访问性属性,最接近用户感知:

# 定位名称为 "登录" 的按钮

page.get_by_role("button", name="登录").click()

# 定位角色为输入框且名称为 "用户名"

page.get_by_role("textbox", name="用户名").fill("user123")

支持角色:button、link、checkbox、heading 等。


2.4. 按文本内容定位

# 精确匹配文本

page.get_by_text("欢迎回来").click()

# 正则表达式模糊匹配

page.get_by_text(re.compile(r"订单编号\d+")).hover()

适用场景:元素无固定属性,但文本内容稳定。


2.5. 按标签关联定位

# 通过关联的 <label> 文本定位输入框

page.get_by_label("密码:").fill("secret")

# 通过占位符定位

page.get_by_placeholder("请输入手机号").type("13800138000")

优势:与表单控件天然绑定,避免层级依赖。


2.6. 按测试 ID 定位

专为测试设计的属性,需页面添加 data-testid:

# 定位 data-testid="submit-button" 的元素

page.get_by_test_id("submit-button").click()

三、动态元素定位

3.1 显式等待元素加载

# 等待元素可见后再操作

page.locator(".loading").wait_for(state="visible")

# 等待元素消失

page.wait_for_selector(".spinner", state="hidden")

3.2 处理 iframe 嵌套

# 定位到 iframe 内的元素

iframe = page.frame(name="payment-iframe")

iframe.get_by_text("确认支付").click()

3.3 Shadow DOM 穿透

# 通过 >> 符号穿透 Shadow DOM 层级:

page.locator("div#shadow-host >> input.custom-input").fill("data")

四、复杂场景定位

4.1 多重条件筛选

# 定位类名为 "item" 且包含文本 "特价" 的元素
page.locator(".item", has_text="特价").click()

# 组合角色和文本过滤
page.get_by_role("listitem").filter(has_text="待付款").nth(0).click()

4.2 相对定位

# 父子关系定位
parent = page.locator("div.parent")
child = parent.locator("span.child")

# 兄弟元素定位
second_item = page.locator("ul > li").nth(1)

4.3 动态列表处理

# 遍历商品列表并点击第三个商品
items = page.locator(".product-list > li")
await items.nth(2).click()

# 根据文本动态定位最新添加的条目
new_item = page.locator("tr:has-text('2024-03-18')").last

五、注意事项

选择器优先级:尽量使用ID或类名选择器,避免使用复杂的XPath。

异步操作的调试:使用playwright debug工具排查异步问题。

动态内容的处理:确保等待元素加载完成,避免操作失败。

相关推荐

火电厂智能管控新基建:全场景人员定位系统架构解析

在能源生产领域,火电厂以庞大的厂区规模、复杂的作业环境和密集的人机交互著称。从高温高压的锅炉房到精密复杂的电气设备间,从露天煤场到灰渣处理区,传统管理模式下的人员定位盲区,正成为制约安全生产与高效运营...

安全仪表系统(SIS)全生命周期管理:从设计到运维的深度解析

以下是一篇关于安全仪表系统(SIS)的技术解析与实践方法,涵盖系统架构、设计标准、实施流程及行业应用。安全仪表系统(SIS)是工业过程安全的最后一道防线,通过独立于基础控制系统的硬件和逻辑,在工艺失控...

数字化转型架构下的数据安全治理方案

这份PPT文件内容围绕数字化转型架构下的数据安全治理方案展开,主要探讨了数据质量治理、安全治理、全生命周期治理以及治理考核等方面的内容。更多参考及文档获取详见公众号:优享智库数据治理概述定义与目标:数...

安全完整性等级(SIL)分析报告编制与认证实践方法

以下是一篇关于安全完整性等级(SIL)分析报告的文章,涵盖SIL定级方法、验证流程、计算模型及工程实践。安全完整性等级(SIL)是量化安全仪表系统(SIS)性能的核心指标,由IEC61508/615...

项目管理体系框架(项目的管理体系)

Pokemon go下载教程 口袋妖怪Go下载解锁方法

#p#安卓下载#e#Pokemongo怎么下载?口袋妖怪go下载教程讲解。虽然锁区了但是大家还是有办法的,首先是口袋妖怪Go下载问题,很多口袋妖怪go的安卓玩家不知道怎么下载游戏,小编给大家详细解答...

抛弃Windows吧!谷歌推免费Chrome系统,一个U盘就搞定

在目前的个人电脑上,最主流的系统当然是Windows,不过除了Windows之外,我们也可以选择购买苹果的电脑,使用苹果的MacOS系统。不过除了苹果和微软的系统之外,实际上谷歌也有自己用于个人电脑...

谷歌误发ARM版Chrome安装包,致英特尔 /AMD用户无法安装

IT之家3月26日消息,科技媒体WindowsLatest昨日(3月25日)发布博文,报道称由于谷歌误发适用于ARM架构的安装包,导致用户从谷歌官网下载的ChromeSetu...

【Google Gemini极简教程】使用Flask和Gemini API构建一个AI BaaS

BaaS(BackendasaService,后端即服务)BaaS是一种云服务模型,它为开发者提供了一种便捷的方式来构建和管理应用程序的后端服务。BaaS提供了一系列的后端功能,如数据库管理...

第一资讯Windows 10 Mobile已成功安装谷歌Play Store

虽然微软并未正式推出WP可安装APK的功能,但近期有不少玩机爱好者已经在Windows10Mobile平台上用上了Android应用,而且随后还在需要谷歌服务框架(GoogleServices)...

宝可梦TCG Pocket谷歌账号登录,给你提供指南

《宝可梦TCGPocket》作为一款备受欢迎的卡牌对战游戏,为了给玩家提供更加便捷和安全的登录方式,支持使用谷歌账号进行登录。通过谷歌账号登录,您不仅可以快速进入游戏,还能享受账号数据同步、跨设备游...

秒变万能家庭服务器!斐讯N1 armbian安装指南

一直以来,我都想配置一台小型服务器放在家里玩一玩,但是x86架构的主机体积大功耗高,价格也不低。而树莓派的话,价格便宜一点,性能对于轻度使用也基本够用。可是树莓派仍然要两三百块钱,感觉还是有点贵。于是...

如何自己开发一个Google浏览器插件?

相信很多人都好奇,谷歌浏览器那么多的插件是如何开发的,我们如何开发一个自定义的Google浏览器插件,下面我们就来详细的给出一个开发Google浏览器插件的流程。准备环境首先需要有一个文本编辑器工具如...

我的世界手机版谷歌商店安装教程(我的世界谷歌下载)

在我的世界手机版升级到0.11.0版本后,很多玩家发现正式版需要有谷歌商店的验证也就是必须安装Googleplay才能玩。这次搞趣网小编就为大家带来我的世界手机版谷歌商店安装教程。有些手机自带Goo...

部落冲突安卓版谷歌怎么绑定 有无root都可以

部落冲突安卓版谷歌怎么绑定?下面小编为大家带来部落冲突安卓版谷歌绑定攻略详解,希望这篇攻略详解能够对大家有所帮助。首先准备这些东西(必须在网上自己下载,不要相信google应用)还需要下载"谷歌服务框...

取消回复欢迎 发表评论: