代码之家  ›  专栏  ›  技术社区  ›  demouser123

使用Cypress处理菜单上的悬停

  •  9
  • demouser123  · 技术社区  · 8 年前

    我最近偶然发现了e2e工具- Cypress.io . 我目前正在为我合作的公司做一个POC,用于react应用程序的e2e测试。它有一个悬停菜单,就像现在大多数web应用程序一样。

    例如:

    URL: Fmovies

    我试图单击鼠标悬停的菜单项,但测试失败,原因是 display 设置为 none .

    在硒中,我们使用 moveElement 方法转到该元素,然后执行我们需要执行的任何操作。然而,我使用Cypress无法做到这一点。

    考虑到当前的菜单,我写了这个

    it('goes to specific element in Genre',()=>{
            cy.get('#menu').within(()=>{
                cy.get('ul').within(()=>{
                    cy.contains('Family').click();
                });
            });
        }); 
    

    错误: Error

    1 回复  |  直到 8 年前
        1
  •  9
  •   kuceb    7 年前

    Cypress有一个独特的工作流,该工作流基于在尽可能多的测试中烘焙到其默认行为。在模拟单击包含“族”的图元之前,它将 checks for actionability . 这是一个内置测试,如果元素被隐藏,它将失败, display:none (这里就是这种情况)、大小0,0等。只有通过该测试后,它才会模拟对包含“族”的元素的操作。

    您可以使用覆盖可操作性检查 .click({force:true}) ,但这样就无法保证用户能够找到并单击元素。

    执行此测试的正确方法是触发下拉菜单,使元素可见,然后单击。如果要查找“流派”菜单项,显示下拉菜单,然后单击“族”项,请执行以下操作:

    describe('Hover Menu',()=>{
        it('can click on a genre sub-menu item',()=>{
            cy.get('#menu').contains('Genre').next('.sub-menu').then($el=>{
                cy.wrap($el).invoke('show')
                cy.wrap($el).contains('Family').click()
            })
        })
    })
    

    在这里 show 是一种jQuery方法,它修改CSS属性以使元素可见。

    cy.wrap($el) 将jQuery元素转换为Cypress链表,然后可以在其上调用Cypress命令。