首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在使用Jest运行傀儡测试时增加导航超时

如何在使用Jest运行傀儡测试时增加导航超时
EN

Stack Overflow用户
提问于 2018-06-19 23:24:34
回答 4查看 10.5K关注 0票数 1

我有一个基于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,在其中执行一些简单的操作):

代码语言:javascript
复制
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)
      }
    }
})

对此问题的任何提示都将不胜感激,谢谢!

EN

回答 4

Stack Overflow用户

发布于 2018-06-20 04:12:21

来解决实际的问题,“覆盖导航超时”。您可以将超时选项传递给waitForNavigation方法。

代码语言:javascript
复制
page.waitForNavigation( { timeout: 60, waitUntil: 'domcontentloaded' });

您也可以通过传递值0来禁用超时。

然而,我认为你有一个更大的问题。看起来:

  1. 同时运行所有测试文件会导致多个Chromium会话导致加载时间较长。
  2. 您的页面变量正由尝试同时运行的测试共享。

您已经在作用域的顶部定义了“page”,因此,每个测试用例都将共享page变量的实例。

代码语言:javascript
复制
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);
    }
  }
});

您可能需要使用无头模式来隔离问题。

票数 4
EN

Stack Overflow用户

发布于 2018-09-27 14:51:04

当在docker中并行运行测试时,遇到了类似的问题,使用以下参数启动浏览器大大减少了导航时间,现在测试运行得很好。

代码语言:javascript
复制
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的更多参考

票数 3
EN

Stack Overflow用户

发布于 2018-06-20 01:55:24

你在并行运行这些测试吗?你在重用标签/浏览器吗?当我的测试套件并行运行时,我遇到了类似的问题,因为它们修改了相同的选项卡。

另外,你有没有尝试在非无头模式下启动,以检查在测试执行过程中到底发生了什么?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50931956

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档