我有一个基于Puppeteer with Jest的小测试套件,我无法摆脱以下问题:当我运行单个特定测试(例如:yarn test myscenario.test.js
)时,一切正常;当我使用yarn test
命令运行整个测试套件(大约20个测试)时,我的一些测试失败,并出现以下错误:
超出
导航超时:在Promise.then (node_modules/puppeteer/lib/NavigatorWatcher.js:73:21)超过30000ms
问题是我所有的测试都已经设置了一个特定的超时(99999毫秒!)并且在大约6-7秒内执行一次测试。我的猜测是,当整个测试套件运行时,存在超过30000ms限制的全局导航超时。
是否有办法覆盖此全局导航超时限制?
下面是我的一个测试(myscenario.test.js
) (它遍历一个JSON文件并导航到各种URL,在其中执行一些简单的操作):
const puppeteer = require('puppeteer')
const propertiesReader = require('properties-reader')
const jsonReader = require("fs")
const prop = propertiesReader('./resources/config.ini')
const tealiumTags = JSON.parse(jsonReader.readFileSync('./resources/tealium-tags.json', 'utf8'))
let browser
let page
beforeEach (async () => {
browser = await puppeteer.launch({headless: true, args: ['--start-maximized']});
page = await browser.newPage();
await page.setViewport({ width: 1920, height: 1080 })
})
afterEach (() => {
browser.close()
})
describe('Decline all Tealium tags', () => {
for (let brand in tealiumTags) {
if (tealiumTags.hasOwnProperty(brand)) {
let brandUrl = tealiumTags[brand].url
test('Decline all Tealium tags for ' + brandUrl, async () => {
console.log("---------------------------------------")
console.log("Decline all Tealium tags for " + brandUrl)
await page.goto("https://www." + brandUrl, { waitUntil: 'domcontentloaded' })
await page.waitForSelector(prop.get('DECLINE_COOKIES_BUTTON'))
await page.click(prop.get('DECLINE_COOKIES_BUTTON'))
await page.waitForNavigation({waitUntil: 'domcontentloaded'})
let utag = await page.evaluate(() => window.utag["send"])
expect(Object.keys(utag).length).toEqual(0)
}, 99999)
}
}
})
对此问题的任何提示都将不胜感激,谢谢!
发布于 2018-06-20 04:12:21
来解决实际的问题,“覆盖导航超时”。您可以将超时选项传递给waitForNavigation方法。
page.waitForNavigation( { timeout: 60, waitUntil: 'domcontentloaded' });
您也可以通过传递值0来禁用超时。
然而,我认为你有一个更大的问题。看起来:
您已经在作用域的顶部定义了“page”,因此,每个测试用例都将共享page变量的实例。
let browser;
beforeAll(async () => {
browser = await puppeteer.launch({ headless: true, args: ['--start-maximized'] });
});
afterAll(() => {
browser.close();
});
describe('Decline all Tealium tags', () => {
for (const brand in tealiumTags) {
if (tealiumTags.hasOwnProperty(brand)) {
const brandUrl = tealiumTags[brand].url;
test(`Decline all Tealium tags for ${brandUrl}`, async () => {
// Setup the page in each test case allows you to run these concurrently.
const page = await browser.newPage();
await page.setViewport({ width: 1920, height: 1080 });
console.log('---------------------------------------');
console.log(`Decline all Tealium tags for ${brandUrl}`);
await page.goto(`https://www.${brandUrl}`, { waitUntil: 'domcontentloaded' });
await page.waitForSelector(prop.get('DECLINE_COOKIES_BUTTON'));
await page.click(prop.get('DECLINE_COOKIES_BUTTON'));
await page.waitForNavigation({ waitUntil: 'domcontentloaded' });
const utag = await page.evaluate(() => window.utag.send);
expect(Object.keys(utag)).toHaveLength(0);
}, 99999);
}
}
});
您可能需要使用无头模式来隔离问题。
发布于 2018-09-27 14:51:04
当在docker中并行运行测试时,遇到了类似的问题,使用以下参数启动浏览器大大减少了导航时间,现在测试运行得很好。
await puppeteer.launch({args: [
'--disable-gpu',
'--disable-dev-shm-usage',
'--disable-setuid-sandbox',
'--no-first-run',
'--no-sandbox',
'--no-zygote',
'--single-process', // <- this one doesn't works in Windows
]})
有关issue here的更多参考
发布于 2018-06-20 01:55:24
你在并行运行这些测试吗?你在重用标签/浏览器吗?当我的测试套件并行运行时,我遇到了类似的问题,因为它们修改了相同的选项卡。
另外,你有没有尝试在非无头模式下启动,以检查在测试执行过程中到底发生了什么?
https://stackoverflow.com/questions/50931956
复制相似问题