WebBrowser

Windows Phone e o WebBrowser: Manipulando o DOM da página

É a primeira vez que estou postando algo sobre o Windows Phone.

Se você já programou para Desktop (Windows Forms) deve saber que o controle WebBrowser do desktop possui uma propriedade chamada Document (do tipo HtmlDocument). Essa propriedade em questão nos permite manipular o DOM da página.

Contudo, essa mesma propriedade não existe no controle WebBrowser do Windows Phone. No entanto, ainda existe uma maneira de manipular o DOM da página, que é se utilizando de JavaScript.

Para fazer isso, primeiramente você deve definir a propriedade IsScriptEnabled para True. Depois, basta seguir a linha de raciocínio do exemplo abaixo:

string script = "function() { return document.getElementById('Exemplo').innerText; }";

object returnValue = WebBrowser1.InvokeScript("eval", script);

// nesse caso returnValue será o InnerText do elemento Exemplo.

O exemplo acima utiliza a função WebBrowser.InvokeScript para invocar a função global eval() do JavaScript que, por último, executa o script passado como parâmetro.

No caso do exemplo acima, será retornado para a variável returnValue a propriedade InnerText do elemento Exemplo.

Bônus

Para carregar um HTML em um controle WebBrowser utilize o método WebBrowser.NavigateToString Method.

Para salvar a página carregada utilize o método WebBrowser.SaveToString.

Documentação no MSDN: WebBrowser Class (Microsoft.Phone.Controls)

PS.: Não tive a oportunidade de testar o código acima pois estou sem o SDK do Windows Phone instalado. Contudo, de acordo com a documentação e a teoria esta é a maneira de se fazer.

Então, se você obtiver alguma exceção na chamada do método InvokeScript tente fazer alguma alteração no seu script. Lembre-se que a mesma coisa pode ser feita de várias maneiras.

Outra coisa que devo salientar é que o mesmo script pode não funcionar em todas as versões do Windows Phone, então você deve testar manualmente!

Anúncios

WebBrowser: Previnindo múltiplas chamadas do evento DocumentCompleted

Se você usa, ou já usou, o controle WebBrowser deve ter percebido que às vezes o evento DocumentCompleted é invocado várias vezes.

Mas, por que isto acontece? Explicarei:

Uma página web pode conter Frames e esses frames possuem um evento OnLoad e o evento Completed respectivo. Aí, cada vez que o carregamento de um frame é completado, o evento DocumentCompleted do WebBrowser é chamado, gerando as múltiplas chamadas.

Mas não se preocupe, existe uma forma de resolver isso. Veja como é simples:

VB.NET:

Private Sub WebBrowser1_DocumentCompleted(sender As Object, e As WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
        If e.Url = WebBrowser1.Url Then 'Verifica se a url é a de um Frame ou a url da página.
            'Aqui o código que você quer executar quando a página estiver totalmente carregada
        End If
End Sub

C#

private void WebBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
	if (e.Url == WebBrowser1.Url) //Verifica se a url é a de um Frame ou a url da página.
   {
		//Aqui o código que você quer executar quando a página estiver totalmente carregada
	}
}

Uma dica simples, mas com certeza muito útil! 😀

WebBrowser: Injetar (Executar) script na página

Irei mostrar por meio deste post como fazer para injetar um script(Em JavaScript) em uma página web carregada em um controle WebBrowser. Eis o código:

VB.NET:

    Public Sub InjectScript(Script As String)
        WebBrowser1.Document.InvokeScript("eval", New Object() {Script})
    End Sub

C#:

    public void InjectScript(string Script)
    {
	WebBrowser1.Document.InvokeScript("eval", new object[] { Script });
    }

Basicamente, eu uso a função InvokeScript da propriedade Document do controle WebBrowser para chamar a função global eval() do JavaScript.

A função eval() computa ou executa um argumento passado para ela. Se o argumento for uma expressão matemática eval(), irá retornar o resultado do cálculo. Se o argumento for um ou mais trechos de códigos, eval() irá executa-los e, caso o trecho retorne algum valor, o mesmo será retornado por eval(), e em última instância, por InvokeScript.

Veja este outro post com um outro exemplo: Windows Phone e o WebBrowser: Manipulando o DOM da página | Herbert.Lausmann

Então, basta chamar a rotina InjectScript informando no parâmetro o script que você deseja executar na página. Você pode transformar o método InjectScript em uma função, caso queira que o script retorne algum valor. 🙂