CefSharp получает часть из исходного кода выбранного / активного элемента - PullRequest
0 голосов
/ 29 мая 2020

enter image description here

Всем привет ? и уже заранее спасибо!

Мне нужно каким-то образом получить только часть загруженного исходного кода веб-сайта (Картинка 2) путем наведения (если это невозможно, я бы тоже был доволен щелчком мыши) над элементом (Картинка 1) . Я знаю, это звучит, может быть, странно, потому что DevTool уже делает это очень хорошо, просто щелкнув (Картинка 3) . Но если возможно, я хотел бы зачитать только внутренние и внешние - HTML (в зависимости от того, что мне нужно в данный момент) часть, которая активна / выбрана.

Что у меня есть достигнуто:

int counter = 0;

private async void timer1_Tick(object sender, EventArgs e)
{
        string returnValue = "";

        string script = "(function() { return document.activeElement.outerHTML; })();";

        var task = browser.GetMainFrame().EvaluateScriptAsync(script);

        await task.ContinueWith(t =>
        {
            if (!t.IsFaulted)
            {
                var response = t.Result;

                if (response.Success && response.Result != null)
                {
                    returnValue = response.Result.ToString();
                }
            }
        });

        if (returnValue != "")
        {
            richTextBox1.Invoke(new Action(() => richTextBox1.Text = returnValue));
        }
        else // Just to check if there still happens something:
        {
            counter += 1;
            richTextBox1.Invoke(new Action(() => richTextBox1.Text = counter.ToString() ));
        }
}

С этим кодом проблема кажется решенной ?. Но мне интересно, есть ли «лучший» способ без таймера.

1 Ответ

0 голосов
/ 30 мая 2020

Ответ или, скажем так, лучшее решение - (спасибо @amaitland) выбросить этот таймер и использовать вместо него (в Form_Load или где бы вы ни настроили все):

browser.JavascriptMessageReceived += OnBrowserJavascriptMessageReceived;
browser.FrameLoadEnd += Browser_FrameLoadEnd;

и поместите мой код в :

private void OnBrowserJavascriptMessageReceived(object sender, JavascriptMessageReceivedEventArgs e)
{
    // the code
}

А еще нужно:

async void Browser_FrameLoadEnd(object sender, FrameLoadEndEventArgs e)
{ // Does wait till the Website is fully loaded.
    if (e.Frame.IsMain)
    {
        //In the main frame we inject some javascript that's run on mouseUp
        //You can hook any javascript event you like.
        browser.ExecuteScriptAsync(@"
              document.body.onmouseup = function()
              {
                //CefSharp.PostMessage can be used to communicate between the browser
                //and .Net, in this case we pass a simple string,
                //complex objects are supported, passing a reference to Javascript methods
                //is also supported.
                //See https://github.com/cefsharp/CefSharp/issues/2775#issuecomment-498454221 for details
                CefSharp.PostMessage(window.getSelection().toString());
              }
        ");
    }
}
...