使用Jest与Puppeteer的并行支持

时间:2018-04-20 06:02:20

标签: javascript jestjs puppeteer

我正在使用puppeteer进行UI自动化以及Jest作为测试运行。我可以顺序运行测试但是在并行运行测试时我遇到了问题。 我的页面启动

beforeEach(async () => {
  browser = await puppeteer.launch({
    headless: false,
    //slowMo: 80,
    args: [`--window-size=${width},${height}`]
  });
  page = await browser.newPage();
  await page.setViewport({width, height});
});

// and my tests are
test.concurrent("description", async () => {
  await page.goto('xxxx.com');
  //test code goes here
}, timeout)
test.concurrent("description ", async () => {
  //test code goes here
}, timeout)

我收到了以下错误,

TypeError: Cannot read property 'goto' of undefined
(node:9552) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'addExpectationResult' of undefined
(node:9552) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 3)
(node:9552) [DEP0018] DeprecationWarning: Unhandled promise rejections are depre cated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
npm ERR! Test failed.  See above for more details.

在这方面的任何帮助将不胜感激。 问候, 杰

2 个答案:

答案 0 :(得分:0)

您正面临这个问题,因为当您使用箭头函数时,页面变量只是作用于beforeEach块。该块不会将其定义的变量传递给测试或描述块。我通过为测试设置了一个全局变量来解决这个问题,并且我已经在测试设置中使用global.PAGE = await browser.newPage()将页面对象添加到了它。所以在它自己运行测试之前。

要检查是否是这种情况,您只需在test.concurrent()块中尝试console.log(page);

查看官方的开玩笑文档。他们已经开始使用jest和puperteer了。

>> Using jest with puppeteer

希望这会有所帮助。 欢呼声。

答案 1 :(得分:0)

有几种并行运行测试的方式,据我所知,您可以使用新的浏览器实例运行每个测试套件。

  1. 您可以在每个beforeAll函数中创建新的浏览器实例 运行测试,然后在afterEach函数中关闭浏览器实例。

简单测试套件示例:

const browser;

    beforeEach(async () => {
        browser = await puppeteer.launch({}); //spinning up new browser instance
        page = await browser.newPage() 
        await page.goto('URL') 
    });

    test('test whatever', async () => {});
    test('test whatever2', async () => {});


    afterEach(async() => {
        await browser.close() //closes browser
    });
  1. 您可以使用puppeteer with jest

但是您必须修改PuppeteerEnvironment类,例如,以这种方式进行

 async setup() {
        await super.setup();

        this.global.__BROWSER__ = await puppeteer.launch({});
    }

不同的想法取决于您要自动化的确切内容以及流程的结构,但是请记住,每次测试都应尽可能地独立于其他测试。

我希望这会对您有所帮助。