Как заставить Selenium и TestNG открыть один браузер для запуска тестов в нескольких классах - PullRequest
3 голосов
/ 19 июля 2009

Я использую Selenium с TestNG для тестирования сайта. Я создал тесты с использованием Selenium IDE и экспортировал их в TestNG, где каждый тест был методом в классе. Например,

Для тестов входа в систему существует класс Login, который имеет методы testLogin (), testLogin2 () и т. Д. Для тестов регистрации есть класс Registration, в котором есть методы testSignup (), testSignup2 () и т. Д.

Я использую Ant для запуска тестов, который работает нормально, за исключением того, что каждый класс открывает браузер и затем запускает его методы, например, если у меня есть пять классов, то одновременно открываются пять браузеров и затем запускаются тесты. 1005 *

Я хочу, чтобы Ant / Selenium / TestNG просто открыл один браузер и затем запустил все тесты (в том же браузере) во всех классах, которые я указал в testng.xml. Используя приведенный выше пример, я хочу, чтобы один браузер открылся, затем запустил testLogin (), testLogin2 (), testSignup (), testSignup2 (). Если это невозможно, я хочу открыть браузер, запустить все тесты в классе, затем закрыть браузер, затем открыть другой браузер и запустить набор методов тестирования в следующем классе.

Любая помощь приветствуется. Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 01 сентября 2009

Сегодня я нашел ответ, который работает для меня. Дайте мне несколько минут, чтобы собрать все примеры кода:)

Init.java

//base class that will be called before all tests
@Test(groups = "init")
public class Init{

    DefaultSelenium browser;

    public void start(ITestContext itc){
        browser = (DefaultSelenium) itc.getAttribute("browser");
        browser.open("url");
        browser.click("xpath");
    }

}

TemplateForClasses.java

/* - all public methods will be tests
 * - all tests will be called after group init
 * - just before suite will start we will start 1 browser instance
 */
@Test(dependsOnGroup="init")
public class TemplateForClasses{

    DefaultSelenium browser;

    @BeforeSuite
    public void startBrowser(ITestContext itc){
        browser = new DefaultSelenium(host,port,browser_type,url);
        itc.setAttribute("browser",browser);
        browser.start();
    }

    @AfterSuite
    public void stopBrowser(ITestContext itc){
        browser = (DefaultSelenium) itc.getAttribute("browser");
        browser.stop();
    }

    //any other: @Before, @After methods

}

FirstGroupOfTests.java

//all tests classes will inherit preferences set in TemplateForClasses
public class FirstGroupOfTests extends TemplateForClasses{

    public void FirstTest(ITestContext itc){
        browser = (DefaultSelenium) itc.getAttribute("browser");
        //browser.click("start");
    }

}

идея:

  • запустить браузер только один раз, чтобы иметь тесты
  • , которые запускаются перед любыми другими тестами (isBrowserRunning)
  • ссылка на браузер из одиночного теста

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

Обновление: Этот результат основан на документации testng.org + некоторые вопросы, которые я задавал о stackoverflow + некоторые ответы, найденные на нескольких форумах / группах

Я должен добавить, что я запускаю testng программно и генерирую xml на лету (как это делается на Documentation.org). Я использую все это в одном пакете, я добавил пакет в XML, включил только классы Init + те, которые наследуются от TemplateForClasses. Если вам нужен этот xml, дайте мне знать.

0 голосов
/ 25 августа 2010

Я сделал это с помощью инъекции зависимостей Spring. И код инициализации находится на заводе. Мне нужен был способ, чтобы экземпляр Selenium делился не только между тестами, но и между вспомогательными классами. Очень редко, когда selenium.someMethod () вызывается непосредственно в тестах. Это больше похоже на helper.goToSomePage () или ПредпочтенияPage.changePassword (....).

Можно было бы считать плохой идеей разделять экземпляр Selenium между тестами, но те несколько ошибок, которые он принес, не было так сложно найти. Тесты выполняются последовательно, и объект Selenium не обязательно должен быть потокобезопасным. Состояние объекта должно быть согласованным.

Для информации, Spring - это среда Java, а внедрение Dependency - только часть этого. Вместо этого, конечно, можно использовать другие DI-фреймворки, такие как Guice.

0 голосов
/ 04 сентября 2009

Я тоже застрял в той же проблеме на некоторое время. Я объясню это в самых простых возможных терминах. Рассмотрим следующий пример:

Class A (contains the code selenium.start();)
|
|(inherited classes)
|--------class B   }
|--------class C   }  Have some @Test methods
|--------class D   }

Теперь каждый раз, когда мы запускаем эти тестовые методы, он выполняет код в конструкторе родительского класса selenium.start (); Вот когда на вашем экране откроются все браузеры.

Теперь один за другим будут выполняться тестовые методы - предположим, что тесты в классе B выполняются, они будут происходить в одном окне, для класса C - в другом и т. Д.

Таким образом, по сути, все, что вам нужно сделать, это удалить код start () из родительского конструктора и поместить его где-нибудь в классы B, C и D.

Пока вы продолжаете работать с одним объектом селена, все будет происходить в одном окне браузера. Когда вы положили начало (); этот браузер откроется (если он не был открыт) и будет создан новый сеанс. стоп(); и сеанс прекращается.

Поток управления идет следующим образом =>

Class A, Class B
Class A, Class C
Class A, Class D

Таким образом, если вы сможете найти способ продолжать использовать один и тот же объект селена только с 1 start () и 1 stop () для всей последовательности выполнения, показанной выше, выполнение теста будет происходить только в одном окне браузера.

Если вы поместите код start () в класс A и код остановки в каждый из B, C и D, то у вас будет открыто 3 окна, и одно за другим они будут закрываться по мере выполнения.

Если вы поместите код start () и stop () по отдельности в B, C и D, то вы увидите одно открытие браузера, выполнение тестовых случаев, закрытие. Затем откроется другой, выполнит контрольные примеры для C, закроет и т. Д.

Надеюсь, это поможет. : -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...