2014-12-04 236 views
0

我有一个数据库的网址列表。如何使用for循环加载cefsharp中的多个url?

我传递的所有网址到浏览器中的foreach loop.But浏览器只考虑最后的URL和页面只显示去年的网址而不是以前的网址,我过去了。

怎么解决呢?

示例代码:

公共无效GetscreenshotBK(串HTML,字符串文件路径) { HtmlWeb幅=新HtmlWeb(); HtmlAgilityPack.HtmlDocument doc = web.Load(filepath); 串路径= @ “// TD [@类= '案件']”; //跨度[@类= ' “+ ClassToGet +”']

 //Xpath query the document for all matching nodes 
     HtmlNodeCollection nodes = doc.DocumentNode.SelectNodes(path); 

     //Get all the nodes in the node collection 
     // List<string> list = new List<string>(); 

     foreach (HtmlNode n in nodes) 
     { 
      //string path1 = @".//a";//span[@class='" + ClassToGet + "'] 

      //Xpath query the document for all matching nodes 

      IEnumerable<HtmlAgilityPack.HtmlNode> htmlnodevalues = n.Descendants("a"); 
      foreach (var node in htmlnodevalues) 
      {    
       string bkurl = node.GetAttributeValue("href",""); 
       Browser.Load(bkurl); 
       //list.Add(bkurl); 
      }} 
+0

你能粘贴到目前为止的代码吗? – Yoshi 2014-12-04 09:18:48

+0

你想用加载的页面做什么?只要看看他们X秒? CefSharp一次只能查看一个页面,除非您在新选项卡中打开它们。 – Yoshi 2014-12-04 10:21:23

+0

我只想通过javascript获取一些操作的屏幕截图。 – Sanjay 2014-12-04 13:23:58

回答

1

只可能对做这个工作另一个线程使用任务。因为带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; 
     }); 
    } 

随着这些using声明:

using System.Threading; 
using System.Threading.Tasks; 

您还需要添加一个新的文件来创建快照,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 
    } 
} 
+0

解决方案如何使用它的控制台应用程序.. – Sanjay 2014-12-17 16:06:30

+0

@Sanjay我糊涂了......你说你需要的WinForms的解决方案。 – Yoshi 2014-12-18 02:45:49

+1

@Sanjay也许你应该测试这一点,看看它是否适合你,接受的答案,然后再发布新问题的解决方案控制台,因为这将是完全不同的。 – Yoshi 2014-12-18 02:46:31