CefSharp и фреймы, получение HTML только из первого фрейма

pcpao.org/general.php?strap=152814186280001650

При попытке получить полный HTML-код с этого сайта .GetSourceAsync и .ViewSource оба отображают только HTML-код «набора фреймов». При использовании параметра ShowDevTools полные данные HTML находятся как в коллекции элементов, так и в источниках Chrome-devtools.

Я запускаю это после загрузки веб-страницы, но все должно быть там, так как оно находится в инструментах разработки?

Чего мне не хватает, чтобы получить полный HTML-код с сайта с навигацией. Я подозреваю, что это связано с фреймами, но после часа гугления и чтения старых сообщений я вижу, что это упоминается лишь косвенно.

Винформс

  package id="cef.redist.x64" version="3.2526.1362" targetFramework="net46"
  package id="cef.redist.x86" version="3.2526.1362" targetFramework="net46"
  package id="CefSharp.Common" version="47.0.3" targetFramework="net46"
  package id="CefSharp.WinForms" version="47.0.3" targetFramework="net46"

person SuperDave    schedule 19.03.2016    source источник
comment
Не существует термина «полный исходный код HTML», инструменты разработки просто упрощают некоторые вещи для вас, но они не работают таким образом. Каждый кадр содержит html-документ. Таким образом, вы должны получить исходники из каждого кадра. Обратитесь к CefSharp API, чтобы узнать, как это сделать.   -  person Dmitry Azaraev    schedule 19.03.2016
comment
Похоже на дубликат stackoverflow.com/questions/35890355/   -  person amaitland    schedule 20.03.2016


Ответы (2)


У меня была такая же проблема, когда я пытался получить щелчок и элемент, расположенный во фрейме, а не в основном фрейме. Используя пример в вашем ответе, я написал следующий метод расширения:

public static IFrame GetFrame(this ChromiumWebBrowser browser, string FrameName)
{
    IFrame frame = null;

    var identifiers = browser.GetBrowser().GetFrameIdentifiers();

    foreach (var i in identifiers)
    {
        frame = browser.GetBrowser().GetFrame(i);
        if (frame.Name == FrameName)
            return frame;
    }

    return null;
}

Если в вашей форме используется модуль, содержащий этот метод, вы можете сделать что-то вроде:

var frame = browser.GetFrame("nameofframe");
if (frame != null)
    frame.EvaluateScriptAsync("document.getElementById('whateveridyouwanttoclick').click();");

Конечно, вам нужно убедиться, что загрузка страницы завершена, прежде чем использовать это, но я планирую использовать его часто. Надеюсь, поможет!

person Jim Wilcox    schedule 28.03.2016

Спасибо, некоторые примеры из предыдущих версий запутали меня, как это работает. Я искал что-то вроде этого.

var frameIdent = Browser.GetBrowser().GetFrameIdentifiers();
var result = Browser.GetBrowser().GetFrame(frameIdent.Last()).GetSourceAsync().Result;
textBox1.Text = result.ToString();

Поэтому я предполагаю, что способ получить весь HTML-код с сайта - это пройтись по списку идентификаторов фреймов, получить результат из каждого фрейма через GetSourceAsync и объединить их все в строку.

person SuperDave    schedule 20.03.2016
comment
Согласно ссылке, которую я разместил, вы дождались завершения загрузки страницы и получения исходного кода для основного фрейма? - person amaitland; 20.03.2016