Используя драматурга, page.url() получает предыдущий URL-адрес вместо текущего URL-адреса

#automation #playwright

Вопрос:

Я тестирую навигацию на нашем веб-сайте с помощью expect(page.url()).toContain('/nav'); . При просмотре кода я ясно вижу, что мы попали в эту строку URL-адреса после щелчка.

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

 Expected substring: "/nav"
Received string:    "https://website.com/about"

      283 |     page.waitForNavigation();
      284 |     await page.hover('nav >> text=Nav');
      285 |     await page.click('nav >> text=Nav');
      286 |     console.log(page.url());
    > 287 |     expect(page.url()).toContain('/nav');
          |                        ^
      288 |
      289 |     page.click('text=Next Nav')
      290 |     expect(page.url()).toContain('/nextNav');
 

Сама ссылка очень проста <a href="/nav" class="list__item__link" data-v-0df6efc8>Nav</a> .

Отображается журнал консоли https://website.com/about .

Вот фрагмент, связанный с комментариями:

 ////##OURSTORY##////
    page.hover('nav >> text=Our Story');
    page.waitForNavigation();
    await page.click('nav >> text=About');
    expect(page.url()).toContain('story');

    //await page.pause();

    await page.hover('nav >> text=Our Story');
    await page.hover('nav >> text=360° Wellness');
    await page.click('nav >> text=360° Wellness'); 
    console.log(page.url());
    await page.waitForNavigation();
    expect(page.url()).toContain('/360-wellness');
 

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

1. Вы пробовали преобразовать URL-адрес в строку?

2. Если url() уже возвращает строку, то, возможно, отсутствующие await ранее page.url() могли бы ее решить? Пожалуйста, дайте нам знать, если это сработает.

3. Я добавил await перед page.url() , и это не помогло. Моя IDE даже говорит, что это не нужно. page.url() уже преобразует его в строку, это встроенная функциональность.

4. Я понимаю. И вы уверены, что в URL-адресе действительно есть этот /nav текст? вы проверяли это с headless: false помощью ?

5. Да, я могу подтвердить. При использовании await page.pause() и прохождении кода я могу отчетливо видеть /nav в URL-адресе, а затем получить ошибку выше. И я всегда провожу свои тесты внутри headless: false .

Ответ №1:

Хорошо, поэтому я page.waitForNavigation() с самого начала немного опасался использовать его, поэтому я еще раз подумал о необходимости использовать его здесь. Оказывается, на самом деле нам это не нужно. Учитывая различия во времени загрузки, я добавил waitForSelector() , что это должно занять 30 секунд (или вы могли setTimeout бы установить пользовательское время ожидания).

Кроме того, вот немного о waitForNavigation() методе —

page.waitForNavigation() возвращает обещание, которое будет выполнено только после завершения навигации. В документации упоминается —

В случае перехода на другой якорь или навигации из-за использования API Истории, навигация будет разрешена с null помощью .

Поскольку подход к разработке сайта может быть неоднозначным, возможно, лучше избегать использования указанной функции. Тем более, что в нем также говорится —

Это полезно при выполнении кода, который косвенно приведет к перемещению страницы

.., для чего, честно говоря, я не совсем ясно понимаю, как это использовать.

В любом случае, вот что сработало; полный test.spec.ts файл —

 import { Page } from "playwright-core";

describe("Test Suite for a patient random guy on Stack Overflow", () => {
  it("Test Gen: [URL Text] Testing the correct URL path", async () => {
    let page: Page;
    page = await context.newPage();
    await page.goto("https://ariix.newage.com");
    page.hover("nav >> text=Our Story");
    await page.waitForSelector("nav >> text=About");
    await page.click("nav >> text=About");
    console.log(page.url());
    expect(page.url()).toContain("story");
    //await page.pause();
    await page.hover("nav >> text=Our Story");
    await page.waitForSelector("nav >> text=360° Wellness");
    await page.click("nav >> text=360° Wellness");
    console.log(page.url());
    expect(page.url()).toContain("/360-wellness");
  });
});
 

И, похоже, он делает/печатает то, к чему вы стремились —

введите описание изображения здесь

Надеюсь, это решит эту проблему с вашей стороны. Дайте нам знать 🙂