Страницы

Поиск по вопросам

воскресенье, 7 июля 2019 г.

C# CefSharp.OffScreen как его использовать, как получить html с уже выполненным JS

Здесь есть несколько статей по CefSharp, но как правило примеры кода скудные, и не раскрываю как использовать библиотеку . То что здесь нашёл выкидывает исключения, в общем прошу помочь - привести пример . Как без загрузки фрейма получить html текст с исполненным javascript. Скрипты должны выполнятся все, как в браузере , а не отдельно указанный в Task . Привожу пример с отображением в форме для CefSharp.WinForms , мне нужна аналогия кода для CefSharp.OffScreen 57 . DotNet 4.5.2
public partial class FormMain : Form { private ChromiumWebBrowser browser; private CefSettings settings;
public FormMain() { InitializeComponent(); InitializeWebBrowser(); } private void InitializeWebBrowser() { settings = new CefSettings();
settings.CefCommandLineArgs.Add("proxy-server", "37.75.9.131:8080"); settings.UserAgent = "Mozila 5.0";
Cef.Initialize(settings);
browser = new ChromiumWebBrowser(string.Empty) { Dock = DockStyle.Fill };
Controls.Add(browser); } private void btnLoad_Click(object sender, EventArgs e) { browser.Load("https://google.com"); } private async void btnSource_Click(object sender, EventArgs e) { var doc = browser.GetMainFrame(); string text = await doc.GetTextAsync(); } }
Таким образом я задал Proxy и UserAgent получил исходный код с обработанным JS спарсил текст страницы без разметки.
Html можно получить сл. образом : заменить string text = await doc.GetTextAsync(); на string html = await doc.GetSourceAsync();


Ответ

Пришёл к такому решению для CefSharp.OffScreen
private void btnGetText_Click(object sender, EventArgs e) { LoadFullText("https://google.com"); }
private async void LoadFullText(string url) { CefSettings settings = new CefSettings(); settings.CefCommandLineArgs.Add("proxy-server", "37.75.9.131:8080"); settings.UserAgent = "Mozila 5.0"; Cef.Initialize(settings); using (var chromium = new ChromiumWebBrowser(string.Empty)) { Thread.Sleep(1000); await LoadPageAsync(chromium, url); string text = await chromium.GetTextAsync(); } }
public static Task LoadPageAsync(IWebBrowser browser, string address = null) { var tcs = new TaskCompletionSource(); EventHandler handler = null; handler = (sender, args) => { if (!args.IsLoading) { browser.LoadingStateChanged -= handler; tcs.TrySetResultAsync(true); } }; browser.LoadingStateChanged += handler; if (!string.IsNullOrEmpty(address)) { browser.Load(address); } return tcs.Task; }
Для проверки работы просто вставил Thread.Sleep(1000); здесь нужно доработать.

Комментариев нет:

Отправить комментарий