none
PEGAR O VALOR DE UMA CLASS EM HTML CEFSHARP RRS feed

  • Pergunta

  • Olá gostaria de pegar, um valor class de um html e jogar em uma label, usando cefsharp 

    exemplo. pegar este valor "5088" e jogar em label.Text

    <span id="xp" class="user-xp">5088</span>  // site

    meu código c# obs: este codigo não retorna nada já fiz debug ele não pega o valor!

    string script = string.Format("document.getElementsByName('user-xp').span");
                chromeBrowser.EvaluateScriptAsync(script).ContinueWith(x =>
                {
                    var response = x.Result;
    
                    if (response.Success && response.Result != null)
                    {
                        var startDate = response.Result;
                        label_xp_user.Text = startDate.ToString(); // MINHA LABEL !!
                        //startDate is the value of a HTML element.
                    }
                }
                );

    obs: este código em consigo jogar valores no site. tipo preencher fomulários, talvez ajude. 

    //chromeBrowser.ExecuteScriptAsync("document.getElementById('bet-input').value=" + '\'' + this.lb_test_all.Text + '\'');


    • Editado Nesquik.code domingo, 5 de novembro de 2017 04:14 correção
    domingo, 5 de novembro de 2017 04:12

Respostas

  • Ah é, verdade. Você está usando métodos assíncronos que são executados em um contexto paralelo ao da interface de usuário, por isso o erro. Altera o seu código para algo assim:

            private async void button1_Click(object sender, EventArgs e)
            {
                object spanText = null;
                string script = "(function () { return document.getElementById(\"xp\").innerHTML; })();";
                await chromeBrowser.EvaluateScriptAsync(script).ContinueWith(x =>
                  {
                      var response = x.Result;
                      if (response.Success && response.Result != null)
                      {
                          spanText = response.Result;
                      }
                  }
                  );
                label_xp_user.Text = spanText.ToString();
            }

    Eu adicionei o async na declaração do método button1_Click.. Aí eu posso usar await dentro, e realizar o processo de forma "correta";

    Link de apoio:

    C# - Programação Assincrona


    Herbert Lausmann

    • Marcado como Resposta Nesquik.code domingo, 5 de novembro de 2017 21:38
    domingo, 5 de novembro de 2017 14:27
  • Problema na lógica do script então..

    Tenta adaptar para Javascript aquela lógica que tu falou que usava no WebBrowser.

    Usa o Visual Studio pra codar. Cria um novo arquivo JavaScript pelo menu File->New->File. E edita lá, tu pode depurar o script no console do Google Chrome ou Microsoft Edge. Até que o script retorne o valor como desejado.


    Herbert Lausmann

    • Marcado como Resposta Nesquik.code domingo, 5 de novembro de 2017 23:48
    domingo, 5 de novembro de 2017 23:43

Todas as Respostas

  • Bom dia!

    Experimente trocar o seu script para:

    (function () { return document.getElementById("xp").innerHTML; })();

    Acredito que assim deverá funcionar.

    Explicando de forma simples, o ID, teoricamente, é único. Já a classe (class) pode ser usada por múltiplos objetos. Então a maneira correta é usar o ID do elemento. Você precisa, também, se certificar que seu script retorne algum valor. Por isso, defini uma função que retorna um valor utilizando a palavra chave return.

    innerHTML retorna o conteúdo HTML ou textual do elemento.

    Espero ter ajudado.

    Abraço!


    Herbert Lausmann

    domingo, 5 de novembro de 2017 12:09
  • onde devo colocar este código?. esta dando erro!
    domingo, 5 de novembro de 2017 12:55
  •             string script = "(function () { return document.getElementById(\"xp\").innerHTML; })();";
                chromeBrowser.EvaluateScriptAsync(script).ContinueWith(x =>
                {
                    var response = x.Result;
    
                    if (response.Success && response.Result != null)
                    {
                        var spanText = response.Result;
                        label_xp_user.Text = spanText.ToString(); // MINHA LABEL !!
                        //startDate is the value of a HTML element.
                    }
                }
                );
    Acredito que dessa maneira irá funcionar.

    Herbert Lausmann


    domingo, 5 de novembro de 2017 13:52
  • opa agora foi mais estou com outro erro agora ;(..  o valor que eu quero esta no spanText mais quando ele joga para label da erro....

    domingo, 5 de novembro de 2017 14:12
  • Ah é, verdade. Você está usando métodos assíncronos que são executados em um contexto paralelo ao da interface de usuário, por isso o erro. Altera o seu código para algo assim:

            private async void button1_Click(object sender, EventArgs e)
            {
                object spanText = null;
                string script = "(function () { return document.getElementById(\"xp\").innerHTML; })();";
                await chromeBrowser.EvaluateScriptAsync(script).ContinueWith(x =>
                  {
                      var response = x.Result;
                      if (response.Success && response.Result != null)
                      {
                          spanText = response.Result;
                      }
                  }
                  );
                label_xp_user.Text = spanText.ToString();
            }

    Eu adicionei o async na declaração do método button1_Click.. Aí eu posso usar await dentro, e realizar o processo de forma "correta";

    Link de apoio:

    C# - Programação Assincrona


    Herbert Lausmann

    • Marcado como Resposta Nesquik.code domingo, 5 de novembro de 2017 21:38
    domingo, 5 de novembro de 2017 14:27
  • olá seu código funciona perfeitamente. só tirando outra duvida tenho um outro site, tenho que pegar o valor, esta assim seria outro código mais já tentei de varias formas. 

    obs; quando eu usava webbrowse, eu usava este código funcionava perfeitamente. pegava o valor no div da classe "bonus-game-state front bonus-game-timer"

    string z = string.Empty;
                    foreach (HtmlElement el in webBrowser1.Document.GetElementsByTagName("div"))
    
                        if (el.GetAttribute("classname") == "bonus-game-state front bonus-game-timer")
                        {
                            lbTimerTrue.Text = el.InnerText;
                            //ou
                            //lb_show.Text = el.InnerHTML;
                        }

    domingo, 5 de novembro de 2017 21:38
  • Bem, eu não sou expert em JavaScript, pratico bem pouco.. Mas acho que o script abaixo deverá funcionar:

    (function () {
        var div = document.getElementsByClassName("bonus-game-state front bonus-game-timer")[0];
        var target = div.getElementsByClassName("inner")[0];
        return target.innerHTML;
    })();
    Basta usar a mesma lógica e invocar esse script, como no cenário original da pergunta.

    Herbert Lausmann

    domingo, 5 de novembro de 2017 22:01
  • Desculpa mais onde eu coloco este código.?

    private async void timer1_Tick(object sender, EventArgs e)
            {
                
    
                object spanText = null;
                string script = "(function () { return document.getElementByTagName(\"inner\").innerHTML; })();";
    
                await chromeBrowser.EvaluateScriptAsync(script).ContinueWith(x =>
                {
                    var response = x.Result;
    
                    if (response.Success && response.Result != null)
                    {
                        spanText = response.Result;
                        //startDate is the value of a HTML element.
                    }
                }
                );
    
                label_online.Text = spanText.ToString(); // MINHA LABEL !!*/
    
    
              
    
            }

    domingo, 5 de novembro de 2017 22:12
  •             object spanText = null;
                string script = "(function () {
        var div = document.getElementsByClassName(\"bonus-game-state front bonus-game-timer\")[0];
        var target = div.getElementsByClassName(\"inner\")[0];
        return target.innerHTML;
    })();";
    
                await chromeBrowser.EvaluateScriptAsync(script).ContinueWith(x =>
                {
                    var response = x.Result;
    
                    if (response.Success && response.Result != null)
                    {
                        spanText = response.Result;
                        //startDate is the value of a HTML element.
                    }
                }
                );
    
                label_online.Text = spanText.ToString(); // MINHA LABEL !!*/
    Dessa maneira, você usa no lugar do outro script..

    Herbert Lausmann

    domingo, 5 de novembro de 2017 22:26
  • nossa e agora ta foda...

    domingo, 5 de novembro de 2017 22:42
  • Ops, confundi uma coisa. É assim:

                string script = @"(function () {
        var div = document.getElementsByClassName(""bonus-game-state front bonus-game-timer\"")[0];
        var target = div.getElementsByClassName(""inner"")[0];
        return target.innerHTML;
    })();";


    Herbert Lausmann

    domingo, 5 de novembro de 2017 23:25
  • não esta pegando o valor.

    domingo, 5 de novembro de 2017 23:32
  • Problema na lógica do script então..

    Tenta adaptar para Javascript aquela lógica que tu falou que usava no WebBrowser.

    Usa o Visual Studio pra codar. Cria um novo arquivo JavaScript pelo menu File->New->File. E edita lá, tu pode depurar o script no console do Google Chrome ou Microsoft Edge. Até que o script retorne o valor como desejado.


    Herbert Lausmann

    • Marcado como Resposta Nesquik.code domingo, 5 de novembro de 2017 23:48
    domingo, 5 de novembro de 2017 23:43
  • ok Obrigado!!
    domingo, 5 de novembro de 2017 23:48