通过对另一个按钮的单击操作等待表格行更改 [复制]

Wait for table row change with click action on another button [duplicate]

提问人:RenDhark 提问时间:8/25/2023 最后编辑:Mark RotteveelRenDhark 更新时间:8/31/2023 访问量:78

问:

这个问题在这里已经有答案了:
3个月前关闭。

这篇文章在 3 个月前被编辑并提交审核,但未能重新打开帖子:

原始关闭原因未解决

我必须等待显示需要 0 到 n 秒的表格行。要显示该行,您必须单击搜索按钮。我试着去做。while 循环,但这是不可能的。

使用的代码:

let blnFound = false
do {
cy.get(pageCommonID.btnSearch(),{timeout: Cypress.env('GLOBAL_TIMEOUT_ms'),log: True}).scrollIntoView().click({force: true,multiple: true});                
cy.get(pageWorkloadCaseID.tblResult()).find('tr').then((rows) => {
    if (rows.length != 0) {
        blnFound = true
        return true
    } else {
        actualTime = new Date().getTime()
        cy.wait('BIT_GLOBAL_TIMEOUT_MEDIUM')
        let elapsedTime = actualTime - startTime
        console.log('info', strID, 'startTime: ' + startTime)
        console.log('info', strID, 'actualTime: ' + actualTime)
        console.log('info', strID, 'Case not found in Table. Waiting...\n
                               Elapsed Time: ' + (Math.ceil(elapsedTime / 1000)) / 60 + ' Min')
        if ((Math.ceil(elapsedTime / 1000)) / 60 >= 45) {
            console.log('info', strID, 'Case not found in Table. Waiting Time was bigger than 45Min')
            throw new Error('Case not found in Table. Waiting Time was 45Min\'')
        }
    }
})
console.log('blnFound out of Then: ' + blnFound)
    if (intCount >= 360) {
        // interrupt do While
        break;
    }
    intCount++
} while (!blnFound)`

脚本不会中断,因为 blnFound 始终为 false。 当时间未预定义且反应仅在按钮单击事件上时,如何等待表格行显示?

代码片段是测试前提条件的一部分。它不是对搜索功能的测试。因此,由于缺少超时功能,不可能在 a 之前或之前执行此前提条件。因此,单击和下一次等待只会执行一次,直到所有超时结束。

我尝试使用包装、别名、将所有功能转移到其他功能、构建子方法来封装相关命令。

柏树 做而

评论

0赞 Stratos Ion 8/26/2023
你为什么不直接做并依靠赛普拉斯超时来找到它呢?cy.get(pageWorkloadCaseID.tblResult()).find('tr')
0赞 RenDhark 8/27/2023
因为 tablerow 只会在附加按钮上的单击事件时更改。仅仅单击并等待是没有解决方案的,因为应用程序永远不会更新该表。我必须单击按钮才能更新表格。而且我必须在没有预定义时间的情况下做到这一点。它可以在 1 秒或 45 分钟内在后台更新。这取决于其他外部系统上的基础结构和反应槽。
3赞 Mads Brugger 8/28/2023
不可以,不要将异步命令与同步代码混淆,例如 .显然,在使用该标志之前,您需要等待命令设置找到的标志。两个链接的答案都会这样做,如果你研究这些模式,你会发现它们有效。cy.find()do...while

答:

3赞 Minnie Gale 8/26/2023 #1

看起来你想发明自己的测试框架,但实际上你可以省去很多混乱。

举个例子,我使用了 id 作为搜索按钮和结果表,但您可以根据需要替换其他选择器。

该测试是根据您输入的搜索文本编写的,该文本将产生一些结果。如果你错过了这一步,那并不是真正的测试。

通过定义预期结果,无需重复单击 - 您可以让 Cypress 在预期超时内等待结果。

it('tests the search feature', {timeout:Cypress.env('GLOBAL_TIMEOUT_ms')}, ()=> {
  cy.get('input#search-input').type('search for me')
  cy.get('button#search-button').click()         
  cy.get('table#results tr')
    .its('length')
    .should('be.gt', 0)
})

评论

0赞 RenDhark 8/27/2023
我还没有写出带有前提条件的完整测试,等等。因为它与这个问题无关。单击一次后的简单等待超时将永远不会得到结果。如果不单击搜索按钮,该表将永远不会自动填充。这是因为后端的基础设施。有几个外部系统具有不同的反应时间和不同的反应时间段。结果可能在 1 秒内可用,或者大约需要 45 分钟。但是,只有单击搜索按钮才能显示可用的结果。