DUVIDA TRY PARAR FUNCAO DE WEBBROWSER

EDULOCO 27/10/2012 23:39:01
#412999
Pessoal vou tentar ser o mais claro possível na minha dúvida, estou com um projeto parado aqui pessoal e decidi retomar, com a ajuda do Pegudo eu consegui executar o que eu precisava, porém surgiu um problema no andar, segue o código que estou executando :


Private Sub WebBrowser1_DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
lblCarrega.Visible = False
Dim kills As HtmlElement = WebBrowser1.Document.GetElementById([Ô]global-kills[Ô])
txtKills.Text = kills.InnerText
Dim deaths As HtmlElement = WebBrowser1.Document.GetElementById([Ô]global-deaths[Ô])
Dim kdr As HtmlElement = WebBrowser1.Document.GetElementById([Ô]kdr[Ô])
Dim headshots As HtmlElement = WebBrowser1.Document.GetElementById([Ô]global-headshots[Ô])
Dim longest_headshot As HtmlElement = WebBrowser1.Document.GetElementById([Ô]global-longesths[Ô])
Dim partidas As HtmlElement = WebBrowser1.Document.GetElementById([Ô]global-rounds[Ô])
Dim ganhas As HtmlElement = WebBrowser1.Document.GetElementById([Ô]global-wins[Ô])
Dim perdas As HtmlElement = WebBrowser1.Document.GetElementById([Ô]global-losses[Ô])
txtDeaths.Text = deaths.InnerText
txtKD.Text = kdr.InnerText
txtHeadShots.Text = headshots.InnerText
txtLongHeadShot.Text = longest_headshot.InnerText
txtPartidas.Text = partidas.InnerText
txtGanhadas.Text = ganhas.InnerText
txtPerdidas.Text = perdas.InnerText
End Sub


Explicando... o script entra nessa pagina : http://bf3stats.com/ clica no botão PS3 onde está [Ô]Plataform[Ô] ali e preenche o nome de usuario com meu nick por exemplo Edu_loco, pega os dados e retorna nos textbox, agora a dúvida, vamos dizer que o personagem não é encontrado ou acontece algum problema no carregamento da pagina o script crasha falando que não encontrou os dados, como eu faço para resolver isso? Eu tentei por um try na função executando uma msgbox caso haja erro, mas a MsgBox vai aparecer uma vez para cada campo que ele vai tentar preencher o.O, como resolvo isso? kkkk
ALTAIR148 30/10/2012 16:30:13
#413172
Boa tarde,

Amigo, não tem como ser por um IF não? Exemplo, tratar o HTML da pagina não encontrada e verificar se tem algo que informe que a pagina não está disponível. Já para verificar se o usuário não for encontrado pode-se verificar algum campo se ele vai ter retorno ou não. Já tentou algo assim?
EDULOCO 30/10/2012 17:09:10
#413177
Altair poderia sim usar sua idéia, mas o site não mostra em parte nenhuma do fonte que o personagem não existe (creio que pelo site fazer essa checagem usando javascript), eu ja fiz esse script em Perl tranquilamente( o script em Perl não crasha caso não exista), mas queria refaze-lo em VB pela parte gráfica que vai ficar mais elegante.

Se eu conseguisse um jeito de apenas checar o personagem já resolveria o problema até de quando a pagina apresentasse algum problema.

Exemplo de um personagem que não existe : http://bf3stats.com/stats_ps3/Edu_locooooooooo veja como é apresentado na página.

O código que requisita ao java a função de verificar


<h1>Search for [ô]Edu_locooooooooo[ô] at ps3</h1>
<div class=[Ô]cont text[Ô]>
<div class=[Ô]updateinfo[Ô]></div>
</div>
<script type=[Ô]text/javascript[Ô]>
player.lookupStatus([ô].updateinfo[ô]);
</script>


O código java que mostra a mensagem caso o usuário não exista.


if(res.task.state==[ô]finished[ô] && res.task.result==[ô]notfound[ô]) {
lobj.text([ô]Player was not found. Please check if the player name is correct.[ô]);
lobj.addClass([ô]err[ô]);
}


Mas o código vai ficar oculto no fonte e não vou ter uma referencia. Pelo menos em VB eu não saberia fazer, que idéia me sugere Altair?

Agradeço desde já!
EDULOCO 30/10/2012 17:22:04
#413179
Ah não ser que eu usei sua idéia do IF para fazer uma verificação primária com alguma das informações que eu vou jogar no textbox só para verificar se os dados realmente estão funcionando, caso sim ele passa para uma subrotina secundária preenchendo os outros textbox, funcionária ou não?
ALTAIR148 30/10/2012 17:41:05
#413185
Seria por aí o caminho, eu mesmo não manjo muito de WEB, então não sei bem como lhe ajudar, vamos ver se mais alguém aqui lhe ajuda.
PEGUDO 05/11/2012 12:10:18
#413497
Resposta escolhida
olá, tudo bem
Cara, estive olhando o site que você disse e percebi que o JavaScript dá um erro no carregamento dos dados (pelo menos aqui no meu IE9).

Então, já que a intenção é saber se o perfil desejado existe, eu fiz o seguinte:
1. Coloquei imports no topo do código:
Imports Sysytem.Net

2. Coloquei um TextBox, chamado txtPerfil;
3. Um botao
4. No Click do botão eu coloquei o seguinte código:

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
Dim Decisao As String = Nothing

If ExistePerfil(txtPerfil.text) Then
Decisao = [Ô]Existe.[Ô]
Else
Decisao = [Ô]não existe.[Ô]
End If

MsgBox([Ô]O perfil: [Ô] & txtPerfil.Text & [Ô] [Ô] & Decisao)
End Sub

5. Criei uma Function, descrita abaixo:

Private Function ExistePerfil(ByVal QualPerfil As String) As Boolean
Dim Endereco As String = [Ô]http://bf3stats.com/stats_ps3/[Ô] & QualPerfil
Dim Req As WebRequest = WebRequest.Create(Endereco)
Dim Resposta As WebResponse = Req.GetResponse
Dim Ler As String = Nothing
Dim Vetor() As String = Nothing

Using Arq As StreamReader = New StreamReader(Resposta.GetResponseStream)
Ler = Arq.ReadToEnd
Ler = Replace(Ler, Chr(34), [Ô][Ô])
Vetor = Split(Ler, [Ô]id=playerhead[Ô])

If Vetor.Count = 1 Then
ExistePerfil = False
Else
ExistePerfil = True
End If
End Using

Try
Resposta.Close()
Resposta = Nothing
Catch ex As Exception
Resposta = Nothing
Finally
Req = Nothing
End Try

Return ExistePerfil
End Function

O que o código faz:
Ele faz um Request na página do PS3, procurando o usuário digitado no txtPerfil;
Ele faz o retorno da resposta deste Request e tenta localizar o div com id = playerhead;
Se o div não retornar vazio, significa que o usuário existe e ele retorna true;
Caso o div retorne vazio (sem dados) ele retorna false;
Depois ele exibe uma message box com o resultado da busca do perfil.

Bem.. Espero que eu tenha ajudado de alguma forma.
EDULOCO 05/11/2012 12:19:32
#413500
Opa Pegudo tudo bem?

Sim, a página pelo webbrowser dá um erro no carregamento, para fixar temporariamente isso eu desativeis as msg[ô]s de erro do webbrowser, como estou no trabalho e esse é um trabalho pessoal meu eu não tenho ele aqui, chegando na minha casa eu tento a sua ideia, mas é basicamente isso que vou precisar, um teste primário para ver se os dados foram carregados, e se der certo vou conseguir suprir dois erros com essa ideia sua, uma que é o caso do personagem não existir e outra se por algum motivo a página apresentar alguma falha no carregamento, com isso informo em um msgbox o erro.

Obrigado Pegudo. Depois te dou um retorno de como está!
PEGUDO 05/11/2012 12:57:03
#413514
Ok, mas atente para uma coisa:
Eu não tratei erros diferentes no caso do usuário existir ou não.

Para tal você deve fazer da seguinte maneira:
Colocar a resposta entre o TRY

Dim Tentar as Byte = 0
Dim QualErro As String = Nothing

Req.TimeOut = 3000 [txt-color=#007100][ô]Tempo de conexão de 3 segundos no máximo[/txt-color]

Tentativa:
Try
Resposta = Req.GetResponse
Catch ex As Exception
If Tentar = 3 Then [txt-color=#007100][ô]Tenta carregar a página 3 vezes[/txt-color]
Tentar += 1 [txt-color=#007100][ô]Incrementa variável[/txt-color]
GoTo Tentativa [txt-color=#007100][ô]Retorna e tenta acessar a página de novo[/txt-color]
Else
[txt-color=#007100][ô]Pega a mensagem de erro aqui e sai da Função[/txt-color]
QualErro = ex.Message
ExistePerfil = False
Exit Function
End If

End Try


Desta forma, qualquer erro, seja de tempo excedido, Erro interno do servidor, etc... poderá ser pego, sair da função e exibir este erro para o usuário.
Eu faço assim porque aqui na empresa sempre tenho este problema de tempo excedido da conexão, então eu ponho um exception e evito que o programa pare.
Claro que este tratamento de erro pode ser melhorado, mas já dá uma idéia do que fazer.

Abraços.
Tópico encerrado , respostas não são mais permitidas