Vídeo recomendado
https://youtu.be/diWPPPhW-9E

Clicar em um element XPath - Selenium/VBA

A Web está aí, não há como negar. Ela é onipresente em praticamente toda operação eletrônica realizada nos dias de hoje. Como não podia ser diferente, o Excel, ferramenta máxima para analistas e profissionais das mais diversas áreas do mercado precisa estar alinhado com esta necesssidade. E ele está! Neste forum, o debate é focado em expor dúvidas, sugestões, modelos de código e exemplos de uso do Excel na Integração com tecnologias Web.
gustavosarturi
Acabou de chegar
Acabou de chegar
Mensagens: 4
Registrado em: Qua Set 23, 2020 11:25 am

Clicar em um element XPath - Selenium/VBA

Mensagem por gustavosarturi »

Olá, bom dia!

Eu estou tentando fazer uma macro e preciso que ela clique em um elemento.
O código abaixo detecta 2 elementos, porém, eu gostaria de clicar no primeiro. Alguém tem ideia de como proceder?

Debug.Print .FindElementsByXPath("//a[contains(@href,'IN_PRECED=')]").Count


Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


Avatar do usuário
webmaster
Administrador
Mensagens: 3114
Registrado em: Sex Jul 24, 2009 2:44 pm
Contato:

Re: Clicar em um element XPath - Selenium/VBA

Mensagem por webmaster »

Qual o HTML? Pode colocar o bloco aqui?

Às vezes o elemento não é clicável. Tente forçar o clique via javascript no próprio navegador e veja se funciona.

No Chrome, selecione o elemento, abra o console e digite: $0.click()


gustavosarturi
Acabou de chegar
Acabou de chegar
Mensagens: 4
Registrado em: Qua Set 23, 2020 11:25 am

Re: Clicar em um element XPath - Selenium/VBA

Mensagem por gustavosarturi »

Oi Tomas!

Segue a parte do codigo de interesse:

<a href="/gpi/suivi/jsp/lstSynRetardAppro.jsp?IN_CD_FOUR=&amp;IN_ADR_FOUR=&amp;IN_BL=&amp;IN_REFER=&amp;IN_CONTENEUR=&amp;IN_CD_TGP=&amp;IN_IT=&amp;IN_ORD_TRI=P&amp;IN_ID_BP=AMO&amp;IN_SUIVANT=135060703R0062067900900180+++++0000000000000000000000000000002060.12.31.23.59.59&amp;IN_PRECED=">
<img src="../../communs/images/btnSuivante.gif" border="0" alt="Page suivante" align="right">
</a>

Existem 2 elementos com o mesmo link, mas gostaria de clicar no primeiro.


gustavosarturi
Acabou de chegar
Acabou de chegar
Mensagens: 4
Registrado em: Qua Set 23, 2020 11:25 am

Re: Clicar em um element XPath - Selenium/VBA

Mensagem por gustavosarturi »

Usei o "$0.click()" como você indicou no console, deu certo. Mas como trazer isso pro Selenium no VBA?


Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


Raygsson
Manda bem
Manda bem
Mensagens: 118
Registrado em: Sex Jan 31, 2020 8:06 pm

Re: Clicar em um element XPath - Selenium/VBA

Mensagem por Raygsson »

Gustavo
Tente fazer assim:

Código: Selecionar todos

.FindElementsByXPath("//a[contains(@href,'IN_PRECED=')]").item(1).click
Att,
Raygsson


gustavosarturi
Acabou de chegar
Acabou de chegar
Mensagens: 4
Registrado em: Qua Set 23, 2020 11:25 am

Re: Clicar em um element XPath - Selenium/VBA

Mensagem por gustavosarturi »

Oi Raygsson,

Apareceu isso um "Runtime error 0" element not interactable: element has zero size :(


Raygsson
Manda bem
Manda bem
Mensagens: 118
Registrado em: Sex Jan 31, 2020 8:06 pm

Re: Clicar em um element XPath - Selenium/VBA

Mensagem por Raygsson »

Qual o site que vc quer manipular? Fica bem mais fácil acessando e analisando.


coelho84
Acabou de chegar
Acabou de chegar
Mensagens: 2
Registrado em: Ter Fev 02, 2021 11:44 am

Re: Clicar em um element XPath - Selenium/VBA

Mensagem por coelho84 »

Raygsson escreveu: Qua Set 23, 2020 3:00 pm Gustavo
Tente fazer assim:

Código: Selecionar todos

.FindElementsByXPath("//a[contains(@href,'IN_PRECED=')]").item(1).click
Att,
Raygsson
Muito bom @Raygsson, este tópico já ajudou muito e me fez avançar no meu projeto!

Para não criar um outro tópico pois a dúvida é semelhante ao do colega, que a dica resolveu, mas esbarrei em outra dificuldade e gostaria de saber se conseguem me ajudar por aqui, ou se preciso criar um novo tópico!

Basicamente, estou montando um sistema para fazer o backup de chamadas gravadas no JIVE!

Consegui logar no sistema, navegar até o usuário no dia que pretendo, e lá tenho uma tabela com as ligações e um botão para ouvir/baixar a gravação, que clica com a dica acima e ele abre um elemento, que tem o botão de play e download, repeti a ideia do botão de download e funcionou também, agora eu preciso partir para os demais downloads da tabela e ai enfrentei dificuldade.

Pois bem, como disse ele abre um elemento contendo o player e download:

PASSOS 01 E 02:

Imagem

Imagem

E para fechar este elemento do Player/Download eu clico om outra parte do site, PASSO 03 assim repeti o processo usando outro XPath mas não deu certo, dá erro 0

Imagem

Segue um trecho do código que estou fazendo:

Código: Selecionar todos

navegar.Get ("https://my.jive.com/cr/vedichindusbr/user-activity/809d452c-54d5-4ec8-894d-0a8a110278fe?userId=809d452c-54d5-4ec8-894d-0a8a110278fe&&start=2021-02-01T00:00:00&end=2021-02-01T23:59:59&tz=America%2FSao_Paulo")

'01 - Abre o Player para fazer o download do arquivo 1
navegar.FindElementsByXPath("//mat-cell[9]/mat-icon").Item(1).Click

'02 - Clica em download do arquivo 1
navegar.FindElementsByXPath("//cr-recordings-download/div/mat-icon").Item(1).Click

'03 - Clica fora para fechar o elemento do player/download
navegar.FindElementsByXPath("//cr-root/div").Item(1).Click

'04 - Abre o Player para fazer o download do arquivo 2
navegar.FindElementsByXPath("//mat-row[2]/mat-cell[9]/mat-icon").Item(1).Click

'05 - Clica em download do arquivo 2
navegar.FindElementsByXPath("//cr-recordings-download/div/mat-icon").Item(1).Click
Até já pensei numa alternativa de contornar isso e que resolveu, tendo que reabrir a página, mas tornaria mais lento o processo, gostaria de tentar e aprender a como resolver este problema ou entender onde estou errado!

Aproveitando se for possível, mas duas dúvidas...

A primeira seria a manipulação do download do arquivo, é possível manipular?
Quando digo manipular, seria, consigo definir parâmetro de onde vai salvar este download?
É possível definir o nome do arquivo que está baixando?
Se tiver como e puderem me dar uma luz para que possa estudar!

E a outra dúvida é com relação a estes downloads ai, precisarei montar um loop pegando todos os downloads a serem feitos, pelo que vi o XPath seguirá este padrão para cada linha que tiver download disponível...

Código: Selecionar todos

navegar.FindElementsByXPath("//mat-row[2]/mat-cell[9]/mat-icon").Item(1).Click
navegar.FindElementsByXPath("//mat-row[3]/mat-cell[9]/mat-icon").Item(1).Click
navegar.FindElementsByXPath("//mat-row[5]/mat-cell[9]/mat-icon").Item(1).Click
navegar.FindElementsByXPath("//mat-row[9]/mat-cell[9]/mat-icon").Item(1).Click
Existe alguma forma de eu ler o fonte e conseguir pegar quais as //mat-row[X] devo clicar?
Ou alguma condição para validar se existe a //mat-row[4] por exemplo, não existindo não clica?

Ufa :lol:

Acho que é isso, desde já agradeço pela atenção!


Raygsson
Manda bem
Manda bem
Mensagens: 118
Registrado em: Sex Jan 31, 2020 8:06 pm

Re: Clicar em um element XPath - Selenium/VBA

Mensagem por Raygsson »

Opa, bom dia. São muitas perguntas rs
Esse print de erro que mostrou é porque está tentando clicar num elemento que não está acessível, este elemento existe, porém pode estar "por baixo" de outro ou pode estar desabilitado esperando outra ação antes, tente achar o elemento que está algumas linhas acima no HTML, pode ser uma tag "img" ou outra qualquer.
Quanto ao diretório pra download, tem que ajustar o "SetPreference", veja este vídeo https://youtu.be/2BYeh1-0zU0 . Não sei se é possível renomear o arquivo de donwload nativamente com Selenium, vale você pesquisar. Talvez consiga com VBA puro, verificar se existe o arquivo na pasta do download e renomea-lo. Veja se consegue esses ajustes por enquanto...


coelho84
Acabou de chegar
Acabou de chegar
Mensagens: 2
Registrado em: Ter Fev 02, 2021 11:44 am

Re: Clicar em um element XPath - Selenium/VBA

Mensagem por coelho84 »

Raygsson escreveu: Qua Fev 03, 2021 12:12 pm Opa, bom dia. São muitas perguntas rs
Esse print de erro que mostrou é porque está tentando clicar num elemento que não está acessível, este elemento existe, porém pode estar "por baixo" de outro ou pode estar desabilitado esperando outra ação antes, tente achar o elemento que está algumas linhas acima no HTML, pode ser uma tag "img" ou outra qualquer.
Quanto ao diretório pra download, tem que ajustar o "SetPreference", veja este vídeo https://youtu.be/2BYeh1-0zU0 . Não sei se é possível renomear o arquivo de donwload nativamente com Selenium, vale você pesquisar. Talvez consiga com VBA puro, verificar se existe o arquivo na pasta do download e renomea-lo. Veja se consegue esses ajustes por enquanto...
Obrigado pela ajuda...

Eu havia deduzido algo assim, qualquer gerência que peguei acima da posição não funcionou, todos retornaram erro 0

O Código fonte mesmo da página é só isso:

Código: Selecionar todos

<!doctype html>
<html>
<head>
  <meta charset="utf-8">
  <title>Call Reports</title>
  <base href="/cr/">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="icon" type="image/x-icon" href="">
  <link href="https://fonts.googleapis.com/icon?family=Material+Icons"
      rel="stylesheet">

  <!-- TypeKit fonts -->
  <script src="https://use.typekit.net/brf5com.js"></script>
  <script>try{Typekit.load({ async: true });}catch(e){}</script>

  <script src="https://d3js.org/d3.v4.min.js"></script>
  <script src="env.js"></script>
<link rel="stylesheet" href="styles.ba428b4a170d631a84d3.css"></head>
<body class="app jive-ui">
  <cr-app-root>Loading…</cr-app-root>

<!-- Used by login procedure to insert login controls -->
<div id="jiveSdk" class="text-center" style="width: 100%;"></div>

<script src="runtime.c51bd5b1c616d9ffddc1.js" defer></script><script src="polyfills-es5.ff9ff81b6d2b265cb32e.js" nomodule defer></script><script src="scripts.0f7416a5c047fc06a84f.js" defer></script><script src="main.307bc09454d2f752d093.js" defer></script></body>
</html>
Consegui fazendo um esc, que por sua vez fecha o elemento e dai em diante seguiu a rotina e funcionou :D

Código: Selecionar todos

navegar.SendKeys (Keys.Escape)
Agora se tiver como me dar uma luz na questão de fazer um loop para que ele possa ou ler o fonte e tentar achar todos as XPath("//mat-row[X]/mat-cell[9]/mat-icon")
Ou se tem como fazer uma condição para saber se ela existe antes de clicar!


Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


Responder