typescript 页面加载后无法获取cypress新位置/href

abithluo  于 2023-01-10  发布在  TypeScript
关注(0)|答案(1)|浏览(160)

我正尝试在Cypress上执行此测试:
1.获取当前页面的URL参数/查询,例如:本地主机:3000/?重定向链接= X
1.单击当前页面内的跳过按钮
1.重定向到另一个页面(这是一个页面,而不是组件,所以它是外部/跨域)
1.位置应等于X
但是第4步的Assert失败了,我想测试一下新的重定向页面是否与查询字符串参数中传递的相同。
我在做:

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}')
      })
    })

在cypress中,这个"should"比预期执行得更早:

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

如果我在location中输入wait(10000)或timeout,那么在加载PAGE X之后,它会在执行wait时在location href阶段将LOCALHOST的值更改为null,加载之后失败:* * AssertPAGE 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

尝试在测试中的所有内容中设置超时,然后在点击后,但仍然不起作用。
编辑:
当我这样做:
一个三个三个一个
由于它是跨域的,我还尝试在窗口更改时放置一个事件侦听器,但它没有在任何字段中显示PAGE X链接(路径:空,目标位置空)

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

vdzxcuhz1#

由于重定向是到一个跨域的位置,你 * 必须 * 使用cy.origin() Package 器来Assert关于新域的任何内容。
问题是新的域必须是硬编码的,它不能像您在测试的顶部尝试做的那样从旧的域参数计算出来。
比如说这个

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)
})

相关问题