Cefsharp 如何使用for循环加载多个url?
我有一个数据库中的url列表 我正在foreach循环中将所有url传递给浏览器。但浏览器只考虑最后一个url,页面只显示最后一个url,而不显示我传递的上一个url 如何解决 示例代码: public void GetscreenshotBK(字符串html、字符串文件路径) { HtmlWeb web=新的HtmlWeb(); HtmlAgilityPack.HtmlDocument doc=web.Load(文件路径); 字符串路径=@”//td[@class='case'];//span[@class='ClassToGet+']Cefsharp 如何使用for循环加载多个url?,cefsharp,Cefsharp,我有一个数据库中的url列表 我正在foreach循环中将所有url传递给浏览器。但浏览器只考虑最后一个url,页面只显示最后一个url,而不显示我传递的上一个url 如何解决 示例代码: public void GetscreenshotBK(字符串html、字符串文件路径) { HtmlWeb web=新的HtmlWeb(); HtmlAgilityPack.HtmlDocument doc=web.Load(文件路径); 字符串路径=@”//td[@class='case'];//span
//Xpath查询文档中的所有匹配节点
HtmlNodeCollection节点=doc.DocumentNode.SelectNodes(路径);
//获取节点集合中的所有节点
//列表=新列表();
foreach(节点中的HtmlNode n)
{
//字符串路径1=@“//a”//span[@class='“+ClassToGet+”]
//Xpath查询文档中的所有匹配节点
IEnumerable htmlnodevalues=n.subjects(“a”);
foreach(htmlnodevalues中的变量节点)
{
字符串bkurl=node.GetAttributeValue(“href”,”);
Browser.Load(bkurl);
//添加(bkurl);
}}
只能使用任务在另一个线程上执行此任务。因为带有ChromiumWebBrowser控件的主线程需要自由加载和呈现网页
以下是如何使用新方法的示例:
// Take screenshots of 3 web pages, and save the screenshots to C:\testX.png
var takeScreenshots = GetScreenshots(Browser, new[] { "http://www.google.com/", "http://www.yahoo.com", "http://www.apple.com" });
takeScreenshots.ContinueWith((task) => {
int i = 0;
foreach (var bitmap in task.Result)
bitmap.Save(@"C:\test" + (i++).ToString() + ".png");
});
takeScreenshots.Start();
您需要将此方法添加到类中:
public Task<List<Bitmap>> GetScreenshots(ChromiumWebBrowser browser, IEnumerable<string> urls)
{
return new Task<List<Bitmap>>(() => {
var bitmaps = new List<Bitmap>();
var screenshotDone = new AutoResetEvent(false);
EventHandler<FrameLoadEndEventArgs> loaded = null;
loaded = (s, e) => {
// Start a new thread so CefSharp can finish loading and rendering the page.
if (e.IsMainFrame && e.Url != "about:blank") {
new System.Threading.Tasks.Task(() => {
System.Threading.Thread.Sleep(3000);
bitmaps.Add(ControlSnapshot.Snapshot(browser));
screenshotDone.Set();
}).Start();
}
};
browser.FrameLoadEnd += loaded;
foreach (string url in urls) {
// Wait until page finished loading and take a screenshot.
browser.Invoke(new MethodInvoker(() => {
browser.Load(url);
}));
screenshotDone.WaitOne();
}
browser.FrameLoadEnd -= loaded;
return bitmaps;
});
}
您还需要添加一个新文件来拍摄快照,ControlSnapshot.cs
:
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;
using System.Windows.Forms;
public class ControlSnapshot
{
public static Bitmap Snapshot(Control c)
{
int width = 0, height = 0;
IntPtr hwnd = IntPtr.Zero;
IntPtr dc = IntPtr.Zero;
c.Invoke(new MethodInvoker(() => {
width = c.ClientSize.Width;
height = c.ClientSize.Height;
hwnd = c.Handle;
dc = GetDC(hwnd);
}));
Bitmap bmp = new Bitmap(width, height, PixelFormat.Format32bppRgb);
if (dc != IntPtr.Zero) {
try {
using (Graphics g = Graphics.FromImage(bmp)) {
IntPtr bdc = g.GetHdc();
try {
BitBlt(bdc, 0, 0, width, height, dc, 0, 0, TernaryRasterOperations.SRCCOPY);
} finally {
g.ReleaseHdc(bdc);
}
}
} finally {
ReleaseDC(hwnd, dc);
}
}
return bmp;
}
[DllImport("user32.dll", SetLastError = true)]
public static extern IntPtr GetDC(IntPtr hWnd);
[DllImport("user32.dll")]
public static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC);
[DllImport("gdi32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool BitBlt(IntPtr hdc, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hdcSrc, int nXSrc, int nYSrc, TernaryRasterOperations dwRop);
public enum TernaryRasterOperations : uint
{
/// <summary>dest = source</summary>
SRCCOPY = 0x00CC0020,
/// <summary>dest = source OR dest</summary>
SRCPAINT = 0x00EE0086,
/// <summary>dest = source AND dest</summary>
SRCAND = 0x008800C6,
/// <summary>dest = source XOR dest</summary>
SRCINVERT = 0x00660046,
/// <summary>dest = source AND (NOT dest)</summary>
SRCERASE = 0x00440328,
/// <summary>dest = (NOT source)</summary>
NOTSRCCOPY = 0x00330008,
/// <summary>dest = (NOT src) AND (NOT dest)</summary>
NOTSRCERASE = 0x001100A6,
/// <summary>dest = (source AND pattern)</summary>
MERGECOPY = 0x00C000CA,
/// <summary>dest = (NOT source) OR dest</summary>
MERGEPAINT = 0x00BB0226,
/// <summary>dest = pattern</summary>
PATCOPY = 0x00F00021,
/// <summary>dest = DPSnoo</summary>
PATPAINT = 0x00FB0A09,
/// <summary>dest = pattern XOR dest</summary>
PATINVERT = 0x005A0049,
/// <summary>dest = (NOT dest)</summary>
DSTINVERT = 0x00550009,
/// <summary>dest = BLACK</summary>
BLACKNESS = 0x00000042,
/// <summary>dest = WHITE</summary>
WHITENESS = 0x00FF0062,
/// <summary>
/// Capture window as seen on screen. This includes layered windows
/// such as WPF windows with AllowsTransparency="true"
/// </summary>
CAPTUREBLT = 0x40000000
}
}
使用系统;
使用系统图;
使用系统、绘图、成像;
使用System.Runtime.InteropServices;
使用System.Windows.Forms;
公共类控件快照
{
公共静态位图快照(控件c)
{
整数宽度=0,高度=0;
IntPtr hwnd=IntPtr.0;
IntPtr dc=IntPtr.0;
c、 调用(新方法调用程序(()=>{
宽度=c.ClientSize.width;
高度=c.ClientSize.height;
hwnd=c.手柄;
dc=GetDC(hwnd);
}));
位图bmp=新位图(宽度、高度、像素格式.Format32bppRgb);
如果(dc!=IntPtr.Zero){
试一试{
使用(Graphics g=Graphics.FromImage(bmp)){
IntPtr bdc=g.GetHdc();
试一试{
BitBlt(bdc,0,0,宽度,高度,dc,0,0,ternalyRasterOperations.SRCCOPY);
}最后{
g、 释放HDC(bdc);
}
}
}最后{
释放dc(hwnd,dc);
}
}
返回bmp;
}
[DllImport(“user32.dll”,SetLastError=true)]
公共静态外部IntPtr GetDC(IntPtr hWnd);
[DllImport(“user32.dll”)]
公共静态外部int ReleaseDC(IntPtr hWnd、IntPtr hDC);
[DllImport(“gdi32.dll”)]
[返回:Marshallas(UnmanagedType.Bool)]
公共静态外部布尔位BLT(IntPtr hdc、int nXDest、int nXDest、int nWidth、int nHeight、IntPtr hdcSrc、int nXSrc、int nYSrc、TERNARYSTEROPERATIONS dwRop);
公共枚举TernaryRasterOperations:uint
{
///dest=源
SRCCOPY=0x00CC0020,
///dest=源或目标
SRCPAINT=0x00EE0086,
///dest=源和目标
SRCAND=0x008800C6,
///dest=源异或dest
SRC逆变器=0x00660046,
///dest=源和(非dest)
srcrease=0x00440328,
///dest=(不是源)
NOTSRCCOPY=0x00330008,
///目的地=(非src)和(非目的地)
NOTSCREASE=0x001100A6,
///dest=(源和模式)
合并副本=0x00C000CA,
///dest=(非源)或dest
MERGEPAINT=0x00BB0226,
///dest=模式
PATCOPY=0x00F00021,
///dest=DPSnoo
PATPAINT=0x00FB0A09,
///dest=模式异或dest
PATINVERT=0x005A0049,
///目的地=(非目的地)
DSTINVERT=0x00550009,
///dest=黑色
黑度=0x00000042,
///dest=白色
白度=0x00FF0062,
///
///屏幕上显示的捕获窗口。这包括分层窗口
///例如具有AllowTransparency=“true”的WPF窗口
///
CAPTUREBLT=0x40000000
}
}
你能粘贴到目前为止的代码吗?你想对加载的页面做什么?只需看X秒钟?CefSharp一次只能看一页,除非你在新选项卡中打开它们。我只想通过javascript获得一些操作的屏幕截图。如何创建新选项卡…你使用WinForms还是WPF?它们都需要屏幕截图的代码不同。@Sanjay我很困惑……你说你需要WinForms的解决方案。@Sanjay也许你应该测试一下,看看它是否适合你,接受答案,然后为控制台解决方案发布一个新问题,因为这将是完全不同的。
using System.Threading;
using System.Threading.Tasks;
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;
using System.Windows.Forms;
public class ControlSnapshot
{
public static Bitmap Snapshot(Control c)
{
int width = 0, height = 0;
IntPtr hwnd = IntPtr.Zero;
IntPtr dc = IntPtr.Zero;
c.Invoke(new MethodInvoker(() => {
width = c.ClientSize.Width;
height = c.ClientSize.Height;
hwnd = c.Handle;
dc = GetDC(hwnd);
}));
Bitmap bmp = new Bitmap(width, height, PixelFormat.Format32bppRgb);
if (dc != IntPtr.Zero) {
try {
using (Graphics g = Graphics.FromImage(bmp)) {
IntPtr bdc = g.GetHdc();
try {
BitBlt(bdc, 0, 0, width, height, dc, 0, 0, TernaryRasterOperations.SRCCOPY);
} finally {
g.ReleaseHdc(bdc);
}
}
} finally {
ReleaseDC(hwnd, dc);
}
}
return bmp;
}
[DllImport("user32.dll", SetLastError = true)]
public static extern IntPtr GetDC(IntPtr hWnd);
[DllImport("user32.dll")]
public static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC);
[DllImport("gdi32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool BitBlt(IntPtr hdc, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hdcSrc, int nXSrc, int nYSrc, TernaryRasterOperations dwRop);
public enum TernaryRasterOperations : uint
{
/// <summary>dest = source</summary>
SRCCOPY = 0x00CC0020,
/// <summary>dest = source OR dest</summary>
SRCPAINT = 0x00EE0086,
/// <summary>dest = source AND dest</summary>
SRCAND = 0x008800C6,
/// <summary>dest = source XOR dest</summary>
SRCINVERT = 0x00660046,
/// <summary>dest = source AND (NOT dest)</summary>
SRCERASE = 0x00440328,
/// <summary>dest = (NOT source)</summary>
NOTSRCCOPY = 0x00330008,
/// <summary>dest = (NOT src) AND (NOT dest)</summary>
NOTSRCERASE = 0x001100A6,
/// <summary>dest = (source AND pattern)</summary>
MERGECOPY = 0x00C000CA,
/// <summary>dest = (NOT source) OR dest</summary>
MERGEPAINT = 0x00BB0226,
/// <summary>dest = pattern</summary>
PATCOPY = 0x00F00021,
/// <summary>dest = DPSnoo</summary>
PATPAINT = 0x00FB0A09,
/// <summary>dest = pattern XOR dest</summary>
PATINVERT = 0x005A0049,
/// <summary>dest = (NOT dest)</summary>
DSTINVERT = 0x00550009,
/// <summary>dest = BLACK</summary>
BLACKNESS = 0x00000042,
/// <summary>dest = WHITE</summary>
WHITENESS = 0x00FF0062,
/// <summary>
/// Capture window as seen on screen. This includes layered windows
/// such as WPF windows with AllowsTransparency="true"
/// </summary>
CAPTUREBLT = 0x40000000
}
}