Шутка Кукловод после запуска теста Ошибка типа: Не удается прочитать свойство «waitForSelector» неопределенного

#javascript #jestjs #puppeteer

Вопрос:

Как правильно переместить группу тестов в отдельный класс или модуль Jest puppeteer, который будет вызываться в других тестах? Например, у меня есть описание с тестами, и я хочу использовать это описание в другом описании.

login.spec.js

 'use strict'

const testConst = require('./const')
const selectors = require('./selectors')
const action = require('./actions')
const br = require('./browser')
const Auth = require('./login')
   
let page
let browser

beforeAll(async () => {
      // set up Puppeteer
      browser = await br.set_up_Puppeteer(true)
      console.log('browser.isConnected')
      // Web page
      console.log('browser ready')
      page = await br.see_webPage(browser, testConst.browser.url_address)
      console.log('page ready')

      console.log('fill field email and click login btn')
      console.log('logged')

  }, testConst.browser.timeout)

  afterAll(async () => {
      await browser.close()
  }, testConst.browser.timeout)

Auth.login(page)
 

login.js

 'use strict'

const testConst = require('../const.js')
const selectors = require('../selectors')
const action = require('../actions')

class login{
  static async login(page) {

    describe('go to OrgTracker from launchpad', () => {
        test('open card Org Tracker tool in launchpad', async () => {
          await page.waitForSelector(selectors, {
            visible: true
          })
          await page.click(selectors)
          await page.waitForSelector(selectors, {
            visible: true
          })
        }, testConst.browser.timeout)
      })
  }

}

module.exports=login
 

But this combo not working, after run test:login I see error TypeError: Cannot read property ‘waitForSelector’ of undefined

Ответ №1:

Your problem is the Auth.login(page) statement at the end of your code. The page variable isn’t initialized yet at that point. Besides, you’re already calling it inside your beforeAll which seems about correct, depending on what you’re trying to achieve.

Комментарии:

1.You are right, I made mistake in the code to the question. no need to call login function in beforeAll . Thanks for the answer, maybe it will help me.

2.@Stiker if it does help (or there isn’t another more helpful question), mark the answer as the solution to your question.

Ответ №2:

works like this

login.spec.js

 'use strict'
const testConst = require('../const')
const selectors = require('../selectors')
const action = require('../actions')
const br = require('../browser')
const Auth = require('../login')

let page
let browser

const emails_correctData =  testConst.users.correctData.emails
const password_correctData = testConst.users.correctData.passwords

  beforeAll(async () => {
    // set up Puppeteer
      browser = await br.set_up_Puppeteer(true);
      console.log('browser.isConnected');
      // Web page
      page = await br.see_webPage(browser, testConst.browser.url_address, 'user');
      console.log('browser ready');

  }, testConst.browser.timeout)

  afterAll(async () => {
      await browser.close();
  }, testConst.browser.timeout)

  describe('login on system', async() => {

      test('login page as '   emails_correctData.email1   ' logged correctly', async () => {
          console.log('fill field email and click login btn')

          await Auth.login( page, emails_correctData.email1, password_correctData.password)
          // full page screenshot
          await action.make_screenshot(page,  testConst.screenshot.path_afterLogin, '_after_login.jpg')
          console.log('logged')
      }, testConst.browser.timeout)

  })
 

login.js

 'use strict'

const testConst = require('../const')
const selectors = require('../selectors')
const action = require('../actions')

class Auth{

    static async login( page, emails_correctData, password) {
      await page.click(selectors.login.signIn).then(async()=>{
         await expect(page.waitForSelector(selectors.login.email)).toBeTruthy()
       })
       console.log('click signIn')
       await action.fillField(page, selectors.login.email, emails_correctData)

       console.log('fillField email')
       await action.fillField(page, selectors.login.password, password)

       console.log('fillField password')
       await page.click(selectors.login.btnLogin).then(async()=>{
         console.log('click btn signIn')
         const userName = await page.$eval(selectors.menu.start, e => e.innerHTML)
         expect(userName).toBe(testConst.users.correctData.userName.userName1)
       },testConst.browser.timeout)
  }
  
}

module.exports=Auth
 

Но это не решает мою проблему. Я хотел указать целые группы тестов в классе и сделать их там, где мне это нужно.