'Ошибка: ожидать (получено).toContain (ожидается) // ошибка indexOf'

Я пытаюсь проверить, существует ли текст при открытии страницы, я пытался использовать toHaveText и toEqual, но столкнулся с той же ошибкой, что и ниже:

Error: expect(received).toContain(expected) // indexOf
Expected value: "Your Versatile Partner for Better Offshoring" 
Received object: {"page": {"_guid": "page@a8169cc2ca7780c3f53341729020b35a", "_type": "Page"}} 
19 | const Homepage = new HomePage(page); 
20 | const expectedTitle = 'Your Versatile Partner for Better Offshoring'; 
> 21 | expect (Homepage).toContain(expectedTitle);

Вот мой полный код:

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

    async getTitle() {
        const Homepage = await this.page.locator("h1[class='display-4 mb-4 mt-8']");
    }
}

Важный класс:

import { test, expect } from "@playwright/test";
import { LoginPage } from "../pages/unientSite-page/LoginPage";   
import { HomePage } from "../pages/unientSite-page/Homepage";

test.use({
    launchOptions: { slowMo: 1000 },
    headless: false
});


test('Login', async ({ page }) => {
    //Login page
    const loginPage = new LoginPage(page);
    await loginPage.goto();

    //Homepage
    const Homepage = new HomePage(page);
    const expectedTitle = 'Your Versatile Partner for Better Offshoring';
    expect (Homepage).toContain(expectedTitle);

});

Я не уверен, как это исправить или, может быть, вы можете предложить альтернативный способ проверки текста при доступе к странице?

Какой текст вы пытаетесь проверить? <h1> или заголовок страницы (то, что отображается на вкладке браузера, например <title>foo</title> в HTML).

ggorlen--on LLM strike 18.04.2023 19:46

извините за путаницу, это <h1> а не заголовок

Sarah G 19.04.2023 03:07
Поведение ключевого слова "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
2
170
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Предлагаемый способ проверить заголовок страницы:

await expect(page).toHaveTitle(/.*expectedText/);
Ответ принят как подходящий

Совет: старайтесь избегать написания преждевременных абстракций. Если вы новичок в Playwright и изо всех сил пытаетесь получить правильный код, я бы забыл о POM для начала. Когда у вас есть правильный код, вы можете перенести его в POM. Если вы попытаетесь сделать несколько незнакомых вещей одновременно, легко запутаться.

Утверждение toContain проверяет, есть ли в строке подстрока. Передача объекта POM не будет работать.

Большинство ваших утверждений, вероятно, будут утверждениями локатора. Идиоматический подход Playwright заключается в использовании утверждений веб-первых, поэтому вы, вероятно, не будете часто использовать toContain, если только это не какая-то примитивная строка и не задействован локатор. Это не применимо здесь - у нас есть локатор.

Вот минимальный пример использования toHaveText, который кажется наиболее подходящим утверждением:

import {expect, test} from "@playwright/test"; // ^1.30.0

test("header has correct text", async ({page}) => {
  await page.setContent(
    `<h1>Your Versatile Partner for Better Offshoring</h1>`
  );
  await expect(page.locator("h1"))
    .toHaveText("Your Versatile Partner for Better Offshoring");
});

Убедитесь, что вы можете запустить этот тест и увидеть, как он проходит:

$ npx playwright test

Running 1 test using 1 worker

  ok 1 test.spec.mjs:5:1 › header has correct text (1.0s)


  1 passed (13.0s)

Всегда временно прерывайте тест, чтобы убедиться, что он не дает ложных срабатываний:

await expect(page.locator("h1")).toHaveText("NO");
    Error: expect(received).toHaveText(expected)

    Expected string: "NO"
    Received string: "hello world"
    Call log:
      - expect.toHaveText with timeout 5000ms
      - waiting for locator('h1')
      -   locator resolved to <h1>hello world</h1>
      -   unexpected value "hello world"

      4 |
      5 | test("header has 'hello world' text", async ({page}) => {
    > 6 |   await expect(page.locator("h1")).toHaveText("NO");
        |                                    ^
      7 | });

Далее напишите POM. Я буду проще и сделаю это в одном файле, но вы можете разбить это на отдельный файл и импортировать его.

class HomePage {
  constructor(page) {
    this.page = page;
    this.header = page.locator("h1");
  }

  async goto() {
    // replace this.page.goto for example purposes
    await this.page.setContent(
      `<h1>Your Versatile Partner for Better Offshoring</h1>`
    );
  }
}

test.describe("home page", () => {
  test("header has correct text", async ({page}) => {
    const homePage = new HomePage(page);
    await homePage.goto();
    await expect(homePage.header)
      .toHaveText("Your Versatile Partner for Better Offshoring");
  });
});

Запуск этого должен дать тот же результат.

После того, как вы это настроите, просто добавьте больше локаторов в конструктор, а затем добавьте методы действий более высокого уровня, такие как fillOutCredentials, acceptCookies и т. д., которые состоят из .fill() и .click() вызовов ваших локаторов. Тест может выглядеть так:

const loginPage = new LoginPage(page);
await loginPage.goto();
await loginPage.fillOutCredentials();
await expect(loginPage.username).toHaveText("some sample username");
await expect(loginPage.password).toHaveText("**********");
await loginPage.authenticate();
await expect(page).toHaveTitle("Welcome to the App");

Помните, низкоуровневые вызовы page.click(), page.fill() можно сгенерировать и встроить в тест для начала, а затем перенести в POM после того, как все утверждения будут пройдены и тщательно протестированы.

Обратите внимание, что при определении локатора селектор CSS, такой как h1[class='display-4 mb-4 mt-8'], не рекомендуется в Playwright, потому что он не обращен к пользователю . Поскольку у меня нет вашего DOM, я не могу предложить лучшее предложение, но, возможно, поищите роль арии или используйте генератор драматурга, чтобы он выбрал лучший для вас.

Даже если вы используете селектор CSS, предпочтите h1.display-4.mb-4.mt-8 вышеприведенному селектору атрибутов [class='...']. Причина в том, что при изменении порядка классов или добавлении дополнительного класса селектор атрибутов ломается. Версия с точечной нотацией не так требовательна к таким вещам, как порядок классов и пробелы, которые вам, вероятно, не нужно проверять.

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