我在一个已经打开的、完全可见的浏览器(无头浏览器)中使用Puppeteer自动执行一些页面操作。目前,我手动设置视图端口如下:
const page = await browser.newPage();
await page.setViewport({width: W, height: H});
我必须根据实际的屏幕分辨率和系统范围的缩放因子手动设置W
和H
。这使得脚本变得非常脆弱和不可移植。
我想让新的页面总是打开的最大可能可见的视口,而不必手动指定是什么。我尝试了其他一些建议的解决方案,比如将viewport设置为null
,但我还没有为我的具体用例找到一个可行的解决方案。任何帮助都将不胜感激。谢谢!
发布于 2022-06-13 09:20:48
如果您想在已启动的浏览器中持久地设置W
和H
,则需要将defaultViewport: null
与--window-size=${W},${H}
启动arg一起设置。它在browser
-level上设置窗口大小和视图,而不是在page
-level上设置窗口大小和视图(随着每个新选项卡的变化)。
像这样,所有新打开的选项卡都将共享相同的窗口大小和视图端口。
const browser = await puppeteer.launch({
defaultViewport: null,
args: [`--window-size=${W},${H}`]
})
发布于 2022-10-05 13:52:44
如果您可以从系统规范中检索屏幕分辨率,则可以从其中正确设置视口大小。
尽管您可能无法直接从javascript获得这些信息。
如果您可以从一个脚本(参见编辑)获得这个信息,您可以尝试以下方法从javascript执行该脚本,并在您的程序中检索该信息,以便设置您的视口尺寸。
const {spawn} = require("child_process");
async function getSomeDataFromAPowerShellScript() {
const child = spawn("powershell.exe", ["./PATH/MyPowerShellScript.ps1"]); // spawn a powershell terminal as a child process of main program and run the provided script in it
return await new Promise(resolve => {
child.stdout.on("data", (data) => { // trigger when data is send into the child terminal
console.log(data);
resolve(data);
};
});
}
对getSomeDataFromAPowerShellScript()
的调用将作为string
返回powershell终端中的第一个输出数据。
如果您想要检索更多的信息--,而不仅仅是powershell终端中的第一个输出--您可以使用以下方法:
async function getSomeDataFromAPowerShellScript() {
const child = spawn("powershell.exe", ["./PATH/MyPowerShellScript.ps1"]); // spawn a powershell terminal as a child process of main program and run the provided script in it
let result = [];
return await new Promise(resolve => {
child.stdout.on("data", (data) => { // trigger when data is send into the child terminal
console.log(data);
result.push(data);
};
child.on("exit", () => { // trigger when the child process exit after execution
resolve(result);
});
});
}
编辑:
您可以使用本N回答中的这个powershell脚本How to get the current screen resolution on windows via command line?获得主屏幕的当前分辨率:
PowerShell-script.ps1
Add-Type @"
using System;
using System.Runtime.InteropServices;
public class PInvoke {
[DllImport("user32.dll")] public static extern IntPtr GetDC(IntPtr hwnd);
[DllImport("gdi32.dll")] public static extern int GetDeviceCaps(IntPtr hdc, int nIndex);
}
"@
$hdc = [PInvoke]::GetDC([IntPtr]::Zero)
[PInvoke]::GetDeviceCaps($hdc, 118) # width
[PInvoke]::GetDeviceCaps($hdc, 117) # height
原始解释
它输出两行:首先是水平分辨率,然后是垂直分辨率。
要运行它,请将其保存到一个文件(例如screenres.ps1)中,并使用PowerShell启动它:
powershell -ExecutionPolicy Bypass .\screenres.ps1
将这个答案与theDavidBarton答案结合使用,可以达到您所要求的目的。
https://stackoverflow.com/questions/72589897
复制相似问题