Teste com selenium

10 respostas
F

Pessoal estou começando a usar Selenium para fazer alguns teste, preciso testar uma página web que contém muitas chamadas ajax, e esta dando muitos erros.

Tenho que selecionar todos os itens de um dropdown , cada item que eu seleciono e realizado uma chamada ajax diferente em outro dropdowm.

Para cada estado que eu seleciono no dropdown abaixo é listado todas as cidades.

consigo selecionar todos os estados, porem quando tento localizar o dropdown das cidades, sempre da erro.

Aqui minha classe:

package com.br.portoseguro;

import java.util.Timer;

import java.util.TimerTask;

import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;

import org.openqa.selenium.NoSuchElementException;

import org.openqa.selenium.StaleElementReferenceException;

import org.openqa.selenium.WebDriver;

import org.openqa.selenium.WebElement;

import org.openqa.selenium.firefox.FirefoxDriver;

import org.openqa.selenium.support.ui.ExpectedConditions;

import org.openqa.selenium.support.ui.FluentWait;

import org.openqa.selenium.support.ui.Select;

import org.openqa.selenium.support.ui.Wait;

public class PortoSeguroService {

public void navegar() {

Timer tempo = new Timer();
    
    WebDriver driver = new FirefoxDriver();

    Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
            .withTimeout(10, TimeUnit.SECONDS)
            .pollingEvery(1, TimeUnit.SECONDS)
            .ignoring(NoSuchElementException.class)
            .ignoring(StaleElementReferenceException.class);
    
    


    driver.navigate()
            .to("https://wwws.portoseguro.com.br/rederef/redereferenciadamobile.aspx?CONSULTA=SAUDE");

    WebElement rbCidade = wait.until(ExpectedConditions
            .elementToBeClickable(By.id("rblInicio_1")));

    rbCidade.click();        
    

    if (rbCidade.isSelected()) {

        tempo.scheduleAtFixedRate(new TimerTask() {
            int index = 1;

            @Override
            public void run() {
                WebElement selectEstado = wait.until(ExpectedConditions
                        .presenceOfElementLocated(By.id("cboEstado")));
                Select listaEstado = new Select(selectEstado);

                listaEstado.selectByIndex(index);

                System.out.println("Estado: " + listaEstado.getOptions().get(index).getText().toUpperCase());
                
                //não consigo localizar o elemento html no documento
                WebElement selectCidade = wait.until(ExpectedConditions
                        .presenceOfElementLocated(By.id("cboEstado")));
                index++;

                if (index == listaEstado.getOptions().size())
                    tempo.cancel();

            }

        }, 1000, 9000);        
        
        //porem caso eu tento localizar fora do método run(), todo ocorre normalmente
        WebElement selectCidade = wait.until(ExpectedConditions
                .presenceOfElementLocated(By.id("cboEstado")));
        
        
        
        

    }

}

public static void main(String[] args) {
    new PortoSeguroService().navegar();
}

}

preciso localizar os cidades no temporizador do método run(), e não da certo, porem caso eu tente localizar o elemento html fora do temporizador, a localização é realizada normalmente, alguém sabe oque pode ser?

10 Respostas

G

Talvez seja necessario colocar alguns Waits esplicitos … p/ que dê tempo de carregar a combo das cidades…

Ta rolando qual erro? NoSuchElementException ?

F

o erro que ocorre é esse aqui

Exception in thread “Timer-0” org.openqa.selenium.StaleElementReferenceException: Element is no longer attached to the DOM

F

Desculpa a ignorancia, mas não sei oque é wait explicito? tem algum exemplo, você diz uma espera de alguns segundos para localizar o combobox das cidades

tipo

webelement combo = waitExplicito…

G

O selenium trabalha com uma série de waits “inteligentes” que aguardam pelo aparecimento do elemento na tela até um certo tempo.

São os Waits implícitos próprios da ferramenta que podem ter o seu tempo alterado no momento que você instancia algo. (Dê uma olhada nos contrutores da maioria das classes do Selenium que fazem parte da sua infra, eles sempre recebem um parametro com o timeout, que caso não seja passado, será utilizado o tempo padrão (30 segundos se nao me engano))

Quando você quer que sua aplicação espere por algo independente do que esteja acontecendo, a gente chama de Wait Explicito.

Sugerido pela prórpia selenium em alguns casos, esse wait é na maioria das vezes um Thread.sleep mesmo… sem vergonha de ser feliz… :smiley:

Mas pelo erro que tu apresentou, ele parece estar tentando manipular um elemento que não está mais no DOM.

Acredito que você tenha que rever seus algorítmos para atualizar suas referências de qual elemento você quer tentar manipular.

Se você estiver renderizando a COMBO inteira das cidades, pode ser que o ID dela esteja mudando e o erro pode estar vindo dai.

Neste caso o ideal seria a combo sempre ter o mesmo ID, e você renderizar apenas as OPTIONS.

Abs.

F

A combo sempre tem o mesmo id, quando seleciono qualquer item da combo de estado é renderizado na tela a combo de cidades sempre com o mesmo id, obrigado, vou da uma olhada aqui nos waits do Selenium.

G

Dá uma olhada nesse cara:

Selenium WebDriver : How to wait till element visible or appear or present on page

http://software-testing-tutorials-automation.blogspot.com.br/2014/02/selenium-webdriver-how-to-wait-till.html

:wink:

F

Amigo deu uma procurada na expera que vc falou, usei Thread.sleep(tempo) e continuou dando erros dai modifiquei a classe para

package com.br.portoseguro;

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

import org.openqa.selenium.WebDriver;

import org.openqa.selenium.support.ui.ExpectedConditions;

import org.openqa.selenium.support.ui.Select;

import org.openqa.selenium.support.ui.Wait;

import CRUD.Insert;

public class SelectPlano implements Runnable {

Wait<WebDriver> wait = null;

public SelectPlano(Wait<WebDriver> wait) {
	this.wait = wait;
}

@Override
public void run() {

	int indexPlano = 1;
	Select selectPlano = null;
	int tamanhoResgistros = 0;
	
	do {

		selectPlano = new Select(wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("cboPlano"))));

		selectPlano.selectByIndex(indexPlano);

		String nomePlano = new Select(wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("cboPlano")))).getOptions().get(indexPlano).getText();
		
		new Insert().salvarPlano(nomePlano);

		tamanhoResgistros = new Select(wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("cboPlano")))).getOptions().size() - 1;

		indexPlano++;

		System.out.println("plano" + nomePlano);

		new SelectTipoServico(wait).run();

	} while (indexPlano <= tamanhoResgistros);

}

}

A minha espera é configurada assim

public class PortoSeguroService {

WebDriver driver = new FirefoxDriver();

Wait<WebDriver> wait = new FluentWait<WebDriver>(driver).withTimeout(10, TimeUnit.SECONDS).pollingEvery(2, TimeUnit.SECONDS).ignoring(NoSuchElementException.class)
		.ignoring(StaleElementReferenceException.class);	

public void navegar() {			

	driver.navigate().to("https://wwws.portoseguro.com.br/rederef/redereferenciadamobile.aspx?CONSULTA=SAUDE");

	WebElement rbCidade = wait.until(ExpectedConditions.presenceOfElementLocated(By.id("rblInicio_1")));

	rbCidade.click();
	
	new SelectEstado(wait,driver).run();
	

}

public static void main(String[] args) {
	new PortoSeguroService().navegar();
}

}

Esse wait ai não devia resolvar o problema?

F

sempre que procuro um elemento na tela caso o driver não o encontre selenium deveria esperar uns 10 segundos ates de tentar encontrar o elemento?, porem isso não ocorre…

F

Eu consigo fazer até certo ponto, so que derrepente ele para e depois da que não foi encontrado o elemento no DOM

F

Conseguir da uma boa melhorada no código, caso alguém se interesse vou postar aqui. obrigado pela ajuda

Todoas as classes ficaram parecidas, o trecho de código apenas recebe alguns objetos de outra classe no construtor, incluside o driver que direciona a URL

package com.br.portoseguro;

import java.util.concurrent.TimeUnit;

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

import org.openqa.selenium.NoSuchElementException;

import org.openqa.selenium.StaleElementReferenceException;

import org.openqa.selenium.WebDriver;

import org.openqa.selenium.WebElement;

import org.openqa.selenium.support.ui.ExpectedCondition;

import org.openqa.selenium.support.ui.ExpectedConditions;

import org.openqa.selenium.support.ui.FluentWait;

import org.openqa.selenium.support.ui.Select;

import org.openqa.selenium.support.ui.Wait;

public class SelectEspecialidade {

private WebElement cboEspecialidade = null;

Wait<WebDriver> wait = null;

public WebDriver driver = null;

private int qtdEspecialidade = 0;

String estado;
String cidade;
String plano;
String servico;
String especialidade;

public SelectEspecialidade(WebDriver driver, String estado, String cidade,
        String plano, String servico) {

    this.driver = driver;

    this.wait = new FluentWait<WebDriver>(driver)
            .withTimeout(10, TimeUnit.SECONDS)
            .pollingEvery(1, TimeUnit.SECONDS)
            .ignoring(NoSuchElementException.class)
            .ignoring(StaleElementReferenceException.class);

    this.estado = estado;
    this.cidade = cidade;
    this.plano = plano;
    this.servico = servico;

}

private Boolean searchEspecialidade(int index) {

    Boolean encontrou = this.wait.until(new ExpectedCondition<Boolean>() {

        @Override
        public Boolean apply(WebDriver driver) {

            cboEspecialidade = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("cboEspecialidade")));

            if (cboEspecialidade == null)
                return false;

            else {
                
                //JavascriptExecutor js = (JavascriptExecutor) driver;
                
                //js.executeScript("var a; $.ajax({url:'http:\\www.google.com', async:false}).done(function(){a=true});console.log(a);");

                new Select(cboEspecialidade).selectByIndex(index);
                especialidade = new Select(cboEspecialidade).getOptions().get(index).getText();

                if (qtdEspecialidade == 0)
                    qtdEspecialidade = new Select(cboEspecialidade).getOptions().size() - 1;

                return true;

            }
        }

    });

    return encontrou;
}

public void selecionaEspecialidade() {

    int index = 1;

    do {

        if (searchEspecialidade(index))
            new Form(driver, estado, cidade, plano, servico, especialidade,index).searchForm();

        index++;

    } while (index <= qtdEspecialidade);

}

}

Criado 12 de janeiro de 2016
Ultima resposta 18 de fev. de 2016
Respostas 10
Participantes 2