Página 1 de 2

Clicar em um element XPath - Selenium/VBA

Enviado: Qua Set 23, 2020 11:48 am
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

Re: Clicar em um element XPath - Selenium/VBA

Enviado: Qua Set 23, 2020 11:56 am
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()

Re: Clicar em um element XPath - Selenium/VBA

Enviado: Qua Set 23, 2020 1:14 pm
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.

Re: Clicar em um element XPath - Selenium/VBA

Enviado: Qua Set 23, 2020 1:33 pm
por gustavosarturi
Usei o "$0.click()" como você indicou no console, deu certo. Mas como trazer isso pro Selenium no VBA?

Re: Clicar em um element XPath - Selenium/VBA

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

Código: Selecionar todos

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

Re: Clicar em um element XPath - Selenium/VBA

Enviado: Qua Set 23, 2020 4:55 pm
por gustavosarturi
Oi Raygsson,

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

Re: Clicar em um element XPath - Selenium/VBA

Enviado: Qua Set 23, 2020 5:17 pm
por Raygsson
Qual o site que vc quer manipular? Fica bem mais fácil acessando e analisando.

Re: Clicar em um element XPath - Selenium/VBA

Enviado: Qua Fev 03, 2021 11:33 am
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!

Re: Clicar em um element XPath - Selenium/VBA

Enviado: Qua Fev 03, 2021 12:12 pm
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...

Re: Clicar em um element XPath - Selenium/VBA

Enviado: Qua Fev 03, 2021 3:25 pm
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!