Я пытаюсь выполнить этот тест на Cypress:
получить параметр/запрос URL текущей страницы например: локальный: 3000/?redirect_link=X
Нажмите кнопку пропуска внутри текущей страницы.
Перенаправляет на другую страницу (это страница, а не компонент, поэтому она внешняя/междоменная)
Местоположение должно быть равно 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.href после загрузки страницы?
Если я сделаю cy.log(a), да, он изменится на null в приложении Cypress.
Поскольку перенаправление происходит в междоменное местоположение, вам придется использовать оболочку 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)
})
Можете ли вы поделиться примером того, что будет храниться в свойстве location?