Java. Listas não funcionando em uma estrutura de repetiçao

6 respostas
java
F

Estou usando o findElements do Selenium WebDriver pra fazer uma buscas em uma página.

Quando faço a busca simples, tudo funciona corretamente:

Ex:

List webElements  = driver.findElements(By.xpath("//* [contains(text(),‘Planned’) and @class=‘HistoryColumn0’]//following::td[1]"));

System.out.println("Story: "+ story.getId() + " Tamando da Lista: "+ webElements.size());

Tela

Story: 1626436 Tamando da Lista: 1 //Está correto. Só resultado da busca foi 1

O problema está quando eu preciso usar uma estrutura de repetição. Fica assim:

Ex:

for (Story story : stories) {

List webElements  = driver.findElements(By.xpath("//* [contains(text(),‘Planned’) and @class=‘HistoryColumn0’]//following::td[1]"));

System.out.println("Story: "+ story.getId() + " Tamando da Lista: "+ webElements.size());

}

Tela

Story: 1626436 Tamando da Lista: 1 //Está correto. Só resultado da busca foi 1
Story: 1626440 Tamando da Lista: 3 //Está Errado. Só resultado da busca deveria ter sido 2
Story: 1626447 Tamando da Lista: 5 //Está Errado. Só resultado da busca deveria ter sido 1

A minha suspeita era de que a lista webElements estava acumulando a lista anterior entao, tentei usar o metodo clear(), mas tb não funcionou. Ficou assim:

for (Story story : stories) {

List webElements  = driver.findElements(By.xpath("//* [contains(text(),‘Planned’) and @class=‘HistoryColumn0’]//following::td[1]"));

System.out.println("Story: "+ story.getId() + " Tamando da Lista: "+ webElements.size());

webElements.clear();

}

Tela

Story: 1626436 Tamando da Lista: 1 //Está correto. Só resultado da busca foi 1
Story: 1626440 Tamando da Lista: 3 //Está Errado. Só resultado da busca deveria ter sido 2
Story: 1626447 Tamando da Lista: 5 //Está Errado. Só resultado da busca deveria ter sido 1

Tb tentei fazer webElements = null mas o resultado foi o mesmo.

O que estou suspeitando agora é que a propria lista driver.findElements está acumulando a lista anterior mas, nessa caso, não sei como posso “limpa-la”.

Teria alguma dica?
Valeu!

6 Respostas

darlan_machado

Postar apenas parte do código acaba dificultando o entendimento.
Não temos como saber qual é o tipo de objeto que “driver” representa.
Assim sendo, não tenho como te falar nada além de que: sim, pode ser que esteja armazenando lixo de memória.

F

Opa @darlan_machado,
Foi mal. Ainda sou novo nesse lance de forum.
Segue o código. Veja se atente.
O trecho da carga da lista está no metodo executarRegrasDeNegocio.

<strong>Classe NavegadorDeBrowser</strong>

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.util.List;

import java.util.concurrent.TimeUnit;

import <a href="http://org.openqa.selenium.By">org.openqa.selenium.By</a>;

import org.openqa.selenium.JavascriptExecutor;

import org.openqa.selenium.WebDriver;

import org.openqa.selenium.WebElement;

import org.openqa.selenium.chrome.ChromeDriver;

import org.openqa.selenium.remote.DesiredCapabilities;

import org.openqa.selenium.remote.RemoteWebDriver;

import br.com.ibm.contadordeestoria.interfaces.ConfiguradorDeBrowser;

import br.com.ibm.contadordeestoria.leitor.CarregaStoriesDoXml;

import br.com.ibm.contadordeestoria.modelo.Iteracao;

import br.com.ibm.contadordeestoria.modelo.Story;

public class NavegadorDeBrowser {
Iteracao iteracao = new Iteracao(“Finanças - Squad Rio - Release 1/Finanças - Squad Rio - Iteration 2017-12”);

public static void abrirENavegar(List<Story> stories, ConfiguradorDeBrowser configurador) {
	configurador.executarConfiguracao();
	logar(configurador);
	acessarPaginaParaExecutarRegrasDeNegocio(configurador);	
	executarRegrasDeNegocio(configurador, stories);
	finalizarExecucao(configurador);	
	
}//fim do metodo AbrirENavegar

public static void logar(ConfiguradorDeBrowser configurador){
	configurador.getDriver().navigate().to("https://igartc03.swg.usma.ibm.com/jazz/web");
	configurador.getDriver().manage().window().maximize();
	configurador.getDriver().findElement(By.name("j_username")).sendKeys("xxxxxxxx");
	configurador.getDriver().findElement(By.name("j_password")).sendKeys("xxxxxxxx");
	configurador.getDriver().findElement(By.xpath("(//button[contains(text(),'Log In')])")).click();
}

private static void acessarPaginaParaExecutarRegrasDeNegocio(ConfiguradorDeBrowser configurador) {
	configurador.getDriver().manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
	configurador.getDriver().findElement(By.cssSelector("#jazz_ui_toolbar_Button_1 > a.button > span.button-label")).click();
}

private static void executarRegrasDeNegocio(ConfiguradorDeBrowser configurador, List<Story> stories) {
	
	for (Story story : stories) {
		//Botao de serach da story
		configurador.getDriver().findElement(By.cssSelector("input.SearchInputText")).clear();
		configurador.getDriver().findElement(By.cssSelector("input.SearchInputText")).sendKeys(Integer.toString(story.getId()));
		configurador.getDriver().manage().timeouts().implicitlyWait(120, TimeUnit.SECONDS);
		//botao de busca
		configurador.getDriver().findElement(By.cssSelector("#jazz_ui_SearchBox_0 > form > div > a")).click();
		configurador.getDriver().manage().timeouts().implicitlyWait(120, TimeUnit.SECONDS);
		
		if(configurador.getDriver().findElement(By.className("Select")).getText().equals("Invalid")){
					continue;
		}
						
		//botao historico
		configurador.getDriver().findElement(By.partialLinkText("History")).click();
		try {
					Thread.sleep(3000);
		} catch (InterruptedException e) {
				
				e.printStackTrace();
		}
		configurador.getDriver().manage().timeouts().implicitlyWait(120, TimeUnit.SECONDS);
					
		List<WebElement> webElementsStatus  = configurador.getDriver().findElements(By.xpath("//* [contains(text(),'Status') and @class='HistoryColumn0']//following::td[1]"));
		List<WebElement> webElementsPlanned  = configurador.getDriver().findElements(By.xpath("//* [contains(text(),'Planned') and @class='HistoryColumn0']//following::td[1]"));
				
		System.out.println("Story: "
			+ story.getId() 
			+ " Tamando da Lista Planned: "
			+ webElementsPlanned.size()
			+ " Tamando da Lista Status: "
			+ webElementsStatus.size()); 
				
			
			webElements.clear();		
			
		}
	
}
private static void finalizarExecucao(ConfiguradorDeBrowser configurador) {
	configurador.getDriver().close();		
}

}//Fim da classe NavegadoDeBrowser

package br.com.ibm.contadordeestoria.modelo;

import org.openqa.selenium.WebDriver;

import org.openqa.selenium.chrome.ChromeDriver;

import br.com.ibm.contadordeestoria.interfaces.ConfiguradorDeBrowser;

Classe ConfiguradorDeChrome //Um das classes ue configuram os drivers
public class ConfiguradorDeChrome extends ConfiguradorDeBrowser {

private WebDriver driver;

@Override
public void executarConfiguracao() {
	System.setProperty("webdriver.chrome.driver", "C:\\chromedriver_win32\\chromedriver.exe");
	
	this.driver = new ChromeDriver();
}

@Override
public WebDriver getDriver() {
	return this.driver;
}

}

darlan_machado

O que eu pude entender, lendo o javadoc do WebDriver, é que o método findElements não poderia guardar lixo na memória.
Se quiser, pode ver você mesmo

F

Pra uma story ele realmente não garda lixo nenhum. O problema está quando eu coloco isso em uma estrutura de repetiçao.

darlan_machado

Cara, o que a documentação do mesmo diz é diferente disso.
Não sei do mecanismo por trás do método findElements, mas, a teoria, é que ele não armazena nada.

F

A documentação pode não estar sitando esse problema. Vou fazer um teste em um código mais simples e q vc tb possa rodar e te mando, para testarmos.

Criado 23 de janeiro de 2018
Ultima resposta 25 de jan. de 2018
Respostas 6
Participantes 2