Usuário com melhor resposta
Simular um clique em uma pagina web

Pergunta
-
Boa noite a todos.
Eu criei um projeto que faz a leitura dos andamentos de um processo no site do TJSP, mas estou com uma problema, na pagina que estou carregando, aparece somente as últimos 5 andamentos e eu preciso de todos.
Exemplo
http://esaj.tjsp.jus.br/cpo/pg/search.do?conversationId=&paginaConsulta=1&localPesquisa.cdLocal=-1&cbPesquisa=NUMPROC&tipoNuProcesso=UNIFICADO&numeroDigitoAnoUnificado=1021884-84.201&foroNumeroUnificado=0053&dePesquisaNuUnificado=1021884-84.2015.8.26.0053&dePesquisaNuAntigo=
Nessa pagina, tem uma ABA chamada Movimentações, e nela aparece somente os 5 últimos andamentos, porem quando clicar no link "Listar todas as movimentações", aparece todas as movimentações, eu preciso simular esse clique antes de ler o html da pagina no sistema, porque assim consigo ler todos as movimentações do processo.
Aqui esta o código onde faço a leitura no meu programa.
Dim wc As New WebClient Dim html As String = wc.DownloadString(url) Dim links As MatchCollection = Regex.Matches(html, "<td width=""120"" style=""vertical-align: top"">(.*?)</td>(.*?)<td style=""vertical-align: top; padding-bottom: 5px"" >(.*?)<br/>(.*?)<span style=""font-style: italic;"">(.*?)</span>", RegexOptions.Singleline) For Each match As Match In links Dim data As String = match.Groups(1).Value.Replace(vbCrLf, Nothing).Replace(" ", Nothing) Dim DataSistema As System.Object = "0000-00-00" If Not data = " / /" Then DataSistema = Format(CType(data, Date), "yyyy-MM-dd") End If Dim texto As String = vbTab & match.Groups(3).Value.Replace(vbTab, Nothing).Replace(vbCrLf, Nothing).Replace(" ", "").Replace("á", "á").Replace("ú", "ú").Replace("ç", "ç").Replace("ã", "ã").Replace("<a class=""linkMovVincProc"" title=""Visualizar documento em inteiro teor"" href=""#"" name=""M""", "").Replace("cdDocumento", "Documento").Replace(""">", " ").Replace("</a>", "").Replace("à", "à") & vbTab & match.Groups(5).Value.Replace("á", "á").Replace("ú", "ú").Replace("ç", "ç").Replace("ã", "ã").Replace("à", "à") texto = texto.Replace("'", "") objAndamentoIndividualBLL.SelecionarAndamento(DataSistema, texto, txtProcesso.Text, txtRf.Text, lblAcaoIndividual.Text) If (objAndamentoIndividualBLL.Verdadeiro = False) Then objAndamentoIndividualBLL.IncluirAndamentoProcesso(txtRf.Text, lblAcaoIndividual.Text, txtProcesso.Text, texto, texto, DataSistema, "00:00", "", "SISTEMA") End If Next
- Editado Pandox quarta-feira, 19 de agosto de 2015 01:23
Respostas
-
Como eu disse, a table está lá oculta e se olhar o código fonte da página mesmo sem clicar para exibir todos, no html você consegue ver todos os processos.
Te aconselho nesse caso não usar expressão regular em todo o texto e sim pegar o elemento pelo Id dele e lá dentro você faz a expressão ou foreach pelos elementos filhos.
Usando o componente Webbrowser pode fazer assim:
Private web As New WebBrowser
No load do formulário ou onde preferir adicione o evento de documento completo
AddHandler web.DocumentCompleted, AddressOf DocumentoCompleto
Método executado no evento para leitura do html após a conclusão do documento.
Private Sub DocumentoCompleto(sender As Object, e As WebBrowserDocumentCompletedEventArgs) Dim elemento As HtmlElement = web.Document.GetElementById("tabelaTodasMovimentacoes") Dim elementos As HtmlElementCollection = elemento.GetElementsByTagName("tr") For Each item As HtmlElement In elementos MessageBox.Show(item.OuterText) ' Somente exemplo para pegar todo o texto Next End Sub
E para carregar a página
web.Navigate("http://esaj.tjsp.jus.br/cpo/pg/search.do?conversationId=&paginaConsulta=1&localPesquisa.cdLocal=-1&cbPesquisa=NUMPROC&tipoNuProcesso=UNIFICADO&numeroDigitoAnoUnificado=1021884-84.201&foroNumeroUnificado=0053&dePesquisaNuUnificado=1021884-84.2015.8.26.0053&dePesquisaNuAntigo=")
Nesse exemplo ele lê tudo o que você precisa, ai é só manipular da forma que precisa.
Bruno Ferreira de Souza
MVP - Microsoft Valuable Professional
MCTS .NET Framework - Windows Applications
MCPD .NET Framework - Windows Applications
www.maestrodotnet.com.br
@BrunoMaestro- Sugerido como Resposta Marques Junior quarta-feira, 19 de agosto de 2015 19:49
- Marcado como Resposta Marcos SJ quinta-feira, 20 de agosto de 2015 15:16
Todas as Respostas
-
Usando a classe webbrowser poderia tentar assim:
WebBrowser1.Document.GetElementById("linkmovimentacoes").InvokeMember("click")
ou
For Each ele As HtmlElement In Webbrowser1.document.Links If ele.GetAttribute("href") = "o endereço do link aqui" Then ele.InvokeMember("click") End If Next
Bruno Ferreira de Souza
MVP - Microsoft Valuable Professional
MCTS .NET Framework - Windows Applications
MCPD .NET Framework - Windows Applications
www.maestrodotnet.com.br
@BrunoMaestro -
Dei uma olhada no link e tem duas tabelas, uma que mostra só as 5 e uma que fica oculta que mostra todos com o id tabelaTodasMovimentacoes, nesse caso bastaria você pegar todo o conteúdo somente da tabela tabelaTodasMovimentacoes que está oculta mas se você ver o código da página ela está lá com todos os dados.
Bruno Ferreira de Souza
MVP - Microsoft Valuable Professional
MCTS .NET Framework - Windows Applications
MCPD .NET Framework - Windows Applications
www.maestrodotnet.com.br
@BrunoMaestro -
Com esse código que coloquei, teoricamente deveria pegar as publicações ocultas, mas não esta pegando
Dim links As MatchCollection = Regex.Matches(html, "<td width=""120"" style=""vertical-align: top"">(.*?)</td>(.*?)<td style=""vertical-align: top; padding-bottom: 5px"" >(.*?)<br/>(.*?)<span style=""font-style: italic;"">(.*?)</span>", RegexOptions.Singleline)
-
Como o Bruno comentou o código fica oculto até ser solicitado que seja exibido. Quando o wc.DownloadString(url) do seu código faz o download do fonte da página só está lá os 5 primeiros itens, por isso a regex não cata todos os itens pois os itens restantes só ficam disponível quando clica em exibir.
Tem um pluing do firefox, LiveHTTPHeaders, que capta o header da página e acredito que você possa ver o link completo para exibir todas as movimentações:
http://livehttpheaders.mozdev.org/
- Editado Marques Junior quarta-feira, 19 de agosto de 2015 14:57
-
Como eu disse, a table está lá oculta e se olhar o código fonte da página mesmo sem clicar para exibir todos, no html você consegue ver todos os processos.
Te aconselho nesse caso não usar expressão regular em todo o texto e sim pegar o elemento pelo Id dele e lá dentro você faz a expressão ou foreach pelos elementos filhos.
Usando o componente Webbrowser pode fazer assim:
Private web As New WebBrowser
No load do formulário ou onde preferir adicione o evento de documento completo
AddHandler web.DocumentCompleted, AddressOf DocumentoCompleto
Método executado no evento para leitura do html após a conclusão do documento.
Private Sub DocumentoCompleto(sender As Object, e As WebBrowserDocumentCompletedEventArgs) Dim elemento As HtmlElement = web.Document.GetElementById("tabelaTodasMovimentacoes") Dim elementos As HtmlElementCollection = elemento.GetElementsByTagName("tr") For Each item As HtmlElement In elementos MessageBox.Show(item.OuterText) ' Somente exemplo para pegar todo o texto Next End Sub
E para carregar a página
web.Navigate("http://esaj.tjsp.jus.br/cpo/pg/search.do?conversationId=&paginaConsulta=1&localPesquisa.cdLocal=-1&cbPesquisa=NUMPROC&tipoNuProcesso=UNIFICADO&numeroDigitoAnoUnificado=1021884-84.201&foroNumeroUnificado=0053&dePesquisaNuUnificado=1021884-84.2015.8.26.0053&dePesquisaNuAntigo=")
Nesse exemplo ele lê tudo o que você precisa, ai é só manipular da forma que precisa.
Bruno Ferreira de Souza
MVP - Microsoft Valuable Professional
MCTS .NET Framework - Windows Applications
MCPD .NET Framework - Windows Applications
www.maestrodotnet.com.br
@BrunoMaestro- Sugerido como Resposta Marques Junior quarta-feira, 19 de agosto de 2015 19:49
- Marcado como Resposta Marcos SJ quinta-feira, 20 de agosto de 2015 15:16
-