我的应用程序中有一个 PuppeteerSharp 函数可以自动执行此网站:https ://dtucalculator.azurewebsites.net/
目标是通过提供 CPU 内核值和带有性能数据的 CSV(在此函数之前生成)来填写表格,然后提交表格,将生成的报告捕获为 PDF。
该函数看起来有点像这样:
//Browserless Browser
var connectOptions = new ConnectOptions() { BrowserWSEndpoint = "wss://chrome.browserless.io?token=APITOKEN" };
var browser = await Puppeteer.ConnectAsync(connectOptions);
//Local Browser
//await new BrowserFetcher().DownloadAsync(BrowserFetcher.DefaultRevision);
//browser = await Puppeteer.LaunchAsync(new LaunchOptions() { Headless = true });
var page = (await browser.PagesAsync())[0];
var viewPortOptions = new ViewPortOptions
{
Height = 1080,
Width = 1920
};
await page.SetViewportAsync(viewPortOptions);
var options = new NavigationOptions
{
Timeout = 0,
WaitUntil = new[] { WaitUntilNavigation.Networkidle2 }
};
await page.GoToAsync("https://dtucalculator.azurewebsites.net/", options);
ElementHandle coresInput = await page.WaitForSelectorAsync("#cores");
await page.TypeAsync("#cores", (CoresPerSocket * SocketCount).ToString());
ElementHandle fileUploadInput = await page.WaitForSelectorAsync("#fileUpload");
await fileUploadInput.UploadFileAsync(filePath);
try
{
await page.ClickAsync(".btn-success");
}
catch (Exception ex)
{
//Log Error here
}
Thread.Sleep(150);
await page.ClickAsync("#details");
Thread.Sleep(1500);
byte[] pdfBytes = await page.PdfDataAsync(new PdfOptions
{
Format = PaperFormat.A4,
MarginOptions = new MarginOptions { Left = "1cm", Right = "1cm", Top = "1cm", Bottom = "1cm" },
});
await page.CloseAsync();
await browser.CloseAsync();
return pdfBytes;
该功能在我使用本地浏览器时运行良好,但在我使用无浏览器连接时出错。当我的应用部署到我的 Azure 应用服务时,需要无浏览器连接。
当 PuppeteerSharp 单击计算按钮时会产生 Target Crashed Exception,可以看到包装在 try-catch 中。我从错误消息中得到的详细信息如下:
页面无法处理 Inspector.targetCrashed。在 PuppeteerSharp.Page.Client_MessageReceived 的 PuppeteerSharp.Page.OnTargetCrashed() 处引发了“PuppeteerSharp.TargetCrashedException”类型的异常(对象发件人,MessageEventArgs e)
和
协议错误(Runtime.callFunctionOn):目标已关闭。(页面无法处理 Inspector.targetCrashed。在 PuppeteerSharp.Page.OnTargetCrashed() 在 PuppeteerSharp.Page.Client_MessageReceived(Object sender, MessageEventArgs e) 处引发了“PuppeteerSharp.TargetCrashedException”类型的异常)
我已经联系了 Browserless,他们不认为问题出在他们身上 - 所以我很难理解是什么导致了这个问题,因为这两个浏览器源之间的行为不同。有没有人遇到过这样的问题或更多地了解根本原因可能是什么?