Playwright调用evaluateAll报_test未定义错误该如何解决?
问题根因
你遇到的两个问题本质都是因为evaluateAll的执行上下文和测试代码的执行上下文隔离导致的:
- 报错
_test is not defined:evaluateAll传入的回调函数会被序列化后发送到浏览器进程中执行,Node测试环境下导入的expect方法不存在于浏览器上下文,报错中的_test是@playwright/test对expect做内部编译转换后的变量名,浏览器侧无法识别。 console.log无输出:evaluateAll内部的console.log是浏览器侧的打印语句,默认只会输出到浏览器开发者工具的控制台,不会同步到Node测试执行的终端。
修复方案
- 所有
expect断言必须放在Node侧执行,需要校验的属性值从浏览器侧返回后再做断言 - 若需要查看浏览器侧的打印内容,给
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
相关产品推荐
相关产品推荐

