cefsharp是一个在c#中使用Chrome浏览器内核实现浏览器功能的插件,类似于c#中的WebBrowser功能。

主要代码:

1、引用

<wpf:ChromiumWebBrowser x:Name="webBrowser" Address="https://www.walmart.com/account/login"/>

2、执行JavaScript

public async void EvaluateJavaScript(string s, bool addCommonJs = false)

{

try

{

if (addCommonJs)

{

s = commonJs + s;

}

var response = await webBrowser.EvaluateScriptAsync(s);

if (response.Success && response.Result is IJavascriptCallback)

{

response = await ((IJavascriptCallback)response.Result).ExecuteAsync("This is a callback from EvaluateJavaScript");

}

var EvaluateJavaScriptResult = response.Success ? (response.Result ?? "null") : response.Message;

}

catch (Exception e)

{

MessageBox.Show("Error while evaluating Javascript: " + e.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error);

}

}

3、设置cookie

public static void SetCefCookies(string url, CookieCollection cookies)

{

//Cef.GetGlobalCookieManager().SetStoragePath(Environment.CurrentDirectory, true);

foreach (System.Net.Cookie c in cookies)

{

var cookie = new CefSharp.Cookie

{

Creation = DateTime.Now,

Domain = c.Domain,

Name = c.Name,

Value = c.Value,

Expires = c.Expires

};

Task<bool> task = Cef.GetGlobalCookieManager().SetCookieAsync(url, cookie);

while (!task.IsCompleted)

{

continue;

}

bool b = task.Result;

}

}

4、获取当前页面的html源码

private string GetHTMLFromWebBrowser()

{

// call the ViewSource method which will open up notepad and display the html.

// this is just so I can compare it to the html returned in GetSourceAsync()

// This is displaying all the html code (including child frames)

//webBrowser.GetBrowser().MainFrame.ViewSource();

// Get the html source code from the main Frame.

// This is displaying only code in the main frame and not any child frames of it.

Task<String> taskHtml = webBrowser.GetBrowser().MainFrame.GetSourceAsync();

string response = taskHtml.Result;

return response;

}

5、拦截json请求结果

public class DefaultResourceHandler : ResourceRequestHandler

{

public event EventHandler<JsonResponseHandlerEventArgs> json_response_handler;

private Dictionary<ulong, MemoryStreamResponseFilter> responseDictionary = new Dictionary<ulong, MemoryStreamResponseFilter>();

public DefaultResourceHandler() { }

public DefaultResourceHandler(EventHandler<JsonResponseHandlerEventArgs> json_response_handler) {

this.json_response_handler = json_response_handler;

}

protected override IResponseFilter GetResourceResponseFilter(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IResponse response)

{

if (response.MimeType.Equals("application/json", StringComparison.OrdinalIgnoreCase)

|| (response.Headers["Content-Type"] != null && response.Headers["Content-Type"].ToLower().Contains("application/json")))

{

return JsonResponseFilter.CreateFilter(request.Identifier.ToString());

}

return null;

}


protected override void OnResourceLoadComplete(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IResponse response, UrlRequestStatus status, long receivedContentLength)

{

var filter = JsonResponseFilter.GetFileter(request.Identifier.ToString()) as JsonResponseFilter;

if (filter != null)

{

var encode = !string.IsNullOrEmpty(response.Charset)

? Encoding.GetEncoding(response.Charset)

: Encoding.UTF8;

using (var read = new StreamReader(filter.GetStream(), encode))

{

//获取到的json内容

var text = read.ReadToEnd();

json_response_handler?.Invoke(response, new JsonResponseHandlerEventArgs(request, response, text));

Trace.WriteLine(response.MimeType + "=>" + request.Url + "::" + text);

}

}

}

}