Cefsharp 如何使用for循环加载多个url?

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

我有一个数据库中的url列表

我正在foreach循环中将所有url传递给浏览器。但浏览器只考虑最后一个url,页面只显示最后一个url,而不显示我传递的上一个url

如何解决

示例代码:

public void GetscreenshotBK(字符串html、字符串文件路径) { HtmlWeb web=新的HtmlWeb(); HtmlAgilityPack.HtmlDocument doc=web.Load(文件路径); 字符串路径=@”//td[@class='case'];//span[@class='ClassToGet+']

//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
    }
}