Я пытаюсь получить заголовки ответов и файлы 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 = ..), ошибка в заголовке.
Что я делаю не так?
@ggorlen, - я добавил ссылку выше. Когда я вставляю URL-адрес в браузер с открытыми инструментами разработки, я вижу запрос на вкладке сети (см. снимок экрана выше). Я тот, кто запускает этот запрос, вставляя его в хром.
Спасибо, да, вы переходите по URL-адресу до того, как начинаете ждать запроса. Запустите запрос, выполните навигацию, затем дождитесь обещания запроса. А еще лучше просто назначьте ответ на await page.goto()
, как в const finalResponse = await page.goto(url)
Возможно, вы слишком много думаете об этом. 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 - используя ваш код, см. редактирование выше.
Я удаляю ваше редактирование - первоначальный вопрос был не о файлах cookie, а о получении ответа. Пожалуйста, задайте новый вопрос, если у вас есть новый вопрос. Спасибо. Тем не менее, когда я захожу на страницу, мне не назначаются файлы cookie, поэтому, насколько я могу судить, это кажется точным. Какие файлы cookie вы ожидали?
Ввод результатов поиска в файле cookie. Если это то, что вы хотите, я добавил код для получения этого файла cookie.
Я не вижу минимального воспроизводимого примера здесь. Является ли URL-адрес правильным и действительно ли он отображается на вкладке сети? Что установлено
url
? Обычно, если вы ожидаете запроса, вызванного загрузкой страницы, вы хотите установить промис перед вамиgoto
, особенно если вы ожидаете события'load'
по умолчанию здесь. К тому времени, как вы начнете ждать ответа, он уже придет.