создала несколько тестов на пробу и забросила их в папку src/test/java/название пакета
единственное, там был TestBase.java, он сложный какой-то, не смогла разобраться, поэтому создала свой CommonClass.java, где находятся Before/After Method
@BeforeMethod
public void setUp() throws Exception {
driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.manage().window().maximize();
}
@AfterMethod
public void tearDown() throws Exception {
driver.quit();
String verificationErrorString = verificationErrors.toString();
if (!"".equals(verificationErrorString)) {
fail(verificationErrorString);
}
}
тесты запускаются mvn test
но не запускаются с параметром профиля почему-то, хотя pom.xml запускается отдельно из Eclipse и ошибок нет, но вот стартует только Firefox
В общем методом проб и ошибок я поняла, что не надо было мне менять TestBase.java на свой.
Почему я стала создавать свой, потому что не поняла как сделать старт/остановку браузера в нем для каждого теста, там все выполняется в одном браузере, но у меня с этим много проблем возникает.
Если вам не сложно, подскажите как настроить эти Before/After, чтобы каждый тест запускался в браузере и по завершении брайзер делал quit , потом второй старт и выход и тд.
Вот методы, которые были в шаблоне
public class TestBase {
private static final String SCREENSHOT_FOLDER = "target/screenshots/";
private static final String SCREENSHOT_FORMAT = ".png";
protected WebDriver driver;
protected String gridHubUrl;
protected String baseUrl;
protected Browser browser;
@BeforeClass
public void init() {
baseUrl = PropertyLoader.loadProperty("site.url");
gridHubUrl = PropertyLoader.loadProperty("grid2.hub");
browser = new Browser();
browser.setName(PropertyLoader.loadProperty("browser.name"));
browser.setVersion(PropertyLoader.loadProperty("browser.version"));
browser.setPlatform(PropertyLoader.loadProperty("browser.platform"));
String username = PropertyLoader.loadProperty("user.username");
String password = PropertyLoader.loadProperty("user.password");
driver = WebDriverFactory.getInstance(gridHubUrl, browser, username,
password);
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
}
@AfterSuite(alwaysRun = true)
public void tearDown() {
if (driver != null) {
driver.quit();
}
}
тут сделано BeforeClass и AfterSuite
простая замена, например, Before/After Method или Before/After Test ничего не дала, выполняется всегда только первый тест, разобраться сама не могу, мозгов не хватает
TestBase дергает фабрику, чтобы создать экземпляр драйвера.
Конфигурация браузера подтягивается из проперти файлов, которые ссылаются на мейвен профили.
Чтобы запустить нужную конфигурацию используя профили, вам без TestBase не обойтись.
Помимо всего прочего, версия и платформа также должна быть указана.
В вашем же коде, которым вы заменили исходный, всегда используется FirefoxDriver. Откуда ж тут хрому взяться? Если уж используете свой собственный инициализатор, то позаботьтесь о логике выбора драйвера в зависимости от того, что указано в профиле. Но я бы не рекомендовал изобретать велосипед, если пока еще не до конца понимаете принцип работы драйвера. Разберитесь в готовом коде, он как раз адаптирован под профили. И никто не мешает вам init и tearDown использовать с BeforeMethod / AfterMethod.
Возможно проблема в TestNG конфиг файле. Покажите класс тестов и ваш конфиг.
В исходниках тестов использовалась аннотация BeforeClass. Т.е. пейдж обджект инициализируется 1 раз для всех тестов класса. Тут тоже может быть проблема при изменении аннотаций в init / tearDown.
Еще советую почитать об иерархии аннотаций в TestNG, а также основах создания конфиг файлов.
Ну, во-первых, TestBase не должен присутствовать в конфиге. Во-вторых, пока еще не ясно, как вы манипулируете аннотациями внутри тестовых классов. Если вы хотите, чтобы браузер стартовал перед каждым тестом, то init / tearDown / testInit должны содержать BeforeMethod/AfterMethod аннотации.
Оставить свой CommonClass с уже работающими BeforeMethod/AfterMethod
Взять метод init() (вместе с аннотацией @BeforeClass) из TestBase, скопировать к себе в класс и оставить в нём чтение пропертей, в проперти класса
Инициализацию браузера и драйвера перенести в свой метод setUp, чтобы она делалась перед каждым тестом
Ничего волшебного TestBase не делает, просто читает проперти из конфига, а в твоем CommonClass этого не делается, поэтому и запускается всегда только Firefox
если учитывать, что BeforeClass будет выполняться первым, тут вообще должен быть nullpointer, не вижу, чтобы browser где-то инициализировался
он объъявлен, но экземпляр не создан. при первой же попытке сделать browser.setName, он будет валиться
browser = new Browser(); должен быть до setName, а не в Before Metod в таком случае… либо setName и остальное в BeforeMethod
Вы в BeforeClass используете неинициализированный объект browser.
Глядя в код фабрики, username / password вам не понадобятся в большинстве случаях, так что можете и 2 null передать в качестве параметров.
Чтобы BeforeClass не фейлился, перенесите инициализацию браузера в BeforeClass перед setName, как уже сказали выше.
П.С. Если хотите, чтобы от вашей автоматизации был толк, берем книгу по джаве и начинаем внимательно читать. Прежде чем браться за готовые решения, будьте уверены, что сможете хотя бы в них разобраться. На форумах вам то дадут ответ, подскажут, почему не работает, но понимания кода от этого не прибавится.
спасибо за помощь, книгу по Java уже читаю, к сожалению, на работе мне не дают времени на чтение и изучение, говорят делай, вот я пытаюсь сделать, много уже чего сделала, но иногда сталкиваюсь с проблемами которые пока не могу решить сама.
Ваш второй тест пытается использовать экземпляр драйвера, который уже убит, что является странным, ибо инициализация идет в BeforeMethod. Покажите код тестового класса, где 1 тест запускается, а второй - нет.
А, стоп… Смотрю в код: драйвер статический. Если url хаба не задан, мы идем в перегруженный getInstance, который проверяет driver на null. И если != null, то возвращает существующий инстанс. Говоря простым языком, делая quit(), вы закрываете сессию, но сам объект driver’a все еще существует на уровне класса, а не экземпляра, ибо он объявлен как static. В качестве quick fix, можете попробовать дописать driver = null; после quit(). Должно сработать. Хотя, я бы вообще убрал статику, если вы используете наследование, дабы не вносить лишней путаницы. К тому же, со статикой у вас будут возникать проблемы при масштабировании, если не добавить спец. джава контейнер.