кукловод лучшие практики waitForSelector или setTimeout - PullRequest
0 голосов
/ 03 июня 2019

Я пытаюсь найти лучший способ «дождаться полной загрузки сайта». И это кажется сложной вещью. Я много гуглял и увидел, что есть 2 способа: waitForSelector и SetTimout.

Моя проблема в том, что даже если я жду, пока Selector #CheckSelectAll установит этот флажок, кажется, что всегда слишком рано. Поэтому мне пришлось добавить задержку в 2 секунды. И это выглядит очень непрофессионально для меня. Я хочу использовать лучшие практики для этого.

Это должно быть проблемой, которая всегда нужна всем при использовании кукловода с разными страницами и формами.

Возможно ли, что этот waitForSelector не работает, когда селектор находится внутри iFrame?

Спасибо за любые советы и помощь!

  function delay(time) {
    return new Promise(function(resolve) { 
        setTimeout(resolve, time)
    });

  await page.waitForSelector('#CheckSelectAll');
  await delay(2000);
  await page.click('#CheckSelectAll');

1 Ответ

0 голосов
/ 03 июня 2019

Если вы хотите сделать это по-настоящему «кукольником», взгляните на this .
Можно выбрать несколько вариантов, но в своей практике я нашел самый полезный networkidle2,
Как сказано в документации, ваш скрипт будет ждать, пока

не будет более 2 сетевых подключений в течение не менее 500 мс.

await page.waitForNavigation({ waitUntil: 'networkidle2' })


Но, если по какой-то причине решение in-box не может обработать ваш случай, можно сделать пользовательскую функцию ожидания такой же, как вы.
Вот хорошая строка, чтобы написать меньше кода:
await new Promise(resolve => setTimeout(resolve, 2000))


И последний вариант, вы можете получить доступ к DOM с помощью page.evaluate() и проверить, видим ли элемент.

const visibleVerification = await page.evaluate(() => { 
   // your verify logic.
   // return boolean, if element exists on page
   return true;
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...