Playwright异步登录测试校验页面标题报错,请求技术排查
问题描述
我是Playwright新手,正在进行一个简单POC测试:打开指定URL,点击“AGREE & CONTINUE”按钮,输入用户名和密码,点击“LOGIN”按钮后校验页面标题是否为指定内容。
测试代码
import pytest import asyncio from playwright.sync_api import Page, expect, async_playwright @pytest.mark.asyncio async def test_has_title(): async with async_playwright() as p: browser = await p.chromium.launch(headless=False) page = await browser.new_page() agree_button = "//button[@class='agree-btn'][contains(text(),'AGREE & CONTINUE')]" user_text_box = "USER" pwd_text_box = "PASSWORD" login_button = "//button[contains(text(),'LOGIN')]" await page.goto("https://my-url.com") await page.get_by_role("button", name="AGREE & CONTINUE").click() await page.get_by_placeholder("Username").click() await page.get_by_placeholder("Username").fill("myuser") await page.get_by_placeholder("Password").click() await page.get_by_placeholder("Password").fill("mypassword") await page.get_by_role("button", name="LOGIN",).click() await expect(page.locator('title')).to_have_text('Welcome', timeout=50000)
运行命令
pytest -v -s --capture=tee-sys --html=report.html .\test_login.py --headed
错误信息
await expect(page.locator('title')).to_have_text('Citco Treasury', timeout=50000) ..\venv\Lib\site-packages\playwright\sync_api\__init__.py:142: in __call__ raise ValueError(f"Unsupported type: {type(actual)}") E ValueError: Unsupported type: <class 'playwright.async_api._generated.Locator'>
疑问点:
- 应用点击登录按钮后需要几秒加载才能显示标题,是否因此导致错误?
- 想确认
await是否会等待测试序列中的下一个动作完成?
问题解答
1. 标题校验错误的核心原因
你用page.locator('title')结合to_have_text的方式不符合Playwright的API规范。<title>是页面的特殊头部元素,Playwright提供了专门的标题断言方法,不能直接用定位器对象做文本断言,这才是报错Unsupported type的根本原因,和页面加载延迟无关。
正确的标题校验代码应该是:
# 替换原有的标题校验行 await expect(page).to_have_title('Welcome', timeout=50000)
2. 关于await的作用
在Playwright异步API中,await会等待当前异步操作完全完成后,才会执行下一行代码:
- 比如
await page.get_by_role("button", name="LOGIN").click(),会等待点击动作触发、按钮状态变化完成后,才会进入后续的标题断言步骤。 - 但
await只保证当前操作完成,不主动等待页面完全加载。如果登录后页面有异步渲染或网络请求,你可以通过以下方式增强测试稳定性:- 等待页面核心元素出现:
await expect(page.get_by_text('欢迎回来')).to_be_visible() - 等待页面加载状态:
await page.wait_for_load_state('networkidle')(当网络请求处于空闲状态时继续执行)
- 等待页面核心元素出现:
3. 代码优化建议
输入框操作可以简化,fill方法会自动聚焦并填充内容,不需要额外的click步骤:
# 替换原有的用户名密码填充代码 await page.get_by_placeholder("Username").fill("myuser") await page.get_by_placeholder("Password").fill("mypassword")
内容的提问来源于stack exchange,提问作者Ram
相关产品推荐
相关产品推荐

