2
respostas

Acessar Elementos na Pagina

Preciso da ajuda de vocês, estou fazendo um projeto, masestou tendo dificuldades ao acessar elmentos.

Wait<WebDriver> wait = new WebDriverWait(navegador, Duration.ofSeconds(90));
               
                 navegador.navigate().refresh();
                 navegador.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
                WebElement matricula = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("/html/body/form/table[3]/tbody/tr/td[2]/table[4]/tbody/tr[1]/td/table/tbody/tr[2]/td/table/tbody/tr[3]/td[2]/a")));
                wait.until(d -> matricula.isDisplayed());
                String txtMatricula = matricula.getDomAttribute("value");
                System.out.println(matricula.getText());  

Eu criei um loop para capturar dados de uma tela, informando o código do cliente a cada loop. Mas ele começa bem e para por dar um erro informando que não encontra o elemento (matricula), só que ele já tinah encontrado o mesmo elemento no loop anterior. Eu tentei colcoar um WebDriverWait, e após que eu cooquei até que conseguiu me retornar mais loops, porém ainda dava o erro de não encontrar o elemento. Depois coloquei o implicitlyWait, que também acho que aumentou um pouco mais. Ai decidir colocar o navegador.navigate().refresh(); , ai realmente funcionou ele consegue completar todo o loop, retornando os dados.

A minha questão é , qual a maneira correta de eu capturar um elemento, sem ter que usar isso tudo, fazendo com que meu código aguarde aquele elemento realmente fica disponivel na tela para que eu possa capturar ele. Pois acho que esse código não está bom, tenho certeza que existe uma boa prática ai, para tornar meu código mais enxuto e eficiente.

Obs: as vezes até acessar uma página ele nao avança como no código abaixo:

navegador.get("http://gsan.caema.ma.gov.br:8080/gsan/exibirFiltrarExcecoesLeiturasConsumosAction.do?nomeCaminhoMapping=efetuarAnaliseExcecoesLeiturasConsumos&menu=sim");

Ai gera um erro porque na próxima tela tenho que captuar um elemento, e a tela não abriu.

Obs: retirei a linha d ecódigo abaixo e fucnionou normalmente , completando todo o loop.

navegador.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));

Mas como falei, tenho certeza que existe uma maneira de de ter um código mais enxuto e eficaz.

Percebi uma coisa! Nesse método que estou usando as vezes ele pula 1 registro, ele tá no registro 2 e pula para o 4,tá no 25 pula para o 27. Mas a vezes é sequencial. Pode ser por causa do refresh?

2 respostas

Boa tarde, João.

O problema ocorre porque implicitlyWait pode interferir nos tempos de espera explícitos e porque refresh() pode fazer o Selenium perder referências a elementos antigos. Remova implicitlyWait e use apenas WebDriverWait com presenceOfElementLocated, fazer isso garante que a página carregue completamente antes de capturar elementos. Se os registros estiverem sendo pulados, pode ser que a página ainda não tenha atualizado corretamente. Use wait.until(ExpectedConditions.stalenessOf(antigoElemento)) antes de buscar um novo elemento para evitar problemas com atualizações dinâmicas no DOM.

Obrigado pela atenção, gostaria se uso o presenceOfElementLocated desta forma

Wait<WebDriver> wait = new WebDriverWait(navegador, Duration.ofSeconds(30));
WebElement matricula = wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("/html/body/form/table[3]/tbody/tr/td[2]/table[4]/tbody/tr[1]/td/table/tbody/tr[2]/td/table/tbody/tr[3]/td[2]/a")));
 wait.until(d -> matricula.isDisplayed());

E como e onde usaria o ExpectedConditions.stalenessOf abaixo é meu código:

public void relacionarIconistidos(DadosConsistencia dadosConsistencia) {
        telas.iniciarTelaConsitencia(navegador, dadosConsistencia, lst);
        List<DadosArquivoConsistencia> matriculas = new ArrayList<>();
        lst.getForm().getTxtAreaConsistencia().setText("");       

        WebElement totalMatricuals =      navegador.findElement(By.xpath("/html/body/form/table[3]/tbody/tr/td[2]/table[4]/tbody/tr[1]/td/table/tbody/tr[7]/td/table/tbody/tr/td[2]"));
        String qtdMatriculas = totalMatricuals.getText();

        String[] dados = qtdMatriculas.split("/");

        int total = Integer.valueOf(dados[1].trim());      

        try {

            for (int i = 0; i <= total; i++) {
                
                Wait<WebDriver> wait = new WebDriverWait(navegador, Duration.ofSeconds(30));
                             
                DadosArquivoConsistencia aconsistencia = new DadosArquivoConsistencia();                 
                
                WebElement matricula = wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("/html/body/form/table[3]/tbody/tr/td[2]/table[4]/tbody/tr[1]/td/table/tbody/tr[2]/td/table/tbody/tr[3]/td[2]/a")));
                wait.until(d -> matricula.isDisplayed());
                String txtMatricula = matricula.getDomAttribute("value");
                System.out.println(matricula.getText());  
                
                WebElement rota = navegador.findElement(By.xpath("/html/body/form/table[3]/tbody/tr/td[2]/table[4]/tbody/tr[1]/td/table/tbody/tr[2]/td/table/tbody/tr[4]/td/table/tbody/tr[2]/td[8]"));
                String txtRota = rota.getText();

                WebElement consumo = navegador.findElement(By.name("medido"));
                String txtConsumo = consumo.getDomAttribute("value");

                WebElement anormalidadeConsumo = navegador.findElement(By.name("consumoAnormalidadeAbreviada"));
                String txtAnormalidadeConsumo = anormalidadeConsumo.getDomAttribute("value");

                WebElement anormalidadeLeitura = navegador.findElement(By.name("descricaoAnormalidade"));
                String txtAnormalidadeLeitura = anormalidadeLeitura.getDomAttribute("value");

                WebElement sequencia = navegador.findElement(By.xpath("/html/body/form/table[3]/tbody/tr/td[2]/table[4]/tbody/tr[1]/td/table/tbody/tr[2]/td/table/tbody/tr[4]/td/table/tbody/tr[2]/td[9]"));
                String txtSequencia = sequencia.getText();

                String rt = txtRota;
                String sq = txtSequencia;

                aconsistencia.setMatricula(txtMatricula);
                aconsistencia.setRota(rt);
                aconsistencia.setSequencia(sq);
                aconsistencia.setSituacao("");

                aconsistencia.setConsumo(Integer.parseInt("".equals(txtConsumo) ? "0" : txtConsumo));
                aconsistencia.setAnormalidade(txtAnormalidadeLeitura);
                aconsistencia.setAnormalidadeConsumo(txtAnormalidadeConsumo);
                aconsistencia.setLeituraAnterior(0);
                aconsistencia.setLeituraAtual(0);

                matriculas.add(aconsistencia);

                lst.getForm().getTxtAreaConsistencia().append(txtMatricula + ";" + rt + ";" + sq);
                lst.getForm().getTxtAreaConsistencia().append("\n");               
               
                
                WebElement botao = navegador.findElement((By.xpath("/html/body/form/table[3]/tbody/tr/td[2]/table[4]/tbody/tr[2]/td/table/tbody/tr/td[3]/table/tbody/tr/td/table/tbody/tr/td[2]/table/tbody/tr/td[1]/input")));
                
                               
                botao.click();                

            }
            
            
            

O botao.click atualiza o formulário com os dados do próximo cliente. As aulas não explicam certos pontos detalhadamente e as vezes empacamos ao desevolver nosso próprio projeto.

Essa sua resposta vai me ajudar muito, pois trabalho em uma empresa que toma muito meu tempo sem uma automação como essa, e estou de olho em uma promoção, e com esse projeto tenho certeza que conseguirei, pois irá aumentar muito minha produtividade.