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

使用Codecept-Puppeteer做E2E测试时,如何获取Shadow Root内文本并验证标题?

问题

我的HTML结构如下:
HTML结构

我需要验证页面标题为Favorite Restaurant,请问如何用Codecept-Puppeteer实现这个测试?

我尝试了以下代码,但没有成功:

Feature('Favorite Restaurant');

Before(({ I }) => {
  I.amOnPage('/#/favorite');
});

Scenario('showing empty favorite restaurants', async ({ I }) => {
  I.wait(3);
  const text = await I.grabTextFrom(
    'pierce/favorite-module .section-header h2',
  );
  console.log(text);
});

测试日志如下:
测试日志

解决方法

方法一:用内置方法直接验证标题

Codecept-Puppeteer提供了seeTitleEquals方法,可直接验证页面标题,无需手动抓取文本,代码更简洁可靠:

Feature('Favorite Restaurant');

Before(({ I }) => {
  I.amOnPage('/#/favorite');
});

Scenario('验证收藏页面标题', ({ I }) => {
  // 等待标题元素加载完成,超时时间5秒(替代固定等待更灵活)
  I.waitForElement('.section-header h2', 5);
  // 直接验证页面标题是否匹配
  I.seeTitleEquals('Favorite Restaurant');
});

方法二:修复原代码的选择器问题

如果坚持用grabTextFrom,需要修正选择器的写法——pierce是Codecept的shadow DOM定位策略,正确格式是pierce/目标选择器,原代码里的选择器写法有误:

Feature('Favorite Restaurant');

Before(({ I }) => {
  I.amOnPage('/#/favorite');
});

Scenario('显示空收藏餐厅列表', async ({ I }) => {
  // 等待元素加载,避免固定等待的不可靠性
  I.waitForElement('pierce/favorite-module .section-header h2', 5);
  // 正确使用pierce定位策略抓取文本
  const text = await I.grabTextFrom('pierce/favorite-module .section-header h2');
  // 断言文本是否匹配
  I.assertEqual(text, 'Favorite Restaurant');
  console.log(text);
});

说明:

  • 避免使用I.wait(3)这种固定时长等待,改用waitForElement等待目标元素出现,能适配不同加载速度的场景。
  • pierce策略用于穿透shadow DOM访问内部元素,必须按pierce/选择器的格式书写,不能把定位策略和元素标签混写。

内容的提问来源于stack exchange,提问作者Dapa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 15:30:51