如何等待直到自动完成条目仅显示一行

时间:2019-09-23 12:56:53

标签: cypress

我正在针对无法以任何方式更改的PHP网站运行赛普拉斯。

它具有一个自动完成输入字段,该字段将XHR调用流发送到服务器。

结果填充一个表格,其中每行都有一个可以单击的按钮。

我需要等到只有一行,然后单击其按钮。

cy.get('#dataTables_clients_filter > label > .form-control').type(client).then(() => {
  cy.get('table#dataTables_clients > tbody > tr > td:nth-child(6) > i').click();
}

上述结果是错误cy.click() can only be called on a single element. Your subject contained 100 elements.

XHR呼叫的数量取决于客户端的价值。

困难由此产生:theInput.type(client)一次插入一个字母,页面为每个页面发送一个新的XHR。这意味着一开始,将有一长行的行,其中总是包含“ client”。随着越来越多的字母被处理,列表变得越来越短,最终仅以一行结尾。

我如何才能等到以下任一条件成立?

  • tbody > tr:nth-child(0) > td:nth-child(4)等于client
  • 不再发送XHR呼叫
  • 表的行数组的长度等于1

2 个答案:

答案 0 :(得分:0)

最简单的方法是仅确保所有3个均有效。您可以这样做:

// wait until the XHR call is done:
cy.server()
cy.route('/api-call/which/should/be/finished').as('xhr')
cy.wait('@xhr') // will wait until xhr has appeared.
// Be sure that "tbody > tr:nth-child(0) > td:nth-child(4) equals 'client'"
cy.get('tbody')
  .contains('td', 'client') // will search for a td with 'client' in it.
// The length of the tables array of rows is equal to 1
cy.get('tbody')
  .find('tr') // this will be valid if there is at least 1 row.

答案 1 :(得分:0)

cy.waitUntil(() => {
  return cy.get('@Clientes').eq(0).children().eq(4).then(($cl) => {
    const res = Boolean($cl[0].innerText === client);
    return res;
  });
}, {
  errorMsg: 'Autocomplete failed to find client',
  timeout: 15000,
  interval: 500
});

这个! Add the Cypress waiting power to virtually everything