Как обеспечить завершение первой итерации al oop перед выполнением второй итерации? - PullRequest
2 голосов
/ 21 марта 2020
cy.document().then(document => {
  const arra = [...document.querySelectorAll('.instances__action')];

  for (let i = 1; i <= arra.length; i++) {
    let state = document.querySelector(
      `#root > section > section > main > div > div > section.instances > div > div > div > div > div > div > table > tbody > tr:nth-child(${i}) > td:nth-child(3) > span`
    ).innerText;

    if (state !== 'Finished') {
      document
        .querySelector(
          `#root > section > section > main > div > div > section.instances > div > div > div > div > div > div > table > tbody > tr:nth-child(${i}) > td:nth-child(7) > div > button.ant-btn.ant-btn-primary.ant-btn-sm`
        )
        .click();
    } else {
      continue;
    }
  }
});

здесь, предположим, что arra.length равно 2. на каждой итерации нажимается кнопка. Я хочу сделать это по одному. Во-первых, он должен проверить, является ли состояние finished или нет. Если состояние not finished, нажмите кнопку и дождитесь завершения состояния. После этого он должен go перейти к следующей итерации. В моей текущей реализации он переходит ко второй итерации до ее завершения.

1 Ответ

1 голос
/ 21 марта 2020

В разделе кода, который устанавливает текст на Finished, пусть он вызывает функцию resolve конструктора Promise, который назначен в l oop. Затем в l oop создайте Обещание и await его. Например:

let resolveFn = () => undefined;

// ...
// Run loop:
(async () => {
  // ...
  for ( // ...
  // ...
    if (state !== 'Finished') {
      const prom = new Promise(resolve => resolveFn = resolve);
      document.querySelector(...).click();
      await prom;
    }
}
})();

// ...

function clickHandler() {
  // ...
  // At the point where you assign "Finished", call the resolveFn:
  span.textContent = 'Finished';
  resolveFn();
}

Если у вас нет контроля над кодом, который присваивает текст Finished, другой возможностью следить за изменением текста будет использование MutationObserver, например:

if (state !== 'Finished') {
  document.querySelector(...);.click();
  await new Promise((resolve) => {
    new MutationObserver((_, observer) => {
      if (span.textContent === 'Finished') {
        observer.disconnect();
        resolve();
      }
    })
      .observe(span, { childList: true });
  });
}
...