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?