Не удалось получить новое местоположение/href кипариса после загрузки страницы

Я пытаюсь выполнить этот тест на Cypress:

  1. получить параметр/запрос URL текущей страницы например: локальный: 3000/?redirect_link=X

  2. Нажмите кнопку пропуска внутри текущей страницы.

  3. Перенаправляет на другую страницу (это страница, а не компонент, поэтому она внешняя/междоменная)

  4. Местоположение должно быть равно X

Но утверждение на шаге 4 терпит неудачу, я хочу проверить, равна ли новая перенаправленная страница той же самой, переданной в параметре строки запроса.

Я делаю:

  beforeEach(() => {
    cy.visit('/?redirect_link=X')
  })

  it('it skips and then redirects to another page', () => {
    cy.location().then((local) => {
      const arr = local.search.split('?')[1].split('&')
      const paramObj = {} as any
      arr.forEach((param) => {
        const [key, value] = param.split('=')
        if (key === 'redirect_link') {
          paramObj[key] = value
          cy.wrap(paramObj.redirect_link).as('redirect_link')
        }
      })
    })

    cy.get('[data-testid = "button"]').click()

    cy.get('@redirect_link').then((redirect_link: string) => {
        cy.location('href').should('eq', '{PAGE X HERE}')
      })
    })

В кипарисе это «должен» выполняется раньше, чем ожидалось:

location
wrap redirect link
get button
click
location href
expected 'LOCALHOST' to equal PAGE X

Если я помещаю ожидание (10000) или тайм-аут в местоположение, после загрузки СТРАНИЦЫ X он меняет значение LOCALHOST на null на этапе местоположения href во время выполнения ожидания, терпя неудачу после загрузки: утверждение ожидаемого нулевого значения для СТРАНИЦЫ X

Я также пытался использовать:

cy.url().then(() => )  // same return since it's same to cy location href
cy.on('window:load') // returns null when try to get the url
cy.on('url:changed) // returns null when try to get the url

Пытался поставить тайм-аут во всем в тесте, затем после щелчка, но все равно не работает.

Редактировать:

Когда я делаю:

cy.get('@redirect_link').then((redirect_link: string) => {
   cy.location('href').then((a) => console.info(a))
})
// it returns the current location href
wait(10000)
cy.get('@redirect_link').then((redirect_link: string) => {
   cy.location('href').then((a) => console.info(a))
})
// it returns null

Поскольку это междоменный домен, я также попытался установить прослушиватель событий при изменении окна, но он не показывает ссылку PAGE X ни в одном поле (путь: ноль, целевое местоположение ноль)

    cy.on('window:before:unload', (e) => {
      console.info(e)
    })
   // doesn't return any page X link

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

jjhelguero 06.01.2023 16:58

Обновляется ли location.href после загрузки страницы?

jjhelguero 06.01.2023 18:26

Если я сделаю cy.log(a), да, он изменится на null в приложении Cypress.

Lucy 06.01.2023 18:31
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Мне нравится библиотека Mantine Component , но заставить ее работать без проблем с Remix бывает непросто.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
TypeScript против JavaScript
TypeScript против JavaScript
TypeScript vs JavaScript - в чем различия и какой из них выбрать?
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Не все нужно хранить на стороне сервера. Иногда все, что вам нужно, это постоянное хранилище на стороне клиента для хранения уникальных для клиента...
Что такое ленивая загрузка в Angular и как ее применять
Что такое ленивая загрузка в Angular и как ее применять
Ленивая загрузка - это техника, используемая в Angular для повышения производительности приложения путем загрузки модулей только тогда, когда они...
3
3
70
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Поскольку перенаправление происходит в междоменное местоположение, вам придется использовать оболочку cy.origin(), чтобы утверждать что-либо о новом домене. Ожидания недостаточно.

Проблема в том, что новый домен должен быть жестко запрограммирован, его нельзя рассчитать по параметрам старого домена, как вы пытаетесь сделать в начале теста.

Например, это работает

const redirect = 'http://example.com'

it('it redirects to another page', () => {

  cy.visit(`/?redirect_link=${redirect}`)

  cy.get('[data-testid = "button"]').click()

  // pass the expected url string in to the sandbox
  cy.origin(redirect, { args: {redirect} }, ({redirect}) => {
    cy.location()
      .should('eq', redirect)
  })
})

Затем вы можете протестировать параметры местоположения отдельно, не выполняя перенаправление, например

const redirect = 'http://example.com/'

it('it has the redirect in the location parameter', () => {

  cy.visit(`/?redirect_link=${redirect}`)

  cy.location().then((local) => {
    const arr = local.search.split('?')[1].split('&')
    const paramObj = {} 
    arr.forEach((param) => {
      const [key, value] = param.split('=')
      if (key === 'redirect_link') {
        paramObj[key] = value
        cy.wrap(paramObj.redirect_link).as('redirect_link')
      }
    })
  })

  cy.get('@redirect_link')
    .should('eq', redirect)
})

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

Похожие вопросы

Ошибка машинописного текста: возвращаемый тип базового конструктора «InstanceType<T>» не является типом объекта или пересечением типов объектов со статически известными членами
Объявления TypeScript .d.ts не обнаружены при использовании checkJs
Что я должен использовать вместо document.domain, чтобы получить домен?
Тип «неопределенный» не может быть присвоен типу «Элемент | нулевой'
VM500: 1 ОШИБКА TypeError: невозможно прочитать свойства undefined (чтение «элементов управления») в Angular 15
TypeScript выдает следующую ошибку при добавлении возвращаемого типа для запроса в запросе RTK
Сообщение об ошибке React.js Vercel Deploy | Ошибка: после завершения сборки не найден выходной каталог с именем «сборка»
Как выполнить JOIN в Supabase с моими таблицами?
Сборник рассказов: React не определяется при обновлении до v18
Почему мой свежий проект vue3, сгенерированный с помощью Vue-cli в Typescript с vue-cli-i18n, не работает «из коробки»?