Кукольник - тесты не выполняют никаких действий

Итак, я использую Puppeteer с Jest. После добавления

    const browser = await puppeteer.launch({ headless: false });
    const page = await browser.newPage();

Мои тесты не выполняют никаких действий. Неважно, использую ли я безголовый режим или, скажем так, «нормальный» режим. Кто-нибудь может мне помочь?

домашняя страница.test.js

const puppeteer = require('puppeteer');
const HomePage = require('./page_objects/HomePage');

const homePage = new HomePage();
describe('Homepage', () => {
  beforeAll(async () => {
    const browser = await puppeteer.launch({ headless: false });
    const page = await browser.newPage();
    await page.goto(homePage.path);
    await page.waitForSelector(homePage.loginPanel);
  });
  it('Log into your account', async () => {
    await homePage.fillLoginForm();
    await expect(page).toMatchElement(homePage.productList);
    await page.screenshot({ path: 'example.png' });
  });

Домашняя страница.js

module.exports = class HomePage {
  constructor() {
    this.path = 'https://www.saucedemo.com/index.html';
    this.loginPanel = '#login_button_container';
    this.productList = 'div[class = "inventory_container"]';
    this.loginForm = {
      fields: {
        usernameInput: 'input[id = "user-name"]',
        passwordInput: 'input[id = "password"]',
        logInButton: 'input[class = "btn_action"]',
      },
    };
  }

  async fillLoginForm() {
    await page.type(this.loginForm.fields.usernameInput, 'standard_user');
    await page.type(this.loginForm.fields.passwordInput, 'secret_sauce');
    await page.click(this.loginForm.fields.logInButton);
  }
};

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
779
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ответ состоит из двух частей: одна с обычным jest, а другая с jest-puppeteer. Вы можете перейти к jest-puppeteer, если хотите.

Проблема (с jest):

Блок browser и page внутри блока beforeAll не имеет отношения к блокам it. Он также не имеет никакого отношения к классу page внутри HomePage.

Вы не упомянули, использовали ли вы jest-puppeteer или нет.

Решение:

Создайте переменные области блока для блока описания и передайте объект страницы модулям.

Уточнение класса HomePage

Рассмотрим следующий класс HomePage.

// HomePage.js
class HomePage {
  constructor(page) {
    this.page = page;
  }

  async getScreenshot() {
    await this.page.screenshot({ path: "example.png" });
  }

  async getTitle(page) {
    return page.title();
  }
}

Как видите, есть два способа доступа к странице внутри класса. Либо передайте внутри конструктора, либо используйте с методом напрямую.

Метод getScreenshot имеет this.page, а getTitle имеет доступ к page.

Уточнение теста

Вы не можете использовать this внутри шутливых тестов из-за Эта проблема, но вы можете объявить переменную поверх блока, а затем получить к ней доступ позже.

describe("Example", () => {
  // define them up here inside the parent block
  let browser;
  let page;
  let homepage;

  beforeAll(async () => {
    // it has access to the browser, page and homepage
    browser = await puppeteer.launch({ headless: true });
    page = await browser.newPage();
    homepage = new HomePage(page); // <-- pass the page to HomePage here

    await page.goto("http://example.com");
    await page.waitForSelector("h1");
    return true;
  });
});

Теперь все остальные блоки могут получить доступ к странице. В соответствии с нашим предыдущим примером класса HomePage мы можем сделать одно из следующих действий в зависимости от того, как мы определили методы.

it("Gets the screenshot", async () => {
    await homepage.getScreenshot(); // <-- will use this.page
  });
it("Gets the title", async () => {
    await homepage.getTitle(page); // <-- will use the page we are passing on
});

Наконец мы очищаем тесты,

afterAll(async () => {
    await page.close();
    await browser.close();
    return true;
});

Вероятно, нам нужно запустить шуточные тесты с detectOpenHandles для полного режима.

jest . --detectOpenHandles

Результат:

Проблема (с jest-puppeteer):

jest-puppeteer уже дает вам глобальный браузер и объект страницы. Вам не нужно ничего определять.

Однако, если вы хотите использовать jest-puppeteer и expect-puppeteer, вам нужно использовать собственный файл конфигурации.

Решение:

Создайте файл jest-config.json и поместите содержимое,

{
  "preset": "jest-puppeteer",
  "setupFilesAfterEnv": ["expect-puppeteer"]
}

Теперь избавьтесь от браузера и кода создания страницы, а также от любых afterAll ловушек для page.close.

Вот рабочий тестовый файл,

class HomePage {
  async getTitle() {
    return page.$("h1");
  }
}

describe("Example", () => {
  const homepage = new HomePage();
  beforeAll(async () => {
    // it has access to a global browser, page and scoped homepage

    await page.goto("http://example.com");
    await page.waitForSelector("h1");
  });
  it("Gets the screenshot", async () => {
    const element = await homepage.getTitle();
    await expect(element).toMatch("Example");
  });
});

И давайте запустим это,

jest . --detectOpenHandles --config jest-config.json

Результат:

Другие вопросы по теме