Похоже, что это действительно очень популярный запрос, и мне, возможно, следовало бы провести более тщательный поиск, прежде чем публиковать свой вопрос.
Тем не менее, я остановился на решении, предложенном Аслушниковым здесь .
Следующий код - это то, что я создал для проверки идеи, я уверен, что есть значительные возможности для улучшения.
Я сделал простую функцию для выполнения XHR:
const requestPage = async (url) => {
return new Promise(function (resolve, reject) {
let xhr = new XMLHttpRequest();
xhr.open('GET', url);
xhr.setRequestHeader('Ignore-Intercept', 'Value');
xhr.onload = function () {
if (this.status >= 200 && this.status < 300) {
const response = {};
xhr.getAllResponseHeaders()
.trim()
.split(/[\r\n]+/)
.map(value => value.split(/: /))
.forEach(keyValue => {
response[keyValue[0].trim()] = keyValue[1].trim();
});
resolve({ ...response, body: xhr.response });
} else {
reject({
status: this.status,
statusText: xhr.statusText
});
}
};
xhr.onerror = function () {
reject({
status: this.status,
statusText: xhr.statusText
});
};
xhr.send();
});
};
Затем я открыл эту функцию на странице.
Затем я использовал эту функцию для выполнения XHR вместо разрешения запроса и использовал результат этого в качестве ответа на запрос.
await page.setRequestInterception(true);
page.on('request', async (request) => {
if (
request.url() === url
&& (
typeof request.headers()['access-control-request-headers'] === 'undefined'
|| !request.headers()['access-control-request-headers'].match(/ignore-intercept/gi)
) && typeof request.headers()['ignore-intercept'] === 'undefined'
) {
const response = await page.evaluate(`requestPage('${url}')`);
response.body += "hello";
request.respond(response);
} else {
request.continue();
}
});
await page.goto(`data:text/html,<iframe style='width:100%; height:100%' src=${url}></iframe>`);
К сожалению, использование page.evaluate
казалось невозможным, если нужная страница не была в фрейме.(отсюда await page.goto(`data:text/html....