You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 19:54:51