Jest-JS Pupetter ждут запуска кукловода newPage возвращает неопределенный - PullRequest
0 голосов
/ 11 февраля 2019

Я хочу запустить тест с использованием puppetter, я настраиваю тест с использованием puppetter beforeAll и использую параметр done для завершения настройки

beforeAll(async (done) => {  
  try{
    browser = await puppeteer.launch({
      headless: false,
      slowMo: 20,
      args: [`--window-size=${width},${height}`]
    })
    page = await browser.newPage()
    await page.setViewport({ width, height })
    done()
  } catch (e){
    fail("SETUP FAILED:\n"+e)
  }
}

и test, тест будет запущенпосле beforeAll это done верно?

test('Test Invalid Username Password', async () => {
    try {
      await page.goto(APP_URL)
      await page.click('[data-testid="form-username"]')
      await page.keyboard.type(username)
      //omitted
    } catch (e) {
      fail('AN EXCEPTION IS THROWED\n'+e)
    }
  }, 200000);

Я получил ошибку Cannot read property 'goto' of undefined"

почему иногда возвращается undefined, а иногда нет?Я полагаю, это из-за того, что хром еще не готов?но я уже пишу await, разве этого недостаточно?

Что еще нужно проверить, прежде чем хром будет готов к использованию?не определено?

ОБНОВЛЕНИЕ

ошибка, когда оно не определено

Test Invalid Username Password

    Failed: "AN EXCEPTION IS THROWED
    TypeError: Cannot read property 'goto' of undefined"

      51 |       expect(errorMessage).toEqual(loginExpectedResult.TEST_INVALID_USERNAME_AND_PASSWORD)
      52 |     } catch (e) {
    > 53 |       fail('AN EXCEPTION IS THROWED\n'+e)
         |       ^
      54 |     }
      55 |   }, 200000);
      56 |

      at Env.fail (node_modules/jest-jasmine2/build/jasmine/Env.js:656:39)
      at Object.fail (test/logintest/login.test.js:53:7)
      at tryCatch (node_modules/regenerator-runtime/runtime.js:65:40)
      at Generator.invoke [as _invoke] (node_modules/regenerator-runtime/runtime.js:303:22)
      at Generator.prototype.(anonymous function) [as next] (node_modules/regenerator-runtime/runtime.js:117:21)
      at asyncGeneratorStep (test/logintest/login.test.js:17:103)
      at _next (test/logintest/login.test.js:19:194)
      at test/logintest/login.test.js:19:364
      at Object.<anonymous> (test/logintest/login.test.js:19:97)

fail() исходит от жасмина, возможно?Я нашел это с помощью автозаполнения VSCode.Я думал, что это от Джеста.это не может быть использовано?

1 Ответ

0 голосов
/ 11 февраля 2019

Попробуйте изменить fail("SETUP FAILED:\n"+e) вызов на console.log("SETUP FAILED:\n"+e) и сообщите нам, что он регистрирует.

У меня возникла та же проблема, что и при воспроизведении вашей проблемы, потому что я забыл, например, команду require('puppeteer')...

Некоторые дополнительные соображения:

  • вам не нужен вызов done(), функция beforeAll является асинхронной, и вы ждете каждый вызов Puppeteer, так что... функция завершается сама собой без необходимости вызова done().Удалите его даже из переданных параметров

  • , который вы называете fail, но где он определен?

  • удалите большой try/catch вокруг всего, тестВ случае ошибки автоматически происходит сбой с полезной информацией, дополнительное окружение try/catch не приносит вам никаких преимуществ и делает ваши тесты более подробными

Дайте мне знать, если это полезно ?

ОБНОВЛЕНИЕ

В комментариях еще один вопрос об этом

о, и где я могу найти документы, которые beforeAll ожидает завершения асинхронной функции?

Ну, я начинаю с самого начала:

Функция beforeAll - это просто обычная функция JS

beforeAll(() => {  
  // do your sync stuff
}

, так что если вы делаете некоторую асинхронностьвещи внутри него

beforeAll(() => {  
  setTimeout(() => {
    // ...
  }, 1000);
}

он не может знать, что он должен чего-то ждать, поэтому вы можете использовать функцию done

beforeAll((done) => {  
  setTimeout(() => {
    done();
  }, 1000);
}

, поэтому Jest не учитывает это"готово", пока вы не вызовете саму функцию done вручную.Те же значения для обещания

beforeAll((done) => {  
  yourFunctionThatReturnsAPromise(() => {
    done();
  });
}

или некоторого объединения обещаний

beforeAll((done) => {  
  yourFunctionThatReturnsAPromise(() => {
    return anotherPromise();
  }).then(() => {
    return anotherPromise();
  }).then(() => {
    done();
  });
}

, и мы можем сократить его еще

beforeAll((done) => {  
  yourFunctionThatReturnsAPromise(() => anotherPromise())
    .then(() => anotherPromise())
    .then(() => done());
}

Async / Await async/await добавлено для лучшего управления цепочками обещаний, давайте посмотрим, как мы можем преобразовать последнюю функцию

beforeAll(async (done) => {  
  await yourFunctionThatReturnsAPromise())
  await anotherPromise();
  done();
}
  • мы await каждое обещание
  • мы добавляемasync функции, переданной в beforeAll

При этом каждое обещание автоматически ожидает, и мы сообщаем JS, что наша функция асинхронная, и она автоматически ожидает завершения обещания, прежде чем считать нашу функцию завершенной.И поскольку он ожидает автоматически ... теперь мы можем удалить done use

beforeAll(() => {  
  await yourFunctionThatReturnsAPromise())
  await anotherPromise();
}

Теперь мы можем применить это к вашему сценарию: помните, что почти каждая функция Puppeteer возвращает обещание, чтобы мы могли написать установкуиспользуйте такую ​​функцию

beforeAll((done) => {  
  puppeteer.launch({
    headless: false,
    slowMo: 20,
    args: [`--window-size=${width},${height}`]
  }).then(browser => {
    return browser.newPage();
  }).then(page => {
    return page.setViewport({ width, height });
  }).then(() => {
    done();
  })
}

и преобразуйте ее в исходную

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

, но поскольку это асинхронная функция, и вы await все вызовы Кукловода вы можете удалить done function

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

, поскольку автоматически ожидается функция async, она не заканчивается без ожидания разрешения обещаний (тех, которые вы await явно).

...