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

Фотография

Selenium + Java. Исполльзование функцей Selenium`a в любом классе


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

#1 slasva

slasva

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

  • Members
  • Pip
  • 3 сообщений


Отправлено 19 апреля 2010 - 12:13

Привет, есть вопрос начинающего.

Есть основной класс, где иницилизируется селениуми выполняются действия по логину на сайт. И вызывается метод другого класса
public class LoginEnterTest extends SeleneseTestCase { 
@BeforeTest(alwaysRun = true)
	public void setUp() throws Exception {
		selenium = new DefaultSelenium("localhost", 4444, "*firefox","http://localhost");
		selenium.start();
		selenium.setTimeout("60000");
		selenium.open("https://Site");
		selenium.waitForPageToLoad("50000");
	}

	@AfterSuite(alwaysRun = true)
	public void tearDown() throws Exception {
	selenium.close();
	}
... сам логин и прочие действия   
 FillFields.fill(); <- вызов метода пользовательского класса
}

Сам класс FillFields упрощенно выглядит так
class FillFields extends SeleneseTestCase{
	private static Selenium selenium;
	

	public static void fill(){
		selenium.type("id8","hello");
	}


}
В рузельтате возращается ошибка
java.lang.NullPointerException
at com.example.tests.FillFields.fill(LoginEnterTest.java:325)
at com.example.tests.LoginEnterTest.testFullRegForm(LoginEnterTest.java:69)

Подскажите как пользоваться функциями селениума из неосновных классов
  • 0

#2 barancev

barancev

    Администратор

  • Admin
  • PipPipPipPipPipPip
  • 6 872 сообщений
  • ФИО:Алексей Баранцев
  • Город:Россия, Москва


Отправлено 19 апреля 2010 - 12:29

Проблема не в Selenium RC, а в TestNG (Вы ведь его используете, верно?)

Дело в том, что @BeforeTest выполняется в другом инстансе, не в том, в котором выполняются тесты. Простой вариант -- сделайте у себя глобальную (static) переменную и сохраните туда ссылку на селениум (в базовом классе SeleneseTestCase она не static):

public static Selenium selenium;

@BeforeTest(alwaysRun = true)
	public void setUp() throws Exception {
		selenium = new DefaultSelenium("localhost", 4444, "*firefox","http://localhost");
		selenium.start();
		selenium.setTimeout("60000");
		selenium.open("https://Site");
		selenium.waitForPageToLoad("50000");
	}

Другие возможные способы: 1) используйте factory-метод или factory-класс (см. литературу про шаблоны проектирования), 2) передавайте ссылку на selenium не через глобальную переменную, а через TestContext (см. документацию по TestNG), 3) используйте Selenium Grid, пусть он сам занимается управлением браузерами.
  • 0
Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium

#3 KaNoN

KaNoN

    АЦЦКИЙ СОТОНА

  • Members
  • PipPipPipPipPipPip
  • 1 260 сообщений
  • ФИО:Колесник Николай
  • Город:Днепропетровск > Киев > Лондон

Отправлено 19 апреля 2010 - 13:53

Да, основная проблема в том, что переменная selenium в классе FillFields не проинициализирована, оттого при попытке ее использовать и возникает NullPointerException. Соответственно, надо позаботиться об её инициализации или же использовать какой-либо другой способ передачи уже проинициализированной величины.
  • 0

#4 enki86

enki86

    Постоянный участник

  • Members
  • PipPipPip
  • 231 сообщений


Отправлено 20 апреля 2010 - 03:33

как вариант сделать отдельный тест-класс SetUP
в нем статичесий selenium, тогда не нужно делать переменную глобальной; получать его get-методом. И, на мой взгляд, это правильнее - отделить непосредственно тестовые действия от selenium инициализации


public class SetUp{

 private static Selenium selenium;
 
 @Test
 @Parameters({"selenium.host","selenium.port","selenium.browser","selenium.url"})
 public void startSelenium(String host, String port, String browser, String url) throws IOException{
	 selenium =  new DefaultSelenium(host, Integer.parseInt(port), browser, url);
	 selenium.start();
	 selenium.open(url);
	 selenium.waitForPageToLoad("60000");
 }
 
 @AfterSuite(alwaysRun=true)
 public void stopSelenium() {
	 selenium.stop();
 }
  
 public static Selenium getSelenium(){
	 return selenium;
 }
}

В таком случае понятно какой selenium и откуда мы получаем (SetUp.getSelenium()), и если suit свалился из-за проблем с selenium'ом - сразу видно где ошибка
  • 0

#5 barancev

barancev

    Администратор

  • Admin
  • PipPipPipPipPipPip
  • 6 872 сообщений
  • ФИО:Алексей Баранцев
  • Город:Россия, Москва


Отправлено 20 апреля 2010 - 05:10

как вариант сделать отдельный тест-класс SetUP
в нем статичесий selenium, тогда не нужно делать переменную глобальной; получать его get-методом. И, на мой взгляд, это правильнее - отделить непосредственно тестовые действия от selenium инициализации

Можно подумать, что если вынести статик-поле в отдельный класс -- оно от этого перестанет быть глобальным :)

А про отделение полностью поддерживаю, отдельный фактори-класс явно лучше, чем глобальная переменная, спрятанная в одном из тестовых классов.
  • 0
Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium

#6 enki86

enki86

    Постоянный участник

  • Members
  • PipPipPip
  • 231 сообщений


Отправлено 20 апреля 2010 - 05:23

несколько неверно выразился
В Java - конечно без разницы ))

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

Вот это очень верное замечание
  • 0

#7 barancev

barancev

    Администратор

  • Admin
  • PipPipPipPipPipPip
  • 6 872 сообщений
  • ФИО:Алексей Баранцев
  • Город:Россия, Москва


Отправлено 20 апреля 2010 - 05:34

И ещё, кажется, Вы допустили небольшую опечатку -- вероятно, перед методом startSelenium Вы имели в виду аннотацию @BeforeSuite, а не @Test.
  • 0
Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium

#8 enki86

enki86

    Постоянный участник

  • Members
  • PipPipPip
  • 231 сообщений


Отправлено 20 апреля 2010 - 06:22

Можно и так, но в TestNG - не имеет принципиального значения.
Мне не очень нравится, когда что-то выполняется как-то... и я это не прописывал,а только декларировал - стараюсь свести к минимуму... Это уже вопрос личных предпочтений и фобий :victory: Если в xml-конфиге SetUp указан первым, то он выполнится первым:

<test name="SetUp">
	 <parameter name="selenium.host" value="SomeHost"></parameter>
	 <parameter name="selenium.port" value="SomePort"></parameter>
	 <parameter name="selenium.browser" value="SomeBrowser"></parameter>
	 <parameter name="selenium.url" value="SomeURL"></parameter>
   <classes>
	 <class name="Package.SetUp"></class>
   </classes>
</test>

... Другие тесты

Хотя, наверное, соглашусь, что это плохая практика для начинающих.
slasva, не слушайте меня.
лучше, как Алексей советует
  • 0

#9 barancev

barancev

    Администратор

  • Admin
  • PipPipPipPipPipPip
  • 6 872 сообщений
  • ФИО:Алексей Баранцев
  • Город:Россия, Москва


Отправлено 20 апреля 2010 - 06:44

Можно и так, но в TestNG - не имеет принципиального значения.
Мне не очень нравится, когда что-то выполняется как-то... и я это не прописывал,а только декларировал - стараюсь свести к минимуму... Это уже вопрос личных предпочтений и фобий :victory: Если в xml-конфиге SetUp указан первым, то он выполнится первым:

Согласно официальной документации, порядок выполнения тестов не гарантируется. Так что -- сейчас выполняется первым, а в следующей версии -- кто знает...
  • 0
Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium

#10 enki86

enki86

    Постоянный участник

  • Members
  • PipPipPip
  • 231 сообщений


Отправлено 20 апреля 2010 - 06:58

Насколько я помню, не гарантируется порядок методов теста, а порядок тестов - очень даже

Что-то мы зафлудили тему...
slasva, извните
  • 0

#11 barancev

barancev

    Администратор

  • Admin
  • PipPipPipPipPipPip
  • 6 872 сообщений
  • ФИО:Алексей Баранцев
  • Город:Россия, Москва


Отправлено 20 апреля 2010 - 07:30

хм... ну, я не нашёл указаний на то, что он гарантируется. хотя, действительно, про методы явно написано, что даже между запусками не гарантируется сохранение порядка, а про тесты не сказано вообще ничего. поэтому лично я бы рисковать всё равно не стал :)
  • 0
Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium

#12 slasva

slasva

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

  • Members
  • Pip
  • 3 сообщений


Отправлено 29 апреля 2010 - 14:47

как вариант сделать отдельный тест-класс SetUP
в нем статичесий selenium, тогда не нужно делать переменную глобальной; получать его get-методом. И, на мой взгляд, это правильнее - отделить непосредственно тестовые действия от selenium инициализации

Так и сделал, всем спасибо за ценные указания
  • 0


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

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