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

Я пытаюсь безопасно обрабатывать поведение страницы, которая использует событие в браузере для элемента select для запуска перезагрузки страницы (POST). URL-адрес тот же, но страница перезагружается с тем же HTML-кодом, и единственная разница заключается в порядке сортировки содержимого в таблице. Я пробовал несколько методов, но почему-то ни один из них не является надежным, как я могу добиться чего-то подобного:

    try {
        await page.select('select[name=sort]', 'size'); 
        await page.waitForNextPageReload();
        await page.waitForSelector('select[name=sort]');
    } catch (error) {
        console.log('Error sorting page.');
    }

По сути, waitForNextPageReload не существует, но я ищу что-то, что дало бы аналогичные результаты. Я пытался добавить «задержки», но я ищу что-то более надежное для правильного управления ошибками.


person Nicolas Bouvrette    schedule 10.03.2019    source источник
comment
Можете ли вы предоставить URL-адрес для тестирования кода?   -  person vsemozhebuty    schedule 10.03.2019
comment
К сожалению, в открытом доступе его нет. Я вижу, смогу ли я написать демонстрацию его поведения сегодня.   -  person Nicolas Bouvrette    schedule 10.03.2019


Ответы (2)


Может возникнуть состояние гонки между обещаниями выбора и навигации (см. примеры здесь или здесь) . Можете ли вы попробовать этот подход?

await Promise.all([
  page.select('select[name=sort]', 'size'),
  page.waitForNavigation(),
]);

await page.waitForSelector('select[name=sort]');
person vsemozhebuty    schedule 10.03.2019
comment
Похоже, это подействовало! Думаю, теперь я буду лучше знать, как справляться с этими условиями гонки! - person Nicolas Bouvrette; 10.03.2019

Попробуйте page.waitForNavigation.

Цитата из документов кукловода:

Это решается, когда страница переходит на новый URL-адрес или перезагружается. Это полезно, когда вы запускаете код, который косвенно вызывает навигацию по странице.

Кажется, это хорошо для вашего случая использования, когда вы косвенно перезагружаете страницу.

person jro    schedule 10.03.2019
comment
спасибо, но я пробовал это, и по некоторым причинам я получаю тайм-аут. Я подозреваю, что, поскольку навигация запускается событием браузера, Puppeteer плохо себя ведет с ним? - person Nicolas Bouvrette; 10.03.2019
comment
Можно ли попробовать безголовый режим и убедиться, что страница перезагружается? - person jro; 10.03.2019
comment
Да, я уже пробовал это, и он перезагружается. Возможно, здесь снова проблема в том, что URL-адрес остается прежним, как и большая часть содержимого HTML (поэтому я также не могу искать новый элемент). - person Nicolas Bouvrette; 10.03.2019
comment
Да, и это также перезагружает отправку метода POST - не уверен, влияет ли это на поведение waitForNavigation. - person Nicolas Bouvrette; 10.03.2019