Как ждать, пока из автозаполнения появится только одна строка - PullRequest
0 голосов
/ 23 сентября 2019

Я использую 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 для каждого.Это означает, что изначально будет длинный список строк, одна из которых всегда будет содержать «клиент».По мере того, как обрабатывается все больше и больше писем, список становится короче и заканчивается в конечном итоге всего одной строкой.

Как я могу ждать, пока любое из следующих утверждений окажется верным?

  • tbody > tr:nth-child(0) > td:nth-child(4) равно client
  • больше не отправляются вызовы XHR
  • длина массива таблиц строк равна 1

Ответы [ 2 ]

0 голосов
/ 25 сентября 2019
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
});

Это! Добавьте мощность ожидания Cypress практически ко всему .

0 голосов
/ 23 сентября 2019

Самый простой способ - убедиться, что все 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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...