Мне нужен мой ChromiumWebBrowser для загрузки всех страниц в массиве URL-адресов, выполнения javascript на каждой из них, а затем загрузки их источников. Я написал следующий фрагмент кода:
ChromiumWebBrowser[] chromium = new ChromiumWebBrowser[offersLinks.Count()];
for(int i = 0; i < offersLinks.Count(); ++i)
{
Debug.WriteLine("Page " + (i + 1) + "/" + offersLinks.Count());
chromium[i] = new ChromiumWebBrowser(offersLinks[i]);
chromium[i].FrameLoadEnd += async (sender, args) =>
{
//Wait for the MainFrame to finish loading
if (args.Frame.IsMain)
{
Debug.WriteLine("Loaded.");
if (chromium[i].CanExecuteJavascriptInMainFrame)
{
JavascriptResponse response = await chromium[i].EvaluateScriptAsync(javascript);
if (response.Result != null)
{
Debug.WriteLine(response.Message);
}
}
chromium[i].ViewSource();
string html = await chromium[i].GetSourceAsync();
}
};
}
Однако по какой-то причине код обратного вызова FrameLoadEnd никогда не выполняется. Не могли бы вы объяснить это мне?
@alec Страница должна быть загружена в конструкторе после установки URL-адреса.
вы правы, но похоже, что есть проблемы, когда он не загружает URL-адрес, переданный в конструктор, в 100% случаев. «Обходной путь WinForms для определенных сценариев не может загрузить URL-адрес, переданный в конструктор ChromiumWebBrowser (исходные данные в # 2234 (комментарий) были возвращены в 821a44f, поскольку проблема кажется решенной». Не могли бы вы попробовать явно вызвать метод Load с URL-адресом после создания объектов ChromiumWebBrowser, чтобы увидеть, отличается ли поведение?
@alec, я уже пробовал, но, к сожалению, не сработало.
Вы используете CefSharp.OffScreen? Вы не можете использовать версии WPF или WinForms, такие как приведенный выше пример кода.
@amaitland ты прав, спасибо! Не могли бы вы опубликовать это как ответ, чтобы я мог его принять?
Ответ опубликован, не стесняйтесь предлагать некоторые изменения.
В случаях, когда вам не требуется UI
, лучше использовать CefSharp.OffScreen
Версии WPF
и WinForms
не начнут загружаться, пока они не будут прикреплены к CefSharp
.
Есть ли метод, который вам нужно вызвать для объектов ChromiumWebBrowser, чтобы фактически загрузить URL-адрес offerLinks[i]? Я не вижу причин, по которым обработчик событий не вызывается, если только страница никогда не загружается.