在尝试使用Jest和Puppeteer建立一些简单的端到端测试时,我发现我编写的任何测试都会因超时而莫名其妙地失败。
这是一个简单的示例测试文件,与Puppeteer's own example略有不同:
import puppeteer from 'puppeteer';
describe('Load Google Puppeteer Test', () => {
test('Load Google', async () => {
const browser = await puppeteer.launch({
headless: false
});
const page = await browser.newPage();
await page.goto('https://google.co.uk');
await expect(page).toMatch("I'm Feeling Lucky");
await browser.close();
});
});
及其产生的响应:
TimeoutError: Text not found "I'm Feeling Lucky"
waiting for function failed: timeout 500ms exceeded
我尝试将自定义超时添加到goto行,test子句等所有操作均无效。关于什么可能导致此的任何想法?谢谢。
答案 0 :(得分:0)
我要说的是,使用toMatch
希望显示文本。但是,根据您的情况,您要验证的文本是与按钮关联的文本。
您应该尝试这样的事情:
await expect(page).toMatchElement('input[value="I\'m Feeling Lucky"]');
更新1:
另一种可能性(这是您自己提出来的)是验证在页面有机会加载之前就已超时。根据我的经验,这是在无头模式下执行代码的常见问题。非常快。有时太快了。可以在UI中的所有内容准备就绪之前执行语句。
在这种情况下,最好在代码中添加一些waitForSelector
语句,如下所示:
await page.waitForSelector('input[value="I\'m Feeling Lucky"]');
这将确保在继续下一步代码之前显示所需的选择器。通过这样做,您将使脚本更加健壮,同时保持效率-这些等待不会降低您的代码速度。他们只会暂停,直到puppeteer
注册要与之交互的选择器/验证其是否显示。在大多数情况下,您甚至都不会注意到暂停,因为它是如此之短(我在说毫秒)。
但这将使您的脚本稳定可靠,同时还可以确保如果在执行测试过程中由于任何原因导致网页响应速度变慢,则脚本不会中断。
答案 1 :(得分:0)
您可能正在使用mirePrincipal
期望的'expect-puppeteer'软件包。这不是一个小偏差。奇怪的是您的默认超时不是30秒钟,而是程序包的默认超时,请检查一下。
但是,要解决您的问题,
toMatch
或使用以下命令显式设置默认超时:
await expect(page).toMatch("I'm Feeling Lucky", { timeout: 6000 });
请参见here。