puppeteer - 必须使用手动 wait() 来获取 CodeceptJS/Puppeteer 自定义助手来查看表(td tr)
问题描述
我有一个 codeceptjs/puppeteer 项目,并且正在构建一个自定义帮助程序来访问表中的信息。我已经能够完成这项工作,但只需在我的测试步骤中等待两秒钟,然后在我的自定义帮助程序类中调用异步函数。鉴于这一切都基于 async/await,我必须相信我只是遗漏了一些东西,并且有一种干净的方法可以做到这一点。
我的助手类的功能。
async getRowCount() {
//const browser = this.helpers['Puppeteer'].browser;
const page = this.helpers['Puppeteer'].page;
page.waitForSelector('tbody');
let rowCount = await page.$$eval('tbody tr', rows => rows.length);
return rowCount;
// These work
// page.waitForSelector('a[href="#/site/create"]');
// page.click('a[href="#/site/create"]');
}
我的 codeceptjs 场景如下。
Scenario.only('Table check ALL', async (I, loginAs) => {
loginAs('bob');
I.say(await I.getRowCount());
I.wait(3);
});
当代码如上所示时,我返回的行数始终为 0。
但是,如果我在 I.getRowCount() 函数之前等待 1 秒,则返回 tbody tr 选择器的正确总行数。
如果有人可以帮助我理解为什么会发生这种情况以及我可以做些什么来解决它,这样我就不必在我的代码中添加手动等待步骤来适应这些辅助函数(codeceptjs 的核心“功能”),我将不胜感激它。
谢谢!
解决方案
你需要等待waitForSelector:
await page.waitForSelector('tbody');
几乎所有page
方法都返回承诺,因此您必须等待它们。
推荐阅读
- python - 在 Pandas 中使用列作为单元格值
- django - 如何在创建用户类型时自动设置超级用户
- c++ - 顺序推导不一致的三向比较算子
- css - CSS Sprite-Sheet 在行 col 中使用 var calc 调整大小以适应 sprite
- xml - 通过 XML 在 Powershell 中的 Foreach 循环
- php - PHP会话不适用于多个WordPress页面
- asp.net-core - http 请求中的 SAML,如何获取 Saml 表单请求?
- python - 使用 Python SDK 和代理连接到具有专用端点的 AMLS 工作区
- c# - Unity 2d 角色控制。速度还是什么?
- python - Tensorflow 和 keras 模型在调用 load_model 时引发类型错误