Puppeteer: Uncaught TimeoutError TimeoutError: превышено время ожидания при ожидании события

Я пытаюсь получить заголовки ответов и файлы cookie для

url= 'https://www.asr.pima.gov/Parcel/GetParcel'

У меня есть следующий код, использующий node и puppeteer:

const browser = await puppeteer.launch({
    headless: false,
    executablePath: executablePath(),

});
let req;
const page = await browser.newPage();
await page.goto(url);
const finalResponse = await page.waitForResponse(response =>
    response.url() === 'https://www.asr.pima.gov/Parcel/GetParcel' && response.status() === 200
);

.......

Когда я прохожу код, в последней строке возникает задержка (начиная с: const finalResponse = ..), ошибка в заголовке.

Что я делаю не так?

Я не вижу минимального воспроизводимого примера здесь. Является ли URL-адрес правильным и действительно ли он отображается на вкладке сети? Что установлено url? Обычно, если вы ожидаете запроса, вызванного загрузкой страницы, вы хотите установить промис перед вами goto, особенно если вы ожидаете события 'load' по умолчанию здесь. К тому времени, как вы начнете ждать ответа, он уже придет.

ggorlen 13.01.2023 21:20

@ggorlen, - я добавил ссылку выше. Когда я вставляю URL-адрес в браузер с открытыми инструментами разработки, я вижу запрос на вкладке сети (см. снимок экрана выше). Я тот, кто запускает этот запрос, вставляя его в хром.

user1592380 13.01.2023 22:16

Спасибо, да, вы переходите по URL-адресу до того, как начинаете ждать запроса. Запустите запрос, выполните навигацию, затем дождитесь обещания запроса. А еще лучше просто назначьте ответ на await page.goto(), как в const finalResponse = await page.goto(url)

ggorlen 13.01.2023 23:49
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
3
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Возможно, вы слишком много думаете об этом. page.goto возвращает ответ, который вы, кажется, ищете:

const puppeteer = require("puppeteer"); // ^19.1.0

let browser;
(async () => {
  browser = await puppeteer.launch();
  const [page] = await browser.pages();
  const url = "https://www.asr.pima.gov/Parcel/GetParcel";
  const finalResponse = await page.goto(url);
  console.info(finalResponse.headers());
  console.info(await page.cookies());
})()
  .catch(err => console.error(err))
  .finally(() => browser?.close());

Теперь предположим, что вы ищете какой-то другой ответ, инициированный начальной загрузкой страницы. Один из способов сделать это — поместить промис без await перед goto, а затем начать навигацию.

let browser;
(async () => {
  browser = await puppeteer.launch();
  const [page] = await browser.pages();
  const url = "https://www.asr.pima.gov/Parcel/GetParcel";
  const finalResponseP = page.waitForResponse(res => res.url() === url);
  await page.goto(url, {waitUntil: "domcontentloaded"});
  const finalResponse = await finalResponseP;
  console.info(finalResponse.headers());
  console.info(await page.cookies());
})()
  .catch(err => console.error(err))
  .finally(() => browser?.close());

Это работает для базы url, как показано выше, но не обязательно, так что это более общее решение, чем первый блок кода. Если у вас есть несколько ответов, вы можете попробовать Promise.all или добавить слушателя с помощью page.on("response", res => {}).


Судя по дальнейшим действиям, похоже, вы ожидали, что файлы cookie будут установлены по этому запросу, но я не вижу их при посещении страницы в моем браузере.

Если вы ищете файл cookie, который возвращается после ввода поиска, вы можете получить к нему доступ следующим образом:

let browser;
(async () => {
  browser = await puppeteer.launch();
  const [page] = await browser.pages();
  const ua =
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36";
  await page.setUserAgent(ua);
  const url = "https://www.asr.pima.gov/Parcel/GetParcel";
  const finalResponse = await page.goto(url, {waitUntil: "domcontentloaded"});
  console.info(finalResponse.headers());
  await page.type("#parcel", "123-45-678A");
  await Promise.all([
    page.waitForResponse(res => res.url().includes("GetSearchResults")),
    page.click('[type = "submit"]'),
  ]);
  console.info(await page.cookies());
})()
  .catch(err => console.error(err))
  .finally(() => browser?.close());

Спасибо, теперь я получаю заголовки, но не файлы cookie - используя ваш код, см. редактирование выше.

user1592380 14.01.2023 05:20

Я удаляю ваше редактирование - первоначальный вопрос был не о файлах cookie, а о получении ответа. Пожалуйста, задайте новый вопрос, если у вас есть новый вопрос. Спасибо. Тем не менее, когда я захожу на страницу, мне не назначаются файлы cookie, поэтому, насколько я могу судить, это кажется точным. Какие файлы cookie вы ожидали?

ggorlen 14.01.2023 05:25

Ввод результатов поиска в файле cookie. Если это то, что вы хотите, я добавил код для получения этого файла cookie.

ggorlen 14.01.2023 05:42

Другие вопросы по теме