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

Playwright调用evaluateAll报_test未定义错误该如何解决?

问题根因

你遇到的两个问题本质都是因为evaluateAll的执行上下文和测试代码的执行上下文隔离导致的:

  • 报错_test is not defined:evaluateAll传入的回调函数会被序列化后发送到浏览器进程中执行,Node测试环境下导入的expect方法不存在于浏览器上下文,报错中的_test是@playwright/test对expect做内部编译转换后的变量名,浏览器侧无法识别。
  • console.log无输出:evaluateAll内部的console.log是浏览器侧的打印语句,默认只会输出到浏览器开发者工具的控制台,不会同步到Node测试执行的终端。

修复方案

  1. 所有expect断言必须放在Node侧执行,需要校验的属性值从浏览器侧返回后再做断言
  2. 若需要查看浏览器侧的打印内容,给page实例注册console事件监听器,将浏览器日志转发到测试终端

修复后代码示例

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

test("focus sets tab indexes appropriately", async ({ page }) => {
    // 监听浏览器console事件,转发打印内容到终端
    page.on('console', msg => console.log('浏览器控制台输出:', msg.text()));

    await page.goto("http://localhost:3000/test");
    const inputs = page.locator("input");
    await expect(inputs).toHaveCount(5);

    // 把所有input的tabIndex值返回到Node侧
    const tabIndexes = await inputs.evaluateAll((nodes) => {
        console.log(nodes);
        const indexes = [];
        for (const node of nodes) {
            console.log(node);
            indexes.push(node.tabIndex);
        }
        return indexes;
    });

    // Node侧执行断言
    expect(tabIndexes).toEqual(Array(5).fill(0));
});

如果你后续升级到更高版本的Playwright,还可以直接用内置的批量属性断言,不需要手动写evaluateAll逻辑,写法更简洁:

await expect(inputs).toHaveAttribute('tabindex', '0', { match: 'all' })

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 05:54:03