使用 data-cy 属性作为选择器的 Cypress 中的条件测试
Conditional Tests in Cypress using data-cy attributes as selectors
我看到一些关于这个确切主题的帖子,但是 none 其中 类 使用数据 类 就像我作为选择器一样,所以这使得这个条件测试有点难写。
我的想法是,我有一个带有分页的 table。我的想法是检查 [data-cy-pagination-next]
是否有或没有 disabled 属性,这意味着有不止一页,因此测试可以继续。
我看到的大多数帖子都使用这样的语法:
cy.get('my-button')
.then($button => {
if ($button.is(':enabled')) {
cy.wrap($button).click()
}
})
但我没有他们描述的 $button
。我点击的是一个按钮,但这真的重要吗?
好像不会写
cy.get('[data-cy=pagination-next]')
.then('[data-cy=pagination-next]' => {
if ('[data-cy=pagination-next]'.is(':enabled')) {
cy.wrap('[data-cy=pagination-next]').click()
}
})
我怎样才能让这个条件生效?
如果不止一页,这个测试效果很好,但在没有第二页的情况下,我只想让测试到此结束。
任何提示将不胜感激!
干杯!
这是目前的测试
it('Data Source has Pagination and test functionality', () => {
cy.get('[data-cy=pagination]').should('exist')
// assert that we are at the first page and the start and back button is disabled
cy.get('[data-cy=pagination-page-list]').contains('Page 1 of')
// If there are multiple pages then do the following tests
// click next button and assert that the current page is page 2
cy.get('[data-cy=pagination-next]').click()
cy.get('[data-cy=pagination-page-list]').contains('Page 2 of')
// click end button and assert that the end and next buttons are disabled
cy.get('[data-cy=pagination-end]').click()
cy.get('[data-cy=pagination-next]').should('be.disabled')
cy.get('[data-cy=pagination-end]').should('be.disabled')
// click start button button and assert that the current page is page 1 and next and start buttons are disabled
cy.get('[data-cy=pagination-start]').click()
cy.get('[data-cy=pagination-page-list]').contains('Page 1 of')
cy.get('[data-cy=pagination-start]').should('be.disabled')
cy.get('[data-cy=pagination-back]').should('be.disabled')
})
我认为您误解了屈服和回调的工作原理。 .then()
中有 $button
的原因是因为它是由 cy.get()
产生的。它可以被命名为任何东西,只要它是一个有效的名称(注意:字符串文字,就像你试图做的那样,是无效的)。
因此,$button
只是从您的 cy.get('my-button')
中生成的元素。这就是为什么我们可以在其上使用 JQuery 函数和 Chai 断言。
cy.get('[data-cy=pagination-next]')
.then($el => { // naming the yielded object from `cy.get()` to $el
if ($el.is(':enabled')) { // using JQuery function `.is` to check if the element is enabled
cy.wrap($el).click() // Cypress requires the JQuery element to be wrapped before it can click it.
}
})
你可以这样做。您可以使用 each
遍历所有分页元素。因此,如果您没有只有 2 个按钮,循环将只检查 2 个按钮,然后终止。
cy.get('[data-cy=pagination-page-list]').should('contain.text', 'Page 1 of')
cy.get('[data-cy=pagination-next]').each(($ele, index) => {
if ($ele.is(':enabled')) {
cy.wrap($ele).click()
cy.wrap($ele).should('contain.text', `Page ${index + 2} of`) //index starts from 0
}
})
您可以使用页面指示器拆分测试逻辑
it('Data Source has Pagination and test functionality', () => {
cy.get('[data-cy=pagination]').should('exist')
cy.get('[data-cy=pagination-page-list]')
.then($pageList => {
if ($pageList.text() === 'Page 1 of 1')
// single page assertions
cy.get('[data-cy=pagination-next]').should('be.disabled')
cy.get('[data-cy=pagination-end]').should('be.disabled')
cy.get('[data-cy=pagination-start]').should('be.disabled')
cy.get('[data-cy=pagination-back]').should('be.disabled')
} else {
// multi page assertions
cy.get('[data-cy=pagination-next]').click()
cy.get('[data-cy=pagination-page-list]')
.should('contain', 'Page 2 of') // assert on second page
cy.get('[data-cy=pagination-end]').click()
cy.get('[data-cy=pagination-next]').should('be.disabled')
cy.get('[data-cy=pagination-start]').click()
cy.get('[data-cy=pagination-page-list]').contains('Page 1 of')
cy.get('[data-cy=pagination-start]').should('be.disabled')
cy.get('[data-cy=pagination-back]').should('be.disabled')
}
})
更好的是,控制测试数据,以便只存在一个页面,然后 运行 在已知条件下进行两次测试,并消除不稳定的条件测试。
我看到一些关于这个确切主题的帖子,但是 none 其中 类 使用数据 类 就像我作为选择器一样,所以这使得这个条件测试有点难写。
我的想法是,我有一个带有分页的 table。我的想法是检查 [data-cy-pagination-next]
是否有或没有 disabled 属性,这意味着有不止一页,因此测试可以继续。
我看到的大多数帖子都使用这样的语法:
cy.get('my-button')
.then($button => {
if ($button.is(':enabled')) {
cy.wrap($button).click()
}
})
但我没有他们描述的 $button
。我点击的是一个按钮,但这真的重要吗?
好像不会写
cy.get('[data-cy=pagination-next]')
.then('[data-cy=pagination-next]' => {
if ('[data-cy=pagination-next]'.is(':enabled')) {
cy.wrap('[data-cy=pagination-next]').click()
}
})
我怎样才能让这个条件生效? 如果不止一页,这个测试效果很好,但在没有第二页的情况下,我只想让测试到此结束。 任何提示将不胜感激!
干杯!
这是目前的测试
it('Data Source has Pagination and test functionality', () => {
cy.get('[data-cy=pagination]').should('exist')
// assert that we are at the first page and the start and back button is disabled
cy.get('[data-cy=pagination-page-list]').contains('Page 1 of')
// If there are multiple pages then do the following tests
// click next button and assert that the current page is page 2
cy.get('[data-cy=pagination-next]').click()
cy.get('[data-cy=pagination-page-list]').contains('Page 2 of')
// click end button and assert that the end and next buttons are disabled
cy.get('[data-cy=pagination-end]').click()
cy.get('[data-cy=pagination-next]').should('be.disabled')
cy.get('[data-cy=pagination-end]').should('be.disabled')
// click start button button and assert that the current page is page 1 and next and start buttons are disabled
cy.get('[data-cy=pagination-start]').click()
cy.get('[data-cy=pagination-page-list]').contains('Page 1 of')
cy.get('[data-cy=pagination-start]').should('be.disabled')
cy.get('[data-cy=pagination-back]').should('be.disabled')
})
我认为您误解了屈服和回调的工作原理。 .then()
中有 $button
的原因是因为它是由 cy.get()
产生的。它可以被命名为任何东西,只要它是一个有效的名称(注意:字符串文字,就像你试图做的那样,是无效的)。
因此,$button
只是从您的 cy.get('my-button')
中生成的元素。这就是为什么我们可以在其上使用 JQuery 函数和 Chai 断言。
cy.get('[data-cy=pagination-next]')
.then($el => { // naming the yielded object from `cy.get()` to $el
if ($el.is(':enabled')) { // using JQuery function `.is` to check if the element is enabled
cy.wrap($el).click() // Cypress requires the JQuery element to be wrapped before it can click it.
}
})
你可以这样做。您可以使用 each
遍历所有分页元素。因此,如果您没有只有 2 个按钮,循环将只检查 2 个按钮,然后终止。
cy.get('[data-cy=pagination-page-list]').should('contain.text', 'Page 1 of')
cy.get('[data-cy=pagination-next]').each(($ele, index) => {
if ($ele.is(':enabled')) {
cy.wrap($ele).click()
cy.wrap($ele).should('contain.text', `Page ${index + 2} of`) //index starts from 0
}
})
您可以使用页面指示器拆分测试逻辑
it('Data Source has Pagination and test functionality', () => {
cy.get('[data-cy=pagination]').should('exist')
cy.get('[data-cy=pagination-page-list]')
.then($pageList => {
if ($pageList.text() === 'Page 1 of 1')
// single page assertions
cy.get('[data-cy=pagination-next]').should('be.disabled')
cy.get('[data-cy=pagination-end]').should('be.disabled')
cy.get('[data-cy=pagination-start]').should('be.disabled')
cy.get('[data-cy=pagination-back]').should('be.disabled')
} else {
// multi page assertions
cy.get('[data-cy=pagination-next]').click()
cy.get('[data-cy=pagination-page-list]')
.should('contain', 'Page 2 of') // assert on second page
cy.get('[data-cy=pagination-end]').click()
cy.get('[data-cy=pagination-next]').should('be.disabled')
cy.get('[data-cy=pagination-start]').click()
cy.get('[data-cy=pagination-page-list]').contains('Page 1 of')
cy.get('[data-cy=pagination-start]').should('be.disabled')
cy.get('[data-cy=pagination-back]').should('be.disabled')
}
})
更好的是,控制测试数据,以便只存在一个页面,然后 运行 在已知条件下进行两次测试,并消除不稳定的条件测试。