Перейти к содержимому

Фотография

Как записать в лог исключение Selenium Webdriver


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 18

#1 ArtemKorsakov

ArtemKorsakov

    Новый участник

  • Members
  • Pip
  • 50 сообщений
  • ФИО:Артём
  • Город:Москва

Отправлено 05 февраля 2016 - 16:08

Добрый день!

 

Помогите, пожалуйста, новичку.

Допустим у меня есть JUnit-тест, использующий Selenium Webdriver, который вывалился с каким-нибудь исключением.

Например:

org.openqa.selenium.NoSuchElementException: no such element: Unable to locate element: {"method":"link text","selector":"Создать документ1"}

Вопрос: можно ли как-то получить в коде это исключение?

Например, после выполнения теста всегда выполняется:

    @After
    public void tearDown() throws Exception {  

     String Message = "Вот здесь я хочу получить текст своего исключения";    

System.out.println(Message);
    }

 

Я хочу в параметр Message передать это вывалившееся исключение.

Т.е., чтобы когда у меня тест вывалился с каким-то исключением, я хочу это исключение захватить в коде, чтобы потом вывести в лог-файл.

Типа, такой-то тест закончился с такой-то ошибкой.

 

Это можно как-то сделать?

 

 


  • 0

#2 Vad1m198

Vad1m198

    Активный участник

  • Members
  • PipPip
  • 115 сообщений
  • ФИО:Вадим


Отправлено 05 февраля 2016 - 16:47

Для того чтобы перехватить исключение используйте try catch блок http://beginnersbook...-catch-in-java/ .

Вот так можно достать сообщение об ошибке http://www.tutorials..._getmessage.htm

Но зачем? И так в трейсе видно какой тест с какой ошибкой не прошел.

 

P.S.

в @After методе этого сделать не получится, потому, что после ошибки код не выполнит  @After метод.


  • 0

#3 ArtemKorsakov

ArtemKorsakov

    Новый участник

  • Members
  • Pip
  • 50 сообщений
  • ФИО:Артём
  • Город:Москва

Отправлено 08 февраля 2016 - 07:00

Для того чтобы перехватить исключение используйте try catch блок http://beginnersbook...-catch-in-java/ .

Вот так можно достать сообщение об ошибке http://www.tutorials..._getmessage.htm

Но зачем? И так в трейсе видно какой тест с какой ошибкой не прошел.

 

P.S.

в @After методе этого сделать не получится, потому, что после ошибки код не выполнит  @After метод.

 

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

Зачем? У меня несколько десятков тестов и с каждой неделей их будет все больше и больше. Я их ночью прогоняю. На утро, часть из них завершается с ошибкой. Я каждый ошибочный тест прогоняю по очереди, чтобы понять, в чём проблема. Но если я начну каждый прогонять по отдельности, то логи по остальным потеряются.

Соответственно, мне нужен файлик с актуальным состоянием моих тестов. Вручную мне его вести не хочется. Вот я и хочу, чтобы каждый тест, после того, как он прогнался, зашёл в excel-файлик с актуальным состоянием тестов и отметился там.

Т.е. чтобы мои тесты сами вели файлик со своим актуальным состоянием.


  • 0

#4 user12

user12

    Специалист

  • Members
  • PipPipPipPipPip
  • 894 сообщений
  • ФИО:Виктор
  • Город:Минск


Отправлено 08 февраля 2016 - 09:13

в @After методе этого сделать не получится, потому, что после ошибки код не выполнит  @After метод.

 

Выполнит
 

 

У меня несколько десятков тестов и с каждой неделей их будет все больше и больше. Я их ночью прогоняю. На утро, часть из них завершается с ошибкой. Я каждый ошибочный тест прогоняю по очереди, чтобы понять, в чём проблема. Но если я начну каждый прогонять по отдельности, то логи по остальным потеряются.

 

 

??? ты в файл не пробовал выводить ?

 

Да и вообще о чем речь. Какой еще After в JUnit ? Сейчас 2016 год, а не 2011. Всякие After/BeforeClass и т.п. уже никто не использует. В 100500 раз удобней рулы, которые могут следить за пассед/фейлед/начало/конец теста и т.п.

 

Даже я когда-то про это писал:

https://user12vv.wor...сс-testwatcher/

https://user12vv.wor...сс-testwatcher/


  • 0

#5 Lzk

Lzk

    Специалист

  • Members
  • PipPipPipPipPip
  • 504 сообщений
  • ФИО:Олег
  • Город:Мск

Отправлено 08 февраля 2016 - 11:36

Да и вообще о чем речь. Какой еще After в JUnit ? Сейчас 2016 год, а не 2011. Всякие After/BeforeClass и т.п. уже никто не использует. В 100500 раз удобней рулы, которые могут следить за пассед/фейлед/начало/конец теста и т.п.

 

а в чем преимущество ? в том, что тест в зависимости от результата будет или не будет выполнять after? и действительно ли их уже не используют ? в других фреймворках тоже ? (TestNG, TestCase, Xunit)

я использую


  • 0

#6 user12

user12

    Специалист

  • Members
  • PipPipPipPipPip
  • 894 сообщений
  • ФИО:Виктор
  • Город:Минск


Отправлено 08 февраля 2016 - 13:42


а в чем преимущество ? в том, что тест в зависимости от результата будет или не будет выполнять after? и действительно ли их уже не используют ? в других фреймворках тоже ? (TestNG, TestCase, Xunit)

я использую

 

Я писал только про JUnit. Для других фреймворках, например TestNG, без различных AfterMethod не обойтись.

 

Преимущество в том, что JUnit пошел дальше и придумал рулы для более гибкого управления тестами, т.е. всякие after/before  и т.п. не нужны . Я делал различные рулы на авторизацию, чтобы выполнялась перед каждым тестом, была также отдельная рула на логаут (если тест провалился, т.к. приложение зависло, то делаем рефреш страницы);  для каких-то определенных сьютов использовалась прокси - рула и т.п.

Там очень-очень много чего можно упростить. Также есть класс RuleChain для того, чтобы выполнять рулы в необходимой последовательности.

 

PS Я сейчас сам уже давно использую только TestNG, просто многие думают, что TestNG намного лучше. В каких-то моментах - да, лучше, в каких - то хуже.


  • 1

#7 Lzk

Lzk

    Специалист

  • Members
  • PipPipPipPipPip
  • 504 сообщений
  • ФИО:Олег
  • Город:Мск

Отправлено 08 февраля 2016 - 14:07

 

Благодарю за пояснение=)


  • 0

#8 ArtemKorsakov

ArtemKorsakov

    Новый участник

  • Members
  • Pip
  • 50 сообщений
  • ФИО:Артём
  • Город:Москва

Отправлено 08 февраля 2016 - 14:22

 

в @After методе этого сделать не получится, потому, что после ошибки код не выполнит  @After метод.

 

Выполнит
 

 

У меня несколько десятков тестов и с каждой неделей их будет все больше и больше. Я их ночью прогоняю. На утро, часть из них завершается с ошибкой. Я каждый ошибочный тест прогоняю по очереди, чтобы понять, в чём проблема. Но если я начну каждый прогонять по отдельности, то логи по остальным потеряются.

 

 

??? ты в файл не пробовал выводить ?

 

Да и вообще о чем речь. Какой еще After в JUnit ? Сейчас 2016 год, а не 2011. Всякие After/BeforeClass и т.п. уже никто не использует. В 100500 раз удобней рулы, которые могут следить за пассед/фейлед/начало/конец теста и т.п.

 

Даже я когда-то про это писал:

https://user12vv.wor...сс-testwatcher/

https://user12vv.wor...сс-testwatcher/

 

 

Для каждого теста у меня и так формируется свой текстовый лог-файл с результатами тестирования.

А Excel мне нужен только для контроля общего состояния автотестов.

Если у меня сто тестов, то сто файлов-логов. Как мне понять, какие из них ошибочные, а какие прогнались хорошо? Залезать в каждый из этих сто файлов и смотреть, что там внутри?

Вот для этого мне и нужен Excel-файл. Я в нём получу общее состояние тестов, отфильтрую только по ошибочным, а затем уже буду каждый ошибочный смотреть в его текстовый файл с ошибками.

Что там произошло и какие вывелись ошибки.

 

Excel-ник для контроля общего состояния тестов.

Лог-файлы - подробное описание ошибок для каждого теста в отдельности.

 

В Excel-нике у меня лежит только номер автотеста, время последнего запуска, продолжительность его выполнения, результаты последних пяти запусков и ещё хотел добавить ошибку, на всякий случай, но уже просёк, что это неинформативно, так что отказываюсь от неё.

 

>>>Какой еще After в JUnit ? Сейчас 2016 год, а не 2011.

Не знал, спасибо за ссылки, почитаю.

Я новичок в Java, буду развиваться по мере необходимости.


  • 0

#9 user12

user12

    Специалист

  • Members
  • PipPipPipPipPip
  • 894 сообщений
  • ФИО:Виктор
  • Город:Минск


Отправлено 08 февраля 2016 - 15:04

Очередной новый подход :)

 

 

В общем, если брать первоначальный вопрос:

 

Вопрос: можно ли как-то получить в коде это исключение?

 

 

Можно

public class Tests {
    
    @Rule
    public  MyRule myRule = new MyRule(); 
 
 
    @Test
    public void testZZZZZZZ() throws Exception {        
        System.out.println(0/0);
      }            
}

И класс MyRule:

import org.junit.rules.TestWatcher;
import org.junit.runner.Description;
 
public class MyRule extends TestWatcher {   
    

    
    
    @Override
    protected void failed(Throwable e, Description description) {
       System.out.println("Вот это исключение и делай с ним, что хочешь :))))  " + e.toString());
    
       }
     
}

Вывод на консоль:

Вот это исключение и делай с ним, что хочешь :))))  java.lang.ArithmeticException: / by zero
 


  • 0

#10 ArtemKorsakov

ArtemKorsakov

    Новый участник

  • Members
  • Pip
  • 50 сообщений
  • ФИО:Артём
  • Город:Москва

Отправлено 16 февраля 2016 - 09:00

user12, спасибо за прекрасные статьи :)

Не буду скрывать, что они мне очень-очень помогли.

Я, как идиот, в каждый тест добавлял @Before и @After, не подозревая, что всё можно сделать гораздо проще - один раз для всех. Конечно, придётся переделать кучу тестов, но это будет приятная переделка. :)

 

Учиться, учиться и ещё раз учиться :)


  • 0

#11 ArtemKorsakov

ArtemKorsakov

    Новый участник

  • Members
  • Pip
  • 50 сообщений
  • ФИО:Артём
  • Город:Москва

Отправлено 16 февраля 2016 - 11:29

У меня ещё вопрос появился...

Мне нужно в лог перед каждым тестом выводить инфу о том, что запустился такой-то тест.

 

Пытаюсь сделать так:

    @Override
    protected void starting (Description description) {
        TestName = new TestName().getMethodName();
        System.out.println("****************************** " + TestName + " - Начало работы ******************************");
    }

 

Но параметр TestName возвращает null.

 

Вопрос: неужели класс TestName() из org.junit.rules.TestName можно использовать только внутри @Test???


  • 0

#12 user12

user12

    Специалист

  • Members
  • PipPipPipPipPip
  • 894 сообщений
  • ФИО:Виктор
  • Город:Минск


Отправлено 16 февраля 2016 - 11:51

У меня ещё вопрос появился...

Мне нужно в лог перед каждым тестом выводить инфу о том, что запустился такой-то тест.

 

Пытаюсь сделать так:

    @Override
    protected void starting (Description description) {
        TestName = new TestName().getMethodName();
        System.out.println("****************************** " + TestName + " - Начало работы ******************************");
    }

 

Но параметр TestName возвращает null.

 

Вопрос: неужели класс TestName() из org.junit.rules.TestName можно использовать только внутри @Test???

 

 

 

Но параметр TestName возвращает null.- конечно, а ты что хотел :)

 

Решение твоей задачи(все примитивно) :

Как ты видишь в starting передается description и ты можешь брать все, что хочешь. Пример:

 

Сам класс:

import org.junit.Rule;
import org.junit.Test;

import rules.MyRule;

public class Tests {

	
	@Rule
    public  MyRule myRule = new MyRule();
  
  
  
    @Test
    public void test1() throws Exception {
        
        System.out.println("Это сам тест - 1");
      }
    

    @Test
    public void test2() throws Exception {
        
        System.out.println("Это сам тест - 2");
      }
        
}

Ну и класс MyRule:

import org.junit.rules.TestWatcher;
import org.junit.runner.Description;
 
public class MyRule extends TestWatcher {   
	
	@Override
    protected void starting (Description description) {
       System.out.println("Мы начинаем КВН, т.е. сорри тест с именем   " + description.getMethodName());
      }
	
	
   
     
}

Вывод на консоль:

 

Мы начинаем КВН, т.е. сорри тест с именем   test1
Это сам тест - 1
Мы начинаем КВН, т.е. сорри тест с именем   test2
Это сам тест - 2

 


  • 1

#13 ArtemKorsakov

ArtemKorsakov

    Новый участник

  • Members
  • Pip
  • 50 сообщений
  • ФИО:Артём
  • Город:Москва

Отправлено 16 февраля 2016 - 12:30

Спасибо, все элементарно!

 

Я понаглею и задам ещё вопрос.

У меня есть тест, внутри которого вызывается метод из другого класса, этот метод вызывает метод из третьего класса.

Вот этот третий метод вывалился с ошибкой.

Но мой тест, почему-то завершился с результатом succeeded.

Получается, что @Test завершится с ошибкой только если встретит ошибку внутри методов своего класса?

Приведу пример:

@Test
    public void test() throws Exception {

new Class1().metod1();

}

 

public class Class1 {

public void metod1() {

new Class2().metod2();

}

}

 

public class Class2 {

public void metod2() {

// Где-то здесь случилась ошибка

}

}

 

Как мне получить ошибку, случившуюся в metod2?

test неизменно завершается успешно


  • 0

#14 TatyanaV

TatyanaV

    Опытный участник

  • Members
  • PipPipPipPip
  • 388 сообщений
  • ФИО:Воробьева Татьяна


Отправлено 16 февраля 2016 - 12:54

Может быть у вас ошибка в третьем классе по пути обратно к первому как-то перехвачена была? 

И что за ошибка была? Exception?


  • 1

#15 ArtemKorsakov

ArtemKorsakov

    Новый участник

  • Members
  • Pip
  • 50 сообщений
  • ФИО:Артём
  • Город:Москва

Отправлено 16 февраля 2016 - 13:14

Я жутко извиняюсь, но я не знаю, как перехватывать ошибки. Научите, пожалуйста.

Допустим в третьем классе нехорошие действия со строкой произошли - любые или 0/0 пытаюсь сделать.

Как мне перехватить эту ошибку и получить её в тесте?


  • 0

#16 user12

user12

    Специалист

  • Members
  • PipPipPipPipPip
  • 894 сообщений
  • ФИО:Виктор
  • Город:Минск


Отправлено 16 февраля 2016 - 13:15

У меня есть тест, внутри которого вызывается метод из другого класса, этот метод вызывает метод из третьего класса.

Вот этот третий метод вывалился с ошибкой.

Но мой тест, почему-то завершился с результатом succeeded.

 

 

Ну это неправда, только что у себя проверил - у меня норм. Тест падает и в failed все норм печатается
 

 

Я жутко извиняюсь, но я не знаю, как перехватывать ошибки. Научите, пожалуйста.

Допустим в третьем классе нехорошие действия со строкой произошли - любые или 0/0 пытаюсь сделать.

Как мне перехватить эту ошибку и получить её в тесте?

 

 

Я же тебе ответил в http://software-test...river/?p=148389


  • 1

#17 TatyanaV

TatyanaV

    Опытный участник

  • Members
  • PipPipPipPip
  • 388 сообщений
  • ФИО:Воробьева Татьяна


Отправлено 16 февраля 2016 - 13:18

У меня тоже любые ошибки какой угодно вложенности могут завалить тест, если только их заранее не перехватить через try/catch. Поэтому и предположила, что где-то перехватываются они у спрашивающего.


  • 1

#18 user12

user12

    Специалист

  • Members
  • PipPipPipPipPip
  • 894 сообщений
  • ФИО:Виктор
  • Город:Минск


Отправлено 16 февраля 2016 - 13:25

У меня тоже любые ошибки какой угодно вложенности могут завалить тест, если только их заранее не перехватить через try/catch. Поэтому и предположила, что где-то перехватываются они у спрашивающего.

 

Вполне возможно.

2 ТС:

 

Чтобы не заниматься перепиской, сделай простенький пример и скинь сюда.


  • 1

#19 ArtemKorsakov

ArtemKorsakov

    Новый участник

  • Members
  • Pip
  • 50 сообщений
  • ФИО:Артём
  • Город:Москва

Отправлено 16 февраля 2016 - 16:16

 

У меня есть тест, внутри которого вызывается метод из другого класса, этот метод вызывает метод из третьего класса.

Вот этот третий метод вывалился с ошибкой.

Но мой тест, почему-то завершился с результатом succeeded.

 

 

Ну это неправда, только что у себя проверил - у меня норм. Тест падает и в failed все норм печатается


 

 

 

Да, действительно неправда, я обманул, т.к. запутался сам.

После того, как очень тщательно и аккуратненько вылизал все свои автотесты, всё заработало именно так, как надо. Спасибо!

 

Теперь вопрос действительно закрыт!!! Все работает!!!


  • 0


Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных