Здравствуйте. Разбираюсь с cefsharp и наткнулся на какой то глюк.
Задача получить полный код страницы.
Нашел в интернете код:
private async Task<string> GetHTMLFromWebBrowserAsync(ChromiumWebBrowser browser)
{
browser.GetBrowser().MainFrame.ViewSource();
return await browser.GetBrowser().MainFrame.GetSourceAsync();
}
Но тут есть ненужная вещь.
browser.GetBrowser().MainFrame.ViewSource();
Эта строка открывает блокнот и показывает в нем правильный код.
Если после нее выполнить
browser.GetBrowser().MainFrame.GetSourceAsync();
То все возвращается правильно. (По крайней мере глючит меньше)
Если же строку выполнять ТОЛЬКО
browser.GetBrowser().MainFrame.GetSourceAsync();
То код страницы возвращается только со скриптами. Он не выполняет прогрузку и выполнение всех скриптов на странице. Почему так то??
Почему так то?? Зачем нужно это окно блокнота то?? Каким образом получить правильный код без внешних окон блокнота??
AlexP
(Alex P.)
21.Октябрь.2020 19:09:55
#2
Так и задумано.
cefsharp.github.io/api/57.0.0/html/M_CefSharp_WebBrowserExtensions_ViewSource.htm
Opens up a new program window (using the default text editor) where the source code of the currently displayed web page is shown.
Зачем вызывать если не нужно это?)
GetSourceAsync
вроде ж и возвращает код.
WorldMaster:
Почему так то??
Вообще по описанию и гуглу похоже, что это исходник от сервера, а не текущий DOM. Как Ctrl+U vs F12
Но если
то видимо все-таки нет, и может просто вызывать позже надо?
Например в FrameLoadEnd
https://stackoverflow.com/a/35925515/964478
Я тоже это видел и меня просто всбесила глупость.
Там тоже спрашивали как избавится от показа нового окна а в ответ код где то же самое окно показывается.
Тут глюк видимо в том что когда показывается окно то код прогружается в какой то внутренний буфер чтоли. Я тут исходники разобрал но там какая то каша. Так и не нашел этой функции. Кроме интерфейсов вообще ничего нету… (((
AlexP
(Alex P.)
21.Октябрь.2020 19:50:11
#4
А, если нужно получить код после обработки скриптами, то конечно в момент завершения загрузки еще может быть рано.
В Selenium это легко решается функцией ожидания появления нужного элемента на странице.
В обычных браузерах типа этого обычно сложно
Можно тупо Sleep
WebBrowserExtensions.cs CefFrameWrapper.cpp frame_impl.cc
Да что то не похоже. Где тот самый метод который получает код и вызывает что то типа Process.Start. где текстовый документ *.tmp сохраняется и как запускается.
AlexP
(Alex P.)
21.Октябрь.2020 20:20:56
#6
Так это не ViewSource
.
Он по аналогичному пути в итоге тут , потом тут , тут и наконец WriteTempFileAndView .
Но он не делает ничего особенного, просто задержка получается и скрипты успевают выполниться.
AlexP:
FrameLoadEnd
Переделал через событие FrameLoadEnd. Вроде заработало без показа блокнота. Будем ждать тестирования. Похоже это и есть правильное решение.