Using WebDriver after calling quit()?

Topic created · 10 Posts · 222 Visualizações
  • @BeforeClass
    	public static void inicializa(){
    page.acessarTelaInicial2(); }
    
    @AfterClass
    	public static void fecha() {
    		if (Propriedades.FECHAR_BROWSER) {
    			killDriver();
    		}
    	}
    
    
    ***************************************************
    public void acessarTelaInicial2() {
    		DriverFactory.getDriver().get("url");
    
    	}
    
    
    ***********************************
    @Test 
    public void teste1()
    {//teste 1}
    
    @Teste 
    public void teste2()
    {//teste 2}
    
    
    *****************************************
    	public static WebDriver getDriver() {
    		if (driver == null) {
    			switch (Propriedades.browser) {
    			case FIREFOX:
    				System.setProperty("/geckodriver.exe");
    				DriverFactory.driver = new FirefoxDriver();
    				break;
    			case CHROME:
    				System.setProperty("/chromedriver.exe");
    				DriverFactory.driver = new ChromeDriver();
    				break;
    			}
    			driver.manage().window().setSize(new Dimension(1200, 765));
    		}
    		return driver;
    	}
    
    	public static void killDriver() {
    		if (driver != null) {
    			driver.quit();
    			driver = null;
    		}
    	}
    

    pessoal estou usando uma estrutura como esse, e quando o segundo teste vai rodar apresenta o seguinte erro:
    org.openqa.selenium.NoSuchSessionException: Session ID is null. Using WebDriver after calling quit()?

    alguém ja passou por isso?

  • Não está dando algum “driver.close” e tentando fechar…e pq driver = null; ?
    Uma duvida, a cada teste ele fecha o driver? Onde reinicializa ele dai…?

  • @Ramses-Saccol-de-Almeida não tem “driver.close”.

    driver = null; -> para que no método teste2 ele consiga instanciar um novo driver.

    eu uso um @beforeClass para que ele instancie um driver a cada classe
    e o @afterClass para que ele feche o driver após o término de cada classe.

    no meu projeto real eu tenho 2 classes, a primeira classe ele executa corretamente, porém na hora de executar a segunda classe dá o erro.

  • Isso está suspeito, parece que tu está tentando fechar o driver o qual já parece estar fechado…Chegou a ver se está inicializando o driver e fechando na sequencia correta?

  • Vou tentar apresentar algo mais genérico:

    Minha suite de testes está assim:

    @RunWith(Suite.class)
    @SuiteClasses({
    
    		Test1.class, 
    		Test2.class
    		
    })
    
    public class SuiteTestes {
    	private static LoginPage page = new LoginPage();
    
    	@BeforeClass
    	public static void iniciar() {
    //aqui eu instancio o driver e abro a url.
    		page.acessarTelaInicial();
    	}
    	}
    
    	@AfterClass
    	public static void finaliza() {
    		DriverFactory.killDriver();
    		
    	}
    }
    

    tenho 2 classes de teste

    public class Test1 extends BaseTest {
    	
    	Test1Page test1page= new Test1Page();
    	
    	@Test
    	public void test1() {
    		
    		test1page.pesquisar("pesquisa1");
    		test1page.clicarPesquisa();
    	}
    
    }
    
    
    public class Test2 extends BaseTest {
    	
    	Test2Page test2page= new Test2Page();
    	
    	@Test
    	public void test1() {
    		
    		test2page.pesquisar("pesquisa2");
    		test2page.clicarPesquisa();
    	}
    
    }
    
    

    a primeira pesquisa, faz corrertamente
    a segunda pesquisa não da certo porque o site abre e fecha rapidamente.

  • Olha… parece que private static LoginPage page = new LoginPage(); é quem realmente gera a instancia do selenium…

    e depois que seu primeiro teste termina, ele termina ele com DriverFactory.killDriver();

    Ou seja… ele vai executar o seu beforeClass e vai dar erro pq não vai ter mais instancia.

  • quando o " page.acessarTelaInicial(); " é chamado ocorre o seguinte:

    public void acessarTelaInicial() {
    
    		DriverFactory.getDriver().get("url");
    	}
    

    quando o getDriver é chamado ocorre:

    public static WebDriver getDriver() {
    		if (driver == null) {
    			switch (Propriedades.browser) {
    			case FIREFOX:
    				System.setProperty("webdriver.gecko.driver",
    						/geckodriver.exe");
    				DriverFactory.driver = new FirefoxDriver();
    				break;
    			case CHROME:
    				System.setProperty("webdriver.chrome.driver",
    						"/chromedriver.exe");
    				DriverFactory.driver = new ChromeDriver();
    				break;
    			}
    			driver.manage().window().setSize(new Dimension(1200, 765));
    		}
    		return driver;
    	}
    

    acredito que dessa forma o driver é instanciado novamente sempre que o @beforeClass é chamado.

    O que voces acham?
    não estou conseguindo entender o que está dando errado.

  • Por acaso tu já tentou colocar um breakpoint na segunda classe e verificar se o driver é instanciado novamente ou ele tenta usar a sessão atual e fecha no processo? Acho que pela estrutura que tu está usando seria o mais sensato…A minha duvida é, se tu criar duas classes independentes de teste, e rodar individual, funciona?

  • Bom dia Pamela!

    Acho que pode mudar um pouco a estrutura do seu teste. O AfterClass vai rodar depois de toda a class. O after roda depois de cada teste.

    Se seu objetivo é matar o navegador no final do teste e abrir um novo quando iniciar um novo teste acredito que vai funcionar melhor.

    Peguei um caso de teste aqui que faço isso:

        @BeforeClass
        public static void setUpClass() throws IOException {
            prop = new Properties();
            ClassLoader loader = Thread.currentThread().getContextClassLoader();
            InputStream stream = loader.getResourceAsStream("application.properties");
            prop.load(stream);
            email = prop.getProperty("email");
            password = prop.getProperty("password");
            eventTitle = prop.getProperty("eventTitle");
            eventDescription = prop.getProperty("eventDescription");
            startTime = prop.getProperty("startTime");
            finishTime = prop.getProperty("finishTime");
            address = prop.getProperty("address");
            addressName = prop.getProperty("addressName");
            urlExternal = prop.getProperty("urlExternal");
    
        }
    
        @Before
        public void setUp(){
            driver = Web.createChrome();
        }
    
        @After
        public void tearDown() {
            eventTitleValidation = "";
            textToast = "";
            surveyTitleValidation = "";
            driver.quit();
        }
    
       @Test
        public void createEventRealizesPublic() {
            new LoginPage(driver)
                    .login(email, password)
                    .clickMenuEvent()
                    .clickList()
                    .newEvent()
                    .typeTitle(eventTitle + "Realiza Publico " + numberRandom)
                    .typeDescription(eventDescription)
                    .insertImage(image)
                    .typeDateStart()
                    .typeStartTime(startTime)
                    .typeFinishTime(finishTime)
                    .typeAddress(address)
                    .typeAddressName(addressName + numberRandom)
                    .saveEvent()
                    .sleep(15);
    
            getTextToast();
            navigateEventPage();
            getEventTitle();
            assertEquals("Evento criado com sucesso!", textToast);
            assertEquals(eventTitle + "Realiza Publico " + numberRandom, eventTitleValidation);
            System.out.println(eventTitle + "Realiza Publico " + numberRandom);
        }
    
  • @Pamela-Fracalossi não sei se faz sentido, mas eu tive um problema similar e ao instanciar a classe da pagina dentro do @BeforeClass resolveu. Faz sentido? Não sei kkkk mas funcionou aqui.