如何使用Cypress.io检查元素是否存在

时间:2019-05-15 09:27:47

标签: selenium-webdriver cypress

如何检查元素是否存在,以便在元素存在时可以执行某些步骤。如果元素不存在,则可以执行某些其他不同的步骤。

我尝试了以下类似方法,但是没有用:

        Cypress.Commands.add('deleteSometheingFunction', () => {
 cy.get('body').then($body => {
   if ($body.find(selectors.ruleCard).length) {
     let count = 0;
     cy.get(selectors.ruleCard)
       .each(() => count++)
       .then(() => {
         while (count-- > 0) {
           cy.get('body')
             ...
             ....
         }
       });
   }
 });
});

我正在寻找一个简单的解决方案,可以将其与简单的javascript结合使用 如果是其他人阻止或承诺的 then()部分

类似于Webdriver协议的以下实现:

1)driver.findElements(By.yourLocator).size() > 0 2)或检查等待中元素的状态

请告知。谢谢

4 个答案:

答案 0 :(得分:3)

cypress的所有步骤都是async,因此您应该在命令文件或页面目标文件中设置通用功能,..

    export function checkIfEleExists(ele){
    return new Promise((resolve,reject)=>{
        /// here if  ele exists or not
        cy.get('body').find( ele ).its('length').then(res=>{
            if(res > 0){
                //// do task that you want to perform
                cy.get(ele).select('100').wait(2000);
                resolve();
            }else{
                reject();
            }
        });
    })
}


// here check if select[aria-label="rows per page"] exists
cy.checkIfEleExists('select[aria-label="rows per page"]')
.then(e=>{
        //// now do what if that element is in ,,..
        })
.catch(e=>{
    ////// if not exists...
    })

答案 1 :(得分:2)

它曾经被问过:Conditional statement in cypress

因此,您基本上可以尝试以下方法:

cy.get('header').then(($a) => { 
        if ($a.text().includes('Account')) {
            cy.contains('Account')
            .click({force:true})
        } else if ($a.text().includes('Sign')) { 
            cy.contains('Sign In')
            .click({force:true})  
        } else {
            cy.get('.navUser-item--account .navUser-action').click({force:true})
        }
    })

答案 2 :(得分:2)

我要补充一点,如果您决定通过检查for (int i = 0; i < 5; i++) { if (i == 0 || i == 4) //1st and 5th rows printf("%d %d\n", i + 1, i + 13); else if(i == 1 || i == 3)//2nd and 4th rows printf("%d %d %d %d\n", i + 1, i + 5, i + 9, i + 13); else printf("3 7 9 11 15\n");//3rd row } 命令的.length属性来确定是否满足条件,则需要尊重cypress的异步特性。

示例: 尽管存在appDrawerOpener按钮,但以下条件的结果仍为false

cy.find

但是此评估为true,因为 if (cy.find("button[data-cy=appDrawerOpener]").length > 0) //evaluates as false 变量已经在您位于promise的$body部分时被解析:

.then()

Cypress documentation on conditional testing中阅读更多内容

答案 3 :(得分:0)

使用异步/等待给出了一种简洁的语法:

const $el = await cy.find("selector")
if ($el.length > 0) {
  ...

此处有更多信息:https://medium.com/@NicholasBoll/cypress-io-using-async-and-await-4034e9bab207