【发布时间】:2021-08-01 21:52:54
【问题描述】:
我有一个选项/按钮列表,我需要确保它们都设置为特定值。每个包装器都可以有多个按钮,但第一个总是我想要在运行测试之前设置的。
因此我需要循环这些包装器并定位它们每个的第一个子/按钮。
通常情况下,each() 会出现这种情况,但 Cypress 在第一次单击后会出错 - DOM 会重新渲染,并且 Cypress 找不到剩余的按钮。
因此,我需要一个替代解决方案。其中之一是经典的for 循环。代码如下:
<div>
<div class="ab-test-switch__experiment">
<div class="ab-test-switch__buttons"><button type="button" class="button ab-test-switch__button button--primary button--lg" data-variant="49_a">
49_a
</button><button type="button" class="button ab-test-switch__button button--secondary button--lg" data-variant="49_b">
49_b
</button>
</div>
</div>
<div class="ab-test-switch__experiment">
<div class="ab-test-switch__experiment__title">
<div class="v-popover">
<div class="trigger" style="display: inline-block;">
<p data-v-d7151c42="">(detail)</p>
</div>
</div>
</div>
<div class="ab-test-switch__buttons"><button data-v-7fea8896="" data-v-d7151c42="" type="button" class="button ab-test-switch__button button--secondary button--lg" data-variant="old_business_section" data-v-5c4d7450="">
old_business_section
</button><button data-v-7fea8896="" data-v-d7151c42="" type="button" class="button ab-test-switch__button button--primary button--lg" data-variant="new_business_section" data-v-5c4d7450="">
new_business_section
</button>
</div>
</div>
<div class="ab-test-switch__experiment">
<div class="ab-test-switch__experiment__title">
<h2 data-v-d7151c42="" data-v-5c4d7450="">53_mobile_banner</h2>
<div data-v-d7151c42="" class="v-popover" data-v-5c4d7450="">
<div class="trigger" style="display: inline-block;">
<p data-v-d7151c42="">(detail)</p>
</div>
</div>
</div>
<div class="ab-test-switch__buttons"><button type="button" class="button ab-test-switch__button button--secondary button--lg" data-variant="none" data-v-5c4d7450="">
none
</button><button type="button" class="button ab-test-switch__button button--primary button--lg" data-variant="mobile_banner" data-v-5c4d7450="">
mobile_banner
</button>
</div>
</div>
<div class="ab-test-switch__experiment">
<div class="ab-test-switch__experiment__title">
<div class="v-popover">
<div class="trigger" style="display: inline-block;">
<p>(detail)</p>
</div>
</div>
</div>
<div class="ab-test-switch__buttons"><button type="button" class="button ab-test-switch__button button--primary button--lg" data-v-5c4d7450="">
explore_a
</button><button type="button" class="button ab-test-switch__button button--secondary button--lg">
explore_b
</button>
</div>
</div>
</div>
// this fails as the DOM changes after each click
cy.get('.ab-test-switch__buttons > :nth-child(1)').each(($el) => {
cy.wrap($el).click()
cy.wait(1000) // didn't help, there's no race condition here
})
before(() => {
cy.visit('/company_profile_frontend/ab-test-switch')
// cy.get('.ab-test-switch__buttons > :nth-child(1)').click({ multiple: true, force: true }) (this didn't work either)
const numberOfAbTests = document.getElementsByClassName('ab-test-switch__buttons').length
for (let i = 1; i <= numberOfAbTests; i += 1) {
cy.get(`.ab-test-switch__buttons > :nth-child(${i})`).click().pause()
}
// cy.get('.ab-test-switch__buttons > :nth-child(1)').each(($el) => {
// cy.wrap($el).click().pause()
// // eslint-disable-next-line cypress/no-unnecessary-waiting
// cy.wait(1000)
// }) (another failed attempt)
})
还有其他方法可以完成这项工作吗?
【问题讨论】: