Este fórum está sendo desativado

Depois de 9 anos, este fórum será desativado. Mas calma.... estamos migrando para uma comunidade no DISCORD. Junte-se a nós.

ENTRAR PARA DISCORD

Tópicos relacionados a códigos VBA, gravação de macros, etc.
  • Avatar do usuário
  • Avatar do usuário
  • Avatar do usuário
#18404
Galera bom dia,

Estou com o seguinte problema. Entro num Sistema Web aqui da empresa e preciso extrair inúmeros relatórios, então pensei em automatizar a extração de informação com VBA.
Como informei a página é em HTML, até ai tudo bem...
O problema é que nesta página há 3 controles DropDowns em JavaScript e os comandos '.selected' não funcionam.

Utilizei o comando abaixo para percorer todos os TagName "Span" e alterar o Value dele, visualmente na tela ele mostra os nomes corretos que deveria selecionar, porém qdo mando gerar o relatório ele diz que o campo é de preenchimento obrigatório, ou seja, ele não aceitou a seleção (não aceita que se force um nome dentro do DropDown).
Código: Selecionar todos
For Each OBJ_Master In IE.Document.getElementsByTagName("span")
    If OBJ_Master.innerText Like "Selecione" Then
       OBJ_Master.innerText = "CDL CUIABA"
       Exit For
    End If
Next OBJ_Master
Alguem tem algum outro modo de manipular este tipo de controle?

Abaixo o Código do HTML:
Imagem

Abaixo meu código:
Código: Selecionar todos
Sub Consulta_SGC2()
Dim IE As InternetExplorer
Dim Endereço As String

'Abrindo e logando no SGC2
Endereço = "https://sgc2.redetempo.com.br/report_associate_bills/new"
Set IE = CreateObject("InternetExplorer.Application")
IE.Navigate (Endereço)
'IE.Visible = True

While IE.ReadyState <> 4
Wend

SGC2.Show

On Error Resume Next
IE.Document.all("user_login").innerText = SGC2.TX_User.Text
IE.Document.all("user_password").innerText = SGC2.TX_PassWord.Text

For Each Button In IE.Document.getElementsByTagName("input")
   Button.Click
Next


While IE.ReadyState <> 4
Wend

IE.Visible = True

'############################################################################################
'Até este ponto tudo funciona 100%
'Comando abaixo demonstra todos os itens dentro do DropDown.
'IE.Document.all.Item("report_master").outerHTML

Application.Wait DateAdd("s", 5, Now)

For Each OBJ_Master In IE.Document.getElementsByTagName("span")
    If OBJ_Master.innerText Like "Selecione" Then
       OBJ_Master.innerText = "CDL CUIABA"
       Exit For
    End If
Next OBJ_Master

Application.Wait DateAdd("s", 1, Now)

For Each OBJ_Distribuidor In IE.Document.getElementsByTagName("span")
    If OBJ_Distribuidor.innerText Like "Selecione" Then
       OBJ_Distribuidor.innerText = "CDL ALTA FLORESTA"
       Exit For
    End If
Next OBJ_Distribuidor

Application.Wait DateAdd("s", 1, Now)

For Each OBJ_Mes In IE.Document.getElementsByTagName("span")
    If OBJ_Mes.innerText Like "Selecione" Then
       OBJ_Mes.innerText = "Dezembro/2016"
       Exit For
    End If
Next OBJ_Mes

Application.Wait DateAdd("s", 1, Now)

For Each Button In IE.Document.getElementsByTagName("button")
   Button.Click
Next

IE.Visible = True



Unload SGC2
End Sub

#18467
DJunqueira

Sim, deixei a busca pelo nome pois foi uma das opções que tentei.
Nesta opção que apresentei acima , o campo aparece o nome da opção que seleciono, mais qdo clico na opção de gerar o relatório ele acusa um erro dizendo que o campo é obrigatório.

Pesquisei aqui e percebi que esta controle não é um simples ListBox HTML e sim um DropDown JavaScript que é preenchido em cadeia, tipo, apenas com a seleção correta do 1º DropDown é que habilita as opções no 2º DropDown...

Obrigado pela atenção... Continuo buscando uma solução!!!
:) :)
#18494
DJunqueira
Eu andei vendo mesmo alguns materiais sobre o Selenium VBA... O problema que percebi nele é que é necessário instalar a Biblioteca do Selenium Wrapper... Como estou utilizando o VBA para criar uma aplicação que será usada por diversos usuários aqui da empresa, se tornaria inviável a utilização do Selenium, uma vez que a TI não instalaria esta aplicação em todos os PC's. :|
Avatar do usuário
Por Mikel
Posts Avatar
#18513
Boa noite a todos.

Wesley, uma pergunta sobre a página que esta acessoando. Vi que na mesma existem 2 Select´s (DropDown/ComboBox). Por acaso eles funcionam em cadeia, ou seja, conforme opção selecionada no primeiro, as opções do segundo se alteram?

Se isso ocorre, você consegue avaliar se é utilizado alguma função de jQuery na página?

Estou fazendo essas perguntas, pois já trabalhei com situações dessas, onde o Microsoft Internet Control não conseguiu resolver o problema, devido as limitações do próprio navegador. Mas, a mesma situação, foi resolvida sem problemas, utilizando o Selenium VBA (tanto versão Wrapper, como a Basic).

Fico no aguardo da sua resposta.
Avatar do usuário
Por Mikel
Posts Avatar
#18517
Boa noite a todos.

DJunqueira, assim você me deixa :oops: . Valeu pelo elogio.

Aprendi a manipular essas duas bibliotecas por curiosidade e ajudando o povo do Fórum do Tómas, mas nunca utilizei de forma efetiva no meu dia a dia... rs.

Outro ponto que ajuda muito, são meus estudos de Desenvolvimento Web (JS, Ajax, Html, Css, Php, etc). Sempre estou tentando aprender algo novo, principalmente todas as variações de JS e Xml.

Bem, agora estou terminando meu ano bem!!!!

A propósito: FELIZ ANO NOVO pra todos do Fórum. Que DEUS abençoe a vida de todos e de suas famílias.
#19976
Mikel escreveu:Boa noite a todos.

Wesley, uma pergunta sobre a página que esta acessoando. Vi que na mesma existem 2 Select´s (DropDown/ComboBox). Por acaso eles funcionam em cadeia, ou seja, conforme opção selecionada no primeiro, as opções do segundo se alteram?

Se isso ocorre, você consegue avaliar se é utilizado alguma função de jQuery na página?

Estou fazendo essas perguntas, pois já trabalhei com situações dessas, onde o Microsoft Internet Control não conseguiu resolver o problema, devido as limitações do próprio navegador. Mas, a mesma situação, foi resolvida sem problemas, utilizando o Selenium VBA (tanto versão Wrapper, como a Basic).

Fico no aguardo da sua resposta.
Mikel,

Bem cara, sim a página que estou analisando possui JQuery. E como dito, eles funcionam sim em cadeia, apenas com a seleção do primeiro que é possível ver as opções do segundo.

Gostaria de achar uma solução que não fosse a utilização do Selenium, uma vez que esta Macro deve rodar em outros PC's de outros usuários e o pessoal aqui da empresa não faria a instalação da ferramenta em todas as possíveis máquinas que fossem utilizar.

Continuo no aguardo de uma solução.
Por jorrobeh
#43572
Olá Wesley,
Vi que sua dúvida é antiga, mas como passei pela mesma dificuldade e seu tópico me deu uma luz, resolvi retornar aqui e compartilhar a solução que encontrei pra, quem sabe, ajudar você e aqueles que, assim como eu, caiam aqui após buscas no google.

Meu problema foi parecido com o seu. Eu preciso selecionar um item numa lista, que habilita um botão para efetivar a alteração. Eles também funcionam em cadeia, ou seja, o botão só habilita depois de selecionado o item na lista.
O código do site utiliza java e eu também fiquei na mão do InternetControls, assim como você, pois não consegui fazer rodar o selenium .

Abaixo está o código do site, com a lista e o botão:
Código: Selecionar todos
 <div class="box-content">
        <div class="row">
          <div class="col-md-9 col-sm-8">
            <div class="custom-box">
              <form id="frm-alterar-situacao" class="form-inline form-default" method="post" action="//app.lojaintegrada.com.br/painel/pedido/1630/alterar_situacao">
                <input id="situacao-mensagem" name="mensagem" value="" type="hidden">
                <div class="form-group">
                  <label class="control-label" for="situacao_id">Situação do pedido:</label>
                  <select id="situacao_id" class="form-control" name="situacao_id">
                    
                      <option style="background-color: rgb(199, 227, 255);" value="8" data-notificar="True">Pedido Cancelado</option>
                    
                      <option style="background-color: rgb(199, 227, 255);" value="9" data-notificar="False">Pedido Efetuado</option>
                    
                      <option style="background-color: rgb(199, 227, 255);" value="14" data-notificar="True">Pedido Entregue</option>
                    
                      <option style="background-color: rgb(199, 227, 255);" value="11" data-notificar="True">Pedido Enviado</option>
                    
                      <option style="background-color: rgb(199, 227, 255);" selected="selected" value="4" data-notificar="True">Pedido Pago</option>
                    
                      <option style="background-color: rgb(216, 236, 255);" value="17" data-notificar="True">Em produção</option>
                    
                      <option style="background-color: rgb(216, 236, 255);" value="15" data-notificar="True">Pedido em separação</option>
                    
                      <option style="background-color: rgb(216, 236, 255);" value="13" data-notificar="True">Pedido pronto para retirada</option>
                    
                      <option style="background-color: rgb(231, 243, 254);" value="2" data-notificar="True">Aguardando pagamento</option>
                    
                      <option style="background-color: rgb(231, 243, 254);" value="7" data-notificar="True">Pagamento devolvido</option>
                    
                      <option style="background-color: rgb(231, 243, 254);" value="3" data-notificar="True">Pagamento em análise</option>
                    
                      <option style="background-color: rgb(231, 243, 254);" value="16" data-notificar="False">Pagamento em chargeback</option>
                    
                      <option style="background-color: rgb(231, 243, 254);" value="6" data-notificar="False">Pagamento em disputa</option>
                    
                  </select>

                    <!-- Split button -->
                    <div class="btn-group">
                      <button class="btn btn-danger btn-alterar-sem-observacao" disabled="disabled" onclick="$('#frm-alterar-situacao').submit();" type="button">Alterar</button>
                      <button aria-haspopup="true" aria-expanded="false" class="btn btn-danger dropdown-toggle" disabled="disabled" type="button" data-toggle="dropdown">
                        <span style="margin: 8px 0px;" class="caret"></span>
                        <span class="sr-only">Opções</span>
                      </button>
                      <ul class="dropdown-menu">
                        <li class="alterar-sem-observacao"><a href="javascript:;">Alterar status</a></li>
                        <li class="alterar-com-observacao"><a href="javascript:;">Alterar e enviar comentário para cliente por e-mail</a></li>
                      </ul>
                    </div>

                </div>

              </form>
              
            </div>
          </div>

E a solução que encontrei, usando InternetControls no VBA:
Código: Selecionar todos
    Dim HTMLdoc As HTMLDocument
    Dim selectElement As HTMLSelectElement
    Dim evtChange As Object
    
            Set HTMLdoc = IE.Document
            Set evtChange = HTMLdoc.createEvent("HTMLEvents")
            evtChange.initEvent "change", True, False
            Set selectElement = HTMLdoc.getElementById("situacao_id")	'dentro do parenteses vai o 'select id'
            selectElement.Value = "14" 'Pedido Entregue 			'value é o item desejado na lista
            selectElement.dispatchEvent evtChange
      .Document.GetElementsByClassName("btn-alterar-sem-observacao")(0).Click	'click do botão já habilitado
Não esqueça de referenciar a biblioteca 'Microsoft HTML Object Library' no VBA

Espero ter ajudado de alguma forma.
Grande abraço!
Por hjamaral
#52800
Estou procurando a tempo a resposta para meu problema. Queria apenas clicar em um botão <button> sem "submit" e não conseguia achar como fazer. Após procurar muito e não encontrar nada descobri no seu código o problema da minha implementação. Eu não estava usando "(0)" no comando".click". Tão simples e estava sendo quase impossível achar uma resposta... Muito obrigado e passar bem!
long long title how many chars? lets see 123 ok more? yes 60

We have created lots of YouTube videos just so you can achieve [...]

Another post test yes yes yes or no, maybe ni? :-/

The best flat phpBB theme around. Period. Fine craftmanship and [...]

Do you need a super MOD? Well here it is. chew on this

All you need is right here. Content tag, SEO, listing, Pizza and spaghetti [...]

Lasagna on me this time ok? I got plenty of cash

this should be fantastic. but what about links,images, bbcodes etc etc? [...]

Estamos migrando para uma comunidade no Discord