利用PuppeteerSharp自动登录并截图

public async Task CreateFileByHtmlAsync(ApiDBContent dbContext, WebPageParam setting, int tryCount = 0)
{
string pdfPath = Path.Combine(setting.FilePath, "Pdf", $"{setting.Name}_{DateTime.Now.ToString("yyyyMMddHHmmss")}.pdf");
string imgPath = Path.Combine(setting.FilePath, "Img", $"{setting.Name}_{DateTime.Now.ToString("yyyyMMddHHmmss")}.png");
string url = $"{setting.PageUrl}{setting.ID}";
try
{
/*
淘宝镜像地址https://npm.taobao.org/mirrors/chromium-browser-snapshots
默认下载地址是在启动目录下面:..\.local-chromium\Win64-856583\chrome-win
*/
await new BrowserFetcher().DownloadAsync(856583);
using var browser = await Puppeteer.LaunchAsync(new LaunchOptions
{
Headless = true,
Args = new string[] { "--single-process", "--no-zygote", "--no-sandbox" }
});
if (tryCount == 0)
{
using var pageLogin = await browser.NewPageAsync();
await pageLogin.SetViewportAsync(new ViewPortOptions
{
Width = 1376,
Height = 768
});
await pageLogin.GoToAsync(setting.LoginUrl, WaitUntilNavigation.Networkidle0);
await pageLogin.TypeAsync($"#{setting.LoginNameID}", setting.UserName);
await pageLogin.TypeAsync($"#{setting.LoginPwdID}", setting.UserPwd);
await pageLogin.ClickAsync($"#{setting.LoginBtnID}");

await pageLogin.CloseAsync();
await pageLogin.CloseAsync();
Thread.Sleep(1000);
}


using var page = await browser.NewPageAsync();
await page.SetViewportAsync(new ViewPortOptions
{
Width = 1376,
Height = 768
});
await page.GoToAsync(url, WaitUntilNavigation.Networkidle0);
string content = await page.GetContentAsync();

Regex reg = new Regex("<title>(.*?)</title>", RegexOptions.IgnoreCase | RegexOptions.Singleline);
string title = reg.Match(content).Groups[1].ToString();
if (title == setting.LoginTitle && tryCount == 0)
{

//重试一次
await CreateFileByHtmlAsync(dbContext, setting, 1);
tryCount++;
}
else
{
await page.PdfAsync(pdfPath);
await page.ScreenshotAsync(imgPath, new ScreenshotOptions
{
FullPage = true,
Type = ScreenshotType.Png
});
}

await page.CloseAsync();
await page.CloseAsync();
}
catch (Exception ex)
{
throw ex;
}
}

posted @   fengdong  阅读(301)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示