CEFSHARP - ChromiumWebBrowser при получении значений ячеек строки таблицы - PullRequest
0 голосов
/ 17 апреля 2019

Я решил большинство своих проблем, но не смог найти решение для одной из них.Ранее я использовал Windows WebBrowser и получал результаты таблицы на экране запроса в панели дилера.Вот так;

foreach (HtmlElement htmlobj in webBrowser1.Document.GetElementsByTagName("Table"))
 {
     if (htmlobj.GetAttribute("className") == "table table-striped")
     {
          foreach (HtmlElement tr in htmlobj.GetElementsByTagName("tbody"))
          {
               foreach (HtmlElement td in tr.Children)
              {
                    string s0 =  td.Children[0].InnerText;
                    string s1 =  td.Children[1].InnerText;
               }
          }
     }
}

Как я могу сделать это с ChromiumWebBrowser?

Большое спасибо за помощь ... ^ _ ^

1 Ответ

1 голос
/ 17 апреля 2019

Этого можно добиться в CefSharp с помощью EvaluateScriptAsync, выполнив JavaScript, чтобы найти элементы таблицы td и вернуть их в виде массива, который C # получит как List<object>

Если вы еще не знали, обычно нужно дождаться загрузки страницы MainFrame, прежде чем выполнять любой JavaScript, который вы могли бы реализовать, например:

//...
ChromiumWebBrowser browser = new ChromiumWebBrowser("https://example.com"); // <- Your URL there

browser.FrameLoadEnd += (sender, args) =>
{
  // Wait for the MainFrame to finish loading
  if(args.Frame.IsMain)
      GetTable(); // method to call that executes JavaScript, etc
}

Дополнительная информация о том, когда вы можете начать выполнять JavaScript.

Вот код, который я сделал для EvaluateScriptAsync, чтобы вернуть td innerText в C #:

// assuming "browser" is the ChromiumWebBrowser and you're ready to start executing JavaScript (see above code)
private void GetTable ()
{
    const string script = @"(function(){
        let table = document.querySelector('table.table.table-striped'); // <table class='table table-striped'>
        let td = table.getElementsByTagName('td');
        return [ td[0].innerText, td[1].innerText ];
    })();";

    browser.GetMainFrame().EvaluateScriptAsync(script).ContinueWith(x =>
    {
        var response = x.Result;

        if (response.Success && response.Result != null)
        {
            // We cast values as CefSharp wouldn't know what to expect
            List<object> jsResult = (List<object>)response.Result;

            string s1 = (string)jsResult[0]; // td[0].innerText
            string s2 = (string)jsResult[1]; // td[1].innerText

            Console.WriteLine("s1: " + s1);
            Console.WriteLine("s2: " + s2);
            // In my example HTML page, it will output:
            // s1: This is 1st
            // s2: This is 2nd
        }
    });
}

Я сделал этот пример HTML, чтобы протестировать его, так как вы его не предоставили:

<table class="table table-striped">
    <tr>
        <th>One</th>
        <th>Two</th>
    </tr>
    <tr>
        <td>This is 1st</td>
        <td>This is 2nd</td>
    </tr>
</table>

Я сделал этот код специально для ответа на ваш вопрос, поэтому, если он работает, примите мой ответ, в противном случае прокомментируйте, почему он не работает, спасибо.

...