【问题标题】:Cypress: compare two columns together: column value and date value赛普拉斯:比较两列:列值和日期值
【发布时间】:2020-11-18 09:59:42
【问题描述】:

我必须先用新的处理值检查状态列的值,然后才能比较日期。

如果我必须比较新数据和处理数据,新日期将大于处理日期。因为数据首先按值排序,然后按日期升序排序。因此,如果我找到两个具有通常状态的值,我可以进行以下比较:

    cy.get('#hometable > tbody > tr > td:nth-child(6)').each(($e, index, $list) => {
        if (index == 0){time_prev=0}
        time = Math.round(new Date($e.text()).getTime() / 1000)
        assert.isBelow(time_prev, time, 'previous date is below actual')
        time_prev = time
    })


 //so I take the value status
 cy.get('#hometable > tbody > tr > td:nth-child(5)').each(($e, index, $list) => {
        const text = $e.text()
        if (text.includes('new')) {
            expect(text).to.eq('\n                                                              new\n                                                           ')

        }
        if (text.includes('processing')) {
            expect(text).to.eq('\n                                                              processing\n                                                           ')
        }

    })

我应该能够在一个循环中同时进行这两个比较,但我不知道从哪里开始

我给出以下错误:

【问题讨论】:

    标签: testing automated-tests cypress


    【解决方案1】:

    你给出的第一个答案在逻辑上是好的。我做了一些改变。我注意到它没有进入 then 循环

    let arrayOfColumnOne = [];
    let arrayOfColumnTwo = [];
    
    cy.get('#hometable > tbody > tr > td:nth-child(6)').each(($e, index, $list) => {
        if (index == 0) {
            time_prev = 0
        }
        time = Math.round(new Date($e.text()).getTime() / 1000)
        arrayOfColumnTwo.push(time)
    
    })
    
    //so I take the value status
    cy.get('#hometable > tbody > tr > td:nth-child(5)').each(($e, index, $list) => {
        const text = $e.text()
        arrayOfColumnOne.push(text)
    }).then(() => {
        for (let i = 1; i < arrayOfColumnOne; i++) {
            if (!arrayOfColumnTwo[i]) {
                throw new Error('Something is wrong with the array selectors')
            }
            if (arrayOfColumnOne[i].includes('new') || arrayOfColumnOne[i].includes('processing')) {
                expect(arrayOfColumnOne[i]).to.eq('\n                                                              new\n                                                           ')
                assert.isBelow(arrayOfColumnTwo[i - 1], arrayOfColumntwo[i], 'previous date is below actual')
            } else if (arrayOfColumnOne[i].includes('processing') && arrayOfColumnOne[i - 1].includes('new')) {
                expect(text).to.eq('\n                                                              processing\n                                                           ')
                assert.isAbove(arrayOfColumnTwo[i - 1], arrayOfColumntwo[i], 'previous date is below actual')
    
            } else {
                //some other code
            }
        }
    })
    

    不明白为什么不进入then

    【讨论】:

    • 这是我的失误。对于那部分,它不需要在 then 语句中,因为我们已经将值存储在引用类型对象中
    • 我会将它与 cy.log() 链接起来,这样我就可以在收集完所有数据后知道它何时开始
    • 如果我在没有 the 的情况下离开 for 那么它不会做出任何断言。如果我在循环中留下一个 cy.log 以打印元素,它不会打印任何东西@RosenMihaylov
    • cy.log('startLoop).then(()=>{loop})
    【解决方案2】:
    cy.log('startLoop').then(()=>{
                for (let i = 1; i < arrayOfColumnOne; i++) {
                    if (!arrayOfColumnTwo[i]) {
                        throw new Error('Something is wrong with the array selectors')
                    }
                    if (arrayOfColumnOne[i].includes('new') && arrayOfColumnOne[i-1].includes('new')) {
                        expect(arrayOfColumnOne[i]).to.eq('\n                                                              new\n                                                           ')
                        assert.isBelow(arrayOfColumnTwo[i - 1], arrayOfColumntwo[i], 'previous date is below actual')
                    } else if (arrayOfColumnOne[i].includes('processing') && arrayOfColumnOne[i - 1].includes('processing')) {
                        expect(text).to.eq('\n                                                              processing\n                                                           ')
                        assert.isBelow(arrayOfColumnTwo[i - 1], arrayOfColumntwo[i], 'previous date is below actual')
                    } else {
                        expect(text).to.eq('\n                                                              processing\n                                                           ')
                        assert.isAbove(arrayOfColumnTwo[i - 1], arrayOfColumntwo[i], 'previous date is below actual')
                    }
                }
            })
    

    不打印任何东西

    【讨论】:

    • 好的,让我看看我的文档并寻找另一个答案。矩比较有效吗?
    【解决方案3】:

    原答案:

    let arrayOfColumnOne = [];
    let arrayOfColumnTwo = [];
    
    cy.get('#hometable > tbody > tr > td:nth-child(6)').each(($e, index, $list) => {
        if (index == 0) {
            time_prev = 0
        }
        time = Math.round(new Date($e.text()).getTime() / 1000)
        assert.isBelow(time_prev, time, 'previous date is below actual')
        time_prev = time
        arrayOfColumnTwo.push(time)
    })
    
    //so I take the value status
    cy.get('#hometable > tbody > tr > td:nth-child(5)').each(($e, index, $list) => {
        const text = $e.text()
    
        arrayOfColumnOne.push(text)
    })
        .then(() => {
            for (let i = 1; i < arrayOfColumnOne; i++) {
                if (!arrayOfColumnTwo[i]) {
                    throw new Error('Something is wrong with the array selectors')
                }
                if (arrayOfColumnOne[i].includes('new')) {
                    expect(arrayOfColumnOne[i).to.eq('\n                                                              new\n                                                           ')
                    assert.isBelow(arrayOfColumnTwo[i - 1], arrayOfColumntwo[i], 'previous date is below actual')
                } else if (text.includes('processing')) {
                    expect(text).to.eq('\n                                                              processing\n                                                           ')
                    //the assertion you need here
                } else {
                    //some other code
                }
            }
        })
    

    编辑建议使用momentcypress moment,因为js round 可能不稳定

    let arrayOfColumnTwo = [];
    
    cy.get('#hometable > tbody > tr > td:nth-child(6)').each(($e, index, $list) => {
        cy.get($e)
            .parent()
            .find('td:nth-child(5)')
            .then($statusElement =>{
                if($statusElement.text().includes('new')) {
                    expect($e.text()).to.eq('\n                                                              new\n                                                            ')
                    assert.isBelow(arrayOfColumnTwo[i - 1], arrayOfColumnTwo[i], 'previous date is below actual')
                } else if($statusElement.text().includes('processing')){
                    expect($e.text()).to.eq('\n                                                              processing\n                                                           ')
                    assert.isAbove(arrayOfColumnTwo[i - 1], arrayOfColumntwo[i], 'previous date is below actual')
                }
            })
    
        time = Math.round(new Date($e.text()).getTime() / 1000)
        arrayOfColumnTwo.push(time)
    
    })
    
    

    编辑 2:

    let arrayOfColumnTwo = [];
    
    cy.get('#hometable > tbody > tr > td:nth-child(6)').each(($e, index, $list) => {
        time = Math.round(new Date($e.text()).getTime() / 1000)
        arrayOfColumnTwo.push(time)
        cy.get($e)
            .parent()
            .find('td:nth-child(5)')
            .then($statusElement =>{
                if($statusElement.text().includes('new')) {
                    expect($e.text()).to.eq('\n                                                              new\n                                                            ')
                    assert.isBelow(arrayOfColumnTwo[i - 1], arrayOfColumnTwo[i], 'previous date is below actual')
                } else if($statusElement.text().includes('processing')){
                    expect($e.text()).to.eq('\n                                                              processing\n                                                           ')
                    assert.isAbove(arrayOfColumnTwo[i - 1], arrayOfColumntwo[i], 'previous date is below actual')
                }
            })
    
    
    
    })
    

    【讨论】:

    • 数据按状态[新,处理]分组,然后按日期升序排序。因此,日期的比较必须与状态字段一起完成。正如你写的那样,在比较给定的第三个单元格时,测试像以前一样失败
    • 处理时间需要什么断言?
    • 也许您可以改用矩数据比较。我编辑了建议的答案,如果可行,将添加状态分组。
    • 我把另一个答案罗森
    • 我把另一个答案@Ro
    【解决方案4】:
    let arrayOfColumnTwo = [];
    
    cy.get('#hometable > tbody > tr > td:nth-child(6)').each(($e, index, $list) => {
        cy.get($e)
            .parent()
            .find('td:nth-child(5)')
            .then($statusElement =>{
                if(index==0) {
                }
                else if($statusElement.text().includes('new')) {
                    assert.isBelow(arrayOfColumnTwo[index - 1], arrayOfColumnTwo[index], 'previous date is below actual')
                } else{
                    assert.isAbove(arrayOfColumnTwo[index - 1], arrayOfColumntwo[index], 'previous date is above actual')
                }
            })
    
        time = Math.round(new Date($e.text()).getTime() / 1000)
        arrayOfColumnTwo.push(time)
    
    })
    

    我已经简化了函数,使它只比较日期。说到比较这个错误的处理日期

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-17
      相关资源
      最近更新 更多