После работы первого теста webdriver не закрывается, а второй тест не запускается

java
junit
webdriver
Теги: #<Tag:0x00007fedc1592db8> #<Tag:0x00007fedc1592728> #<Tag:0x00007fedc1592228>

(Алик Гилиздинов) #1

Пишу автотесты на связке Java+juint+selenium. После того, как отработал первый тест, драйвер не убивается. Второй тест при попытке передать данные - падает.


(Roy Obenon) #2

Конечно оочень содержательный текст, где код?


(Алик Гилиздинов) #3

import org.junit.Before;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.*;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.Properties;
import java.util.concurrent.TimeUnit;
import java.util.Date;
import java.io.File;
import org.openqa.selenium.firefox.FirefoxProfile;
import org.openqa.selenium.support.ui.Select;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.*;
import static org.openqa.selenium.OutputType.*;
public class Auth {
    public static WebDriver driver;
   public static String getDataProperties(String param) throws Exception {
        Properties props=new Properties();
        props.load(new InputStreamReader(new FileInputStream("testing.properties"), "UTF-8"));
        return props.getProperty(param);
    }
    @Before
    public void setUp() throws Exception {
        driver = new FirefoxDriver(new FirefoxProfile(new java.io.File("C://EDI3//develop//src//forTestingB2B")));
    }
        @Test
    public void auth()throws Exception{
        driver.get("тут url");
        driver.findElement(By.linkText("Вход по паролю")).click();
        driver.findElement(By.id("login")).click();
        driver.findElement(By.id("login")).clear();
        driver.findElement(By.id("login")).sendKeys("lebedev");
        driver.findElement(By.name("password")).click();
        driver.findElement(By.name("password")).clear();
        driver.findElement(By.name("password")).sendKeys("111111");
        driver.findElement(By.id("btn-login")).click();
    }
  }

(Алик Гилиздинов) #4

а вот тест, который отваливается:

import org.junit.After;
import org.junit.Before;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.*;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.Properties;
import java.util.concurrent.TimeUnit;
import java.util.Date;
import java.io.File;
import org.openqa.selenium.firefox.FirefoxProfile;
import org.openqa.selenium.support.ui.Select;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.*;
import static org.openqa.selenium.OutputType.*;
public class SendDo {
    public static WebDriver driver;
    @Test
    public void TestSendDo() throws Exception {
        driver.get(тут url);
        driver.getCurrentUrl();
        String url = driver.getCurrentUrl();
        String[] args = url.split("/");
        String last = args[args.length - 1];
        System.out.println(last);
    }
    @After
    public void tearDown() {
        driver.quit();
    }
    public static boolean isAlertPresent(FirefoxDriver driver) {
        try {
            driver.switchTo().alert();
            return true;
        } catch (NoAlertPresentException e) {
            return false;
        }
    }
}

(Onifent) #5

А почему вы решили что он должен убиваться?
В первом тесте у вас нет ничего, что сказало бы драйверу это сделать.

т.е. отсутсвтует вызов метода

driver.quit();

А во втором тесте не создается драйвер.

WebDriver driver = new FirefoxDriver();

(Алик Гилиздинов) #6

вот я и не могу понять: в первом тесте я драйвер не убиваю, специально, чтобы второй тест передавал данные в уже запущенный экземпляр драйвера.


(Onifent) #7

Но они у вас в разных классах, а передача драйвера между ними у вас не реализована.

Добавьте в первый класс метод позволяющий получить драйвер

А во втором классе извлекайте драйвер из первого и используйте

попробуйте так

import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxProfile;

import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.Properties;

public class Auth {
    public static WebDriver driver;

    public static String getDataProperties(String param) throws Exception {
        Properties props = new Properties();
        props.load(new InputStreamReader(new FileInputStream("testing.properties"), "UTF-8"));
        return props.getProperty(param);
    }

    @Before
    public void setUp() throws Exception {
        driver = new FirefoxDriver(new FirefoxProfile(new java.io.File("C://EDI3//develop//src//forTestingB2B")));
    }

    @Test
    public void auth() throws Exception {
        driver.get("тут url");
        driver.findElement(By.linkText("Вход по паролю")).click();
        driver.findElement(By.id("login")).click();
        driver.findElement(By.id("login")).clear();
        driver.findElement(By.id("login")).sendKeys("lebedev");
        driver.findElement(By.name("password")).click();
        driver.findElement(By.name("password")).clear();
        driver.findElement(By.name("password")).sendKeys("111111");
        driver.findElement(By.id("btn-login")).click();
    }

    public WebDriver getDriver() {
        return driver;
    }
}

import org.junit.After;
import org.junit.Test;
import org.openqa.selenium.NoAlertPresentException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;

public class SendDo {
    private Auth auth;
    public WebDriver driver = auth.getDriver();

    @Test
    public void TestSendDo() throws Exception {
        driver.get("url");
        driver.getCurrentUrl();
        String url = driver.getCurrentUrl();
        String[] args = url.split("/");
        String last = args[args.length - 1];
        System.out.println(last);
    }

    @After
    public void tearDown() {
        driver.quit();
    }

    public static boolean isAlertPresent(FirefoxDriver driver) {
        try {
            driver.switchTo().alert();
            return true;
        } catch (NoAlertPresentException e) {
            return false;
        }
    }
}

(Onifent) #8

а вообще в вашем случае, если вам уж так сильно надо делать два теста последовательно, то второй тест следует перенести в класс к первому и сделать зависимости на выполнение, но @After нужно будет убрать, и закрывать драйвер непосредственно внутри последнего теста


(Алик Гилиздинов) #9

Спасибо, сейчас попробую. Может быть Вы мне еще один вопросик разъясните? не хочется отдельную тему заводить. У меня JUnit не может вытащить константы из файла properties. А почему - понять не могу. Уже по разному пробовал - и в папку с тестами ложил, и как только не извращался(((


(Onifent) #10

с Junit не работал, не знаю что это у него за файл такой)


(Алик Гилиздинов) #11

по сути он похож на файл properties у TestNG


(Roy Obenon) #12

т.е. это не работает?

  public static String getDataProperties(String param) throws Exception {
        Properties props = new Properties();
        props.load(new InputStreamReader(new FileInputStream("testing.properties"), "UTF-8"));
        return props.getProperty(param);
    }

(Алик Гилиздинов) #13

да, именно. Файл он находит как я понял, но данные из него не тянет.


(Алик Гилиздинов) #14

выдает ошибку java.lang.NullPointerException


(You Rooock) #15

Верно, потому что auth не инициализирован.
Попробуй сделать:

 private Auth auth = new Auth();

(Алик Гилиздинов) #16

Спасибо. Сейчас попробую.


(Алик Гилиздинов) #17

Теперь заработало. Спасибо! Проблема только в том, что драйвер после return в первом тесте уходит на страницу авторизации при запуске второго теста.

А насчет файлов properties не подскажете? а то я так и не смог разобраться (гугл не помог), почему из него константы не тянутся.


(Roy Obenon) #18

а где этот метод у Вас вообще вызывается? может не тянет потому, что не вызываете его? )))


(Алик Гилиздинов) #19

Ну, по сути идея метода заключалась в том, чтобы он загрузил файл properties и затем webdriver уже обращался к параметрам внутри этого файла. Но, поскольку знания в программировании на Java - минимальные, то могу сильно и много ошибаться(


(Roy Obenon) #20

Не достаточно просто его объявить!
Вот чтобы подтягивало значения строк из ключей
driver.findElement(By.id(getDataProperties("ключ строки"))).click();