赛普拉斯:无法在日历弹出窗口中找到元素
Cypress: cannot find elements in calendar popup
我无法在 Cypress 测试中与日期选择器(弹出窗口)交互。
我在每个 div class 上都尝试了 .find() 和 .get() 但每次它都说
Timed out retrying after 4000ms: Expected to find element: .cdk-overlay-container, but never found it
这是我的测试代码:
cy.get('#signup-step-pers-details').within(() => {
cy.get('[name="firstName"]').type(user.firstName)
.get('[name="surname"]').type(user.lastName)
.get('#select-gender').click()
.get('.ng-dropdown-panel-items').contains(user.gender, {matchCase: false}).click()
.get('#input-dateOfBirth').click()
.find('.owl-dt-popup').click()
.get('.owl-calendar-year').contains(2002).click()
我尝试增加一些等待时间,但这也无济于事。
这个序列
.get('#input-dateOfBirth').click()
.find('.owl-dt-popup').click()
希望在 dateOfBirth 控件中找到 日期弹出窗口。
您可能只需要
.get('#input-dateOfBirth').click()
.get('.owl-dt-popup').click()
通常您会看到每个项目 cy.get()
,而不是像您所做的那样链接所有的获取。这仍然有效,因为 .get()
总是从 cy.root()
开始搜索,它被 .within()
.
设置为 #signup-step-pers-details
但是.find()
不同,它是从上一个主题开始搜索的,也就是DOB控件。
我应该补充一点,以防您希望日期弹出窗口实际位于 DOB 输入中,当弹出窗口可见时,我会在 <body></body>
的底部添加 cdk-overlay-container
标签(在 devtools 中查看)。
<div class="cdk-overlay-container">...</div>
</body>
您使用 contains
的方法很好,但您可以使用 another syntax 来选择日期:
cy.get('#signup-step-pers-details').within(() => {
cy.get('[name="firstName"]').type(user.firstName)
.get('[name="surname"]').type(user.lastName)
.get('#select-gender').click()
.get('.ng-dropdown-panel-items').contains(user.gender, {matchCase: false}).click()
.get('#input-dateOfBirth').click()
.find('.owl-dt-popup').click()
.contains('.owl-calendar-year', '2002').click()
@KKhan 是正确的,Angular 日期时间选择器在文档底部的 cdk-overlay-container
中打开。
有关布局的更多详细信息:
<body>
...
<div id="signup-step-pers-details>
...
<div id="input-dateOfBirth"></div>
</div>
...
<div class="cdk-overlay-container">
<owl-date-time-container>
...
</owl-date-time-container>
</div>
</body>
使用 cy.get('#signup-step-pers-details').within(() => {
将内部命令限制在 DOM 的那个部分,但 owl-date-time-container
不在那个部分。
你可以使用这种方法
cy.get('#signup-step-pers-details').within(() => {
// cy.root() === #signup-step-pers-details
cy.get('[name="firstName"]').type(user.firstName)
.get('[name="surname"]').type(user.lastName)
.get('#select-gender').click()
.get('.ng-dropdown-panel-items').contains(user.gender, {matchCase: false}).click()
.get('#input-dateOfBirth').click()
// shift cy.root() to date-time-picker
cy.document().its('body').find('owl-date-time-container').within(() => {
cy.get('button.owl-dt-control-period-button').click()
cy.contains('2002').click()
cy.contains('Aug').click()
cy.contains('23').click()
})
// back to cy.root() === #signup-step-pers-details
cy.get('#select-nationality').click()
})
注意 我使用了 .owl-dt-control-period-button
这对于 Angular 日期时间选择器的当前版本是正确的,但也许你有一个旧版本需要 .owl-calendar-year
.
我无法在 Cypress 测试中与日期选择器(弹出窗口)交互。
我在每个 div class 上都尝试了 .find() 和 .get() 但每次它都说
Timed out retrying after 4000ms: Expected to find element: .cdk-overlay-container, but never found it
这是我的测试代码:
cy.get('#signup-step-pers-details').within(() => {
cy.get('[name="firstName"]').type(user.firstName)
.get('[name="surname"]').type(user.lastName)
.get('#select-gender').click()
.get('.ng-dropdown-panel-items').contains(user.gender, {matchCase: false}).click()
.get('#input-dateOfBirth').click()
.find('.owl-dt-popup').click()
.get('.owl-calendar-year').contains(2002).click()
我尝试增加一些等待时间,但这也无济于事。
这个序列
.get('#input-dateOfBirth').click()
.find('.owl-dt-popup').click()
希望在 dateOfBirth 控件中找到 日期弹出窗口。
您可能只需要
.get('#input-dateOfBirth').click()
.get('.owl-dt-popup').click()
通常您会看到每个项目 cy.get()
,而不是像您所做的那样链接所有的获取。这仍然有效,因为 .get()
总是从 cy.root()
开始搜索,它被 .within()
.
#signup-step-pers-details
但是.find()
不同,它是从上一个主题开始搜索的,也就是DOB控件。
我应该补充一点,以防您希望日期弹出窗口实际位于 DOB 输入中,当弹出窗口可见时,我会在 <body></body>
的底部添加 cdk-overlay-container
标签(在 devtools 中查看)。
<div class="cdk-overlay-container">...</div>
</body>
您使用 contains
的方法很好,但您可以使用 another syntax 来选择日期:
cy.get('#signup-step-pers-details').within(() => {
cy.get('[name="firstName"]').type(user.firstName)
.get('[name="surname"]').type(user.lastName)
.get('#select-gender').click()
.get('.ng-dropdown-panel-items').contains(user.gender, {matchCase: false}).click()
.get('#input-dateOfBirth').click()
.find('.owl-dt-popup').click()
.contains('.owl-calendar-year', '2002').click()
@KKhan 是正确的,Angular 日期时间选择器在文档底部的 cdk-overlay-container
中打开。
有关布局的更多详细信息:
<body>
...
<div id="signup-step-pers-details>
...
<div id="input-dateOfBirth"></div>
</div>
...
<div class="cdk-overlay-container">
<owl-date-time-container>
...
</owl-date-time-container>
</div>
</body>
使用 cy.get('#signup-step-pers-details').within(() => {
将内部命令限制在 DOM 的那个部分,但 owl-date-time-container
不在那个部分。
你可以使用这种方法
cy.get('#signup-step-pers-details').within(() => {
// cy.root() === #signup-step-pers-details
cy.get('[name="firstName"]').type(user.firstName)
.get('[name="surname"]').type(user.lastName)
.get('#select-gender').click()
.get('.ng-dropdown-panel-items').contains(user.gender, {matchCase: false}).click()
.get('#input-dateOfBirth').click()
// shift cy.root() to date-time-picker
cy.document().its('body').find('owl-date-time-container').within(() => {
cy.get('button.owl-dt-control-period-button').click()
cy.contains('2002').click()
cy.contains('Aug').click()
cy.contains('23').click()
})
// back to cy.root() === #signup-step-pers-details
cy.get('#select-nationality').click()
})
注意 我使用了 .owl-dt-control-period-button
这对于 Angular 日期时间选择器的当前版本是正确的,但也许你有一个旧版本需要 .owl-calendar-year
.