Помогите настроить WebDriver + Grid

Может. Это ограничение касается @BeforeClass и @AfterClass

Ага, уже прочитал. Сам использую testng. Слышал о разных отличиях c junit, но о статичности конкретно @Before- / AfterClass аннотированных методов - впервые.

Попробуйте тогда с testng поиграться. Принципиальных отличий не увидите, но от ограничения по статичности избавитесь.

Поковырял немного свой "фреймворк"  по вашим советам - так и не заработал. Дело в реализации, к сожалению. Буду разбираться.  Пока переписал "по старинке", без использования PageFactory и PageObject  - класс тестов, класс страниц + UI map в виде полей String. Не эффективно и не красиво, но работает железно ))). Скорость разработки, как не печально, иногда решающий фактор. Удаленный запуск проходит, тест-сюиты тоже работают. По части testng - действительно интересная вещь, попробую. Фреймворк же оставлю на попозже. Спасибо всем большое за помощь, часть ошибок, благодаря вам учел и исправил.

Добрый день. 

Если никто не против, я продолжу эту тему.

Просьба помочь разобраться с паралельным запуском тестов + grid.

По совету ArtOfLife решил настроить паралельный запуск тестов. Ниже содержание XML testng.xml

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
 
<suite name="Suite for multithread execution" parallel="tests" thread-count="1">
    <test name="Run on first instance">
        <classes>
            <class name="com.test.test.LoginTest"/>      
        </classes>
    </test>
    <test name="Run on second instance">
        <classes>
            <class name="com.test.test.LoginTest"/>            
        </classes>
     </test>
    <test name="Run on third instance">
        <classes>
            <class name="com.test.test.LoginTest"/>                 
        </classes>
     </test>
</suite>
 
Инициализация драйвера:
@BeforeClass
      public RemoteWebDriver getWebDriver() {
if (driver == null) {
DesiredCapabilities capability = DesiredCapabilities.firefox();
try {
driver = new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"), capability);
} catch (MalformedURLException e) {
e.printStackTrace();
}
driver.manage().timeouts().implicitlyWait(Long.parseLong(ConfigProperties.getProperty("imp.wait")), TimeUnit.SECONDS);
}
return (RemoteWebDriver) driver;
}

В итоге тест запускается только в одном экземпляре браузера. 

 

Suite for multithread execution
Total tests run: 36, Failures: 2, Skips: 22 - т.е. тесты прошли только один раз из трех.
 
Запускал тесты не используя "гридовский драйвер", но результат не поменялся. Визуально это выглядит так: запускаются три копии файерфокса, потом две закрываются и тест проходит на одной. 
@BeforeClass
public WebDriver getWebDriver() {
if (driver == null) {
driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(Long.parseLong(ConfigProperties.getProperty("imp.wait")), TimeUnit.SECONDS);
 
}
return driver;
}

 

 

На первый взгляд проблема тут: thread-count="1". Увеличьте кол-во потоков до необходимого вам параметра запускаемых параллельно тестов. Плюс ко всему, нужно настроить браузер в ноде, указав максимальное число инстансов и сессий.

Запускал с разными значениями thread-count. Результат не поменялся. Ноду поднимал так:

java -jar selenium-server-standalone-2.28.0.jar -role node  -hub http://localhost:4444/grid/register -browser browserName=firefox,version=18.0.2,maxInstances=5,platform=XP

А драйвер у вас случайно не static?

Не, менял на Public. Выше в моем сообщении видно. 

Не видно. Меня интересует не метод, возвращающий инстанс драйвера, а само объявление:

private static RemoteWebDriver driver;

Вот если он у вас статический, жить он будет в единственном экземпляре, независимо от кол-ва созданных объектов. Так вот, проверьте, стоит ли у вас static в объявлении.

Извините, не все скопировал:

public RemoteWebDriver driver;

 

А запускаете вы как все это дело? Ant, Maven? Уверены, что ваш testng.xml подгружается?

Для начала я хотел проверить запуском с Eclipse. Run Configuration\Suite - testng.xml

Попробуйте в ноде еще указать maxSession параметр:

-browser "platform=WINDOWS,browserName=firefox,version=18,maxInstances=3,ensureCleanSession=true -maxSession 10 -nodeTimeout 30"

MaxSession This says....how many browsers (Any Browser and any version) can run in parallel at a time in the remote system. So this overrides the Max Instances settings and can restrict the number of browser instances that can run in parallel.

А покажите код теста пожалуйста

Не помагает. Все так же запускает три копии браузера, но только доходит до теста остальные два вырубает и проходит на одном. 

 

@Test
public void testLogin() throws Exception {
loginPage.open();
StringBuilder result = new StringBuilder();
homePage = loginPage.loginAs(admin);
assertSoftFalse(homePage.checkError(), "Default error", result);
assertSoftFalse(homePage.errorException(), "Exception", result);
assertSoftFalse(homePage.errorAvailable(), "Unavailable", result);
assertSoft(homePage.checkAccount(), "Account is null", result);
assertSoft(homePage.checkBalance(), "Balance is null", result);
assertEmpty(result);
}
 
Остальные похожие. Обычная бродилка по разделам. 

А как вы связываете инстанс драйвера с пейдж обджектом? Где и на каком этапе формируются инстансы пейджей?

Да, покажите где и как вы используете объект драйвера, создаваемый перед тестом