#javascript #google-chrome #google-chrome-extension #google-chrome-devtools
#javascript #google-chrome #google-chrome-расширение #google-chrome-devtools
Вопрос:
Я хочу сделать полноразмерный снимок экрана на активной вкладке с помощью плагина Chrome.
Я знаю, что есть функция с именем chrome.tabs.captureVisibleTab (), но это не помогает получить полный снимок экрана страницы.
Я знаю, что мы можем получить скриншот полной страницы из Chrome (devtools> ctrl shift p> Сделать снимок экрана в натуральную величину). Я хочу сделать снимок экрана, используя эту функцию или другую функцию.
С помощью кода, который я привел ниже, я могу делать полные скриншоты страницы на компьютере с Linux для своих целей. Но когда я запускаю плагин на компьютере с Windows, я получаю изображение, подобное этому:
это мой код. Возможно, будет полезнее начать чтение снизу:
chrome.tabs.onUpdated.addListener(attachToDebugger);
function clearDeviceMetricsOverride(tabId, base_64_data) {
chrome.debugger.sendCommand(
{
tabId: tabId,
},
"Emulation.clearDeviceMetricsOverride",
function () {
postData(base_64_data, tabId);
}
);
}
function captureScreenshot(tabId) {
console.log(`{page}: captureScreenshot: status=aboutTo, tabId=${tabId}`);
chrome.debugger.sendCommand(
{ tabId: tabId },
"Page.captureScreenshot",
{
format: "jpeg",
quality: 60,
fromSurface: false,
},
(response) => {
if (chrome.runtime.lastError) {
console.log(`{back}: captureScreenshot: status=failed, tabId=${tabId}`);
} else {
var dataType = typeof response.data;
console.log(
`{back}: captureScreenshot: status=success, tabId=${tabId}, dataType=${dataType}`
);
let base_64_data = "data:image/jpg;base64," response.data;
setTimeout(() => {
clearDeviceMetricsOverride(tabId, base_64_data);
}, 500);
}
}
);
console.log(`{page}: captureScreenshot: status=commandSent, tabId=${tabId}`);
}
//---------------------------------------------------------------------------
function setDeviceMetricsOverride(tabId, height, width) {
chrome.debugger.sendCommand(
{
tabId: tabId,
},
"Emulation.setDeviceMetricsOverride",
{ height: height, width: width, deviceScaleFactor: 1, mobile: false },
function () {
setTimeout(() => {
captureScreenshot(tabId);
}, 500);
}
);
}
//---------------------------------------------------------------------------
function getLayoutMetrics(tabId) {
chrome.debugger.sendCommand(
{
tabId: tabId,
},
"Page.getLayoutMetrics",
{},
function (object) {
console.log("---- get layout w: " object.contentSize.width);
console.log("---- get layout h: " object.contentSize.height);
const { height, width } = object.contentSize;
setDeviceMetricsOverride(tabId, height, width);
}
);
}
//---------------------------------------------------------------------------
function setColorlessBackground(tabId) {
console.log(`{back}: setColorlessBackground: status=aboutTo, tabId=${tabId}`);
chrome.debugger.sendCommand(
{ tabId: tabId },
"Emulation.setDefaultBackgroundColorOverride",
{ color: { r: 0, g: 0, b: 0, a: 0 } },
function () {
console.log(
`{back}: setColorlessBackground: status=enabled, tabId=${tabId}`
);
getLayoutMetrics(tabId);
}
);
console.log(
`{back}: setColorlessBackground: status=commandSent, tabId=${tabId}`
);
}
//---------------------------------------------------------------------------
function enableDTPage(tabId) {
console.log(`{back}: enableDTPage: status=aboutTo, tabId=${tabId}`);
chrome.debugger.sendCommand({ tabId: tabId }, "Page.enable", {}, function () {
console.log(`{back}: enableDTPage: status=enabled, tabId=${tabId}`);
setColorlessBackground(tabId);
});
console.log(`{back}: enableDTPage: status=commandSent, tabId=${tabId}`);
}
//---------------------------------------------------------------------------
function attachToDebugger(tabId, changeInfo, tab) {
try {
if (tab.status == "complete") {
chrome.debugger.attach({ tabId: tabId }, "1.0", () => {
if (chrome.runtime.lastError) {
console.log(
`{back}: debugger attach failed: error=${chrome.runtime.lastError.message}`
);
} else {
console.log(`{back}: debugger attach success: tabId=${tabId}`);
enableDTPage(tabId);
}
});
}
} catch {}
}
Комментарии:
1. Поскольку он корректно работает в Linux, единственное объяснение заключается в том, что это ошибка в Chrome.
2. Когда я просматриваю коды в Puppeteer, я вижу, что он делает снимок экрана так же, как и я ( github.com/puppeteer/puppeteer/blob /… ) Создание скриншотов с помощью puppeteer на компьютере с Windows — это нормально. так что я не думаю, что это ошибка.
3. Других объяснений нет, если одна и та же команда в расширении выдает правильный результат в Linux, но не в Windows.
4. Привет! Есть какие-либо успехи в этом?
Ответ №1:
С помощью кода, который я привел ниже, я могу делать полные скриншоты страницы на компьютере с Linux для своих целей.
Не уверен, как Linux различает surface и view (если ваш код работает), но для Windows вы должны это изменить:
"Page.captureScreenshot",
{
format: "jpeg",
quality: 60,
fromSurface: false,
Для этого:
"Page.captureScreenshot",
{
format: "jpeg",
quality: 60,
fromSurface: true,
Ваш код создаст скриншот всей страницы с этим исправлением. Я не уверен, что вы изменили значение fromSurface
свойства из примера, из которого вы взяли этот код, поскольку в документах говорится, что это свойство заставит API сделать снимок экрана в представлении, если установлено значение false
, что имеет смысл для обрезки результата.