无法使用 Cypress 在同一选项卡中打开 link
Unable to open link within same tab using Cypress
在我们的网页中,我们有各种在新选项卡中打开的链接,但显然我们在使用 Cypress 时需要在同一选项卡中打开它们。
我试过了
cy.get('tr td:nth-child(9)').eq(index).invoke('removeAttr', 'target').click()
但这仍然会在新标签页中打开 URL。
我也试过添加 find('a')
:
cy.get('tr td:nth-child(9)').eq(index).find('a').invoke('removeAttr', 'target').click()
但页面从未加载(我也尝试增加超时,但仍然失败)。
我想让上面的代码工作,但我也发现了这个可行的替代方法,所以我想我对下面这段代码的工作感到困惑,但我无法让调用工作。
cy.get('tr td:nth-child(9)').eq(index).find('a').then(link => {
cy.request(link.prop('href')).its('status').should('eq', 200)
欢迎任何反馈!谢谢
这个的一般配方是
cy.get('tr td:nth-child(9)').eq(index).find('a')
.then($el => {
expect($el).to.have.attr('target','_blank')
// update attr to open in same tab
$el.attr('target', '_self')
})
.click()
可能并不总是需要 _self
值,但另一个方面是您更新 DOM 时的时间。
你也可以试试这个
cy.get('tr td:nth-child(9)').eq(index).find('a')
.invoke('attr', 'href').then(myLink => {
cy.visit(myLink);
})
交叉原点
查看此博客 Stub window.open,展示了一种将 window 打开存根的方法。
let stub // variable that will hold cy.stub created in the test
Cypress.on('window:before:load', (win) => {
if (stub) {
Object.defineProperty(win, 'open', {
get() {
return stub
}
})
}
})
beforeEach(() => {
stub = null
})
const href = 'url/that/link/takes/you to'
it('check that window open was called', () => {
cy.visit('/') // not stubbing this
stub = cy.stub().as('open')
cy.get('tr td:nth-child(9)').eq(index).find('a')
.click() // trigger window.open
cy.get('@open')
.should('have.been.calledWith', href) // check href is called
})
it('tests the link page further', () => {
cy.visit(href)
// continue tests
})
如果你的 href 是可变的,你可以在 beforeEach 中获取它
beforeEach(() => cy.visit('/'))
beforeEach(() => {
cy.get('tr td:nth-child(9)').eq(index)
.find('a').invoke('attr', 'href').as('href') // link value into an alias
})
it('check that window open was called', () => {
cy.get('@href').then(href => {
stub = cy.stub().as('open')
cy.get('tr td:nth-child(9)').eq(index).find('a')
.click() // trigger window.open
cy.get('@open')
.should('have.been.calledWith', href) // check href is called
})
})
it('tests the link page further', () => {
cy.get('@href').then(href => {
cy.visit(href)
// continue tests
})
})
在我们的网页中,我们有各种在新选项卡中打开的链接,但显然我们在使用 Cypress 时需要在同一选项卡中打开它们。
我试过了
cy.get('tr td:nth-child(9)').eq(index).invoke('removeAttr', 'target').click()
但这仍然会在新标签页中打开 URL。
我也试过添加 find('a')
:
cy.get('tr td:nth-child(9)').eq(index).find('a').invoke('removeAttr', 'target').click()
但页面从未加载(我也尝试增加超时,但仍然失败)。
我想让上面的代码工作,但我也发现了这个可行的替代方法,所以我想我对下面这段代码的工作感到困惑,但我无法让调用工作。
cy.get('tr td:nth-child(9)').eq(index).find('a').then(link => {
cy.request(link.prop('href')).its('status').should('eq', 200)
欢迎任何反馈!谢谢
这个的一般配方是
cy.get('tr td:nth-child(9)').eq(index).find('a')
.then($el => {
expect($el).to.have.attr('target','_blank')
// update attr to open in same tab
$el.attr('target', '_self')
})
.click()
可能并不总是需要 _self
值,但另一个方面是您更新 DOM 时的时间。
你也可以试试这个
cy.get('tr td:nth-child(9)').eq(index).find('a')
.invoke('attr', 'href').then(myLink => {
cy.visit(myLink);
})
交叉原点
查看此博客 Stub window.open,展示了一种将 window 打开存根的方法。
let stub // variable that will hold cy.stub created in the test
Cypress.on('window:before:load', (win) => {
if (stub) {
Object.defineProperty(win, 'open', {
get() {
return stub
}
})
}
})
beforeEach(() => {
stub = null
})
const href = 'url/that/link/takes/you to'
it('check that window open was called', () => {
cy.visit('/') // not stubbing this
stub = cy.stub().as('open')
cy.get('tr td:nth-child(9)').eq(index).find('a')
.click() // trigger window.open
cy.get('@open')
.should('have.been.calledWith', href) // check href is called
})
it('tests the link page further', () => {
cy.visit(href)
// continue tests
})
如果你的 href 是可变的,你可以在 beforeEach 中获取它
beforeEach(() => cy.visit('/'))
beforeEach(() => {
cy.get('tr td:nth-child(9)').eq(index)
.find('a').invoke('attr', 'href').as('href') // link value into an alias
})
it('check that window open was called', () => {
cy.get('@href').then(href => {
stub = cy.stub().as('open')
cy.get('tr td:nth-child(9)').eq(index).find('a')
.click() // trigger window.open
cy.get('@open')
.should('have.been.calledWith', href) // check href is called
})
})
it('tests the link page further', () => {
cy.get('@href').then(href => {
cy.visit(href)
// continue tests
})
})