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

Вы имеете ввиду:

public LoginPage loginPage = PageFactory.initElements(getWebDriver(),

LoginPage.class);

В какой момент этот объект создается?

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

А статиков точно нигде нет? И да, для чего такое обращение к инстансу getWebDriver()?

 

Здесь был статический, поменял:
public RemoteWebDriver driver;
 
public Page(RemoteWebDriver driver) {
Page.driver = driver;
}
 
но теперь Page.driver = driver; ругается Cannot make a static reference to the non-static field Page.driver

так а откуда Page.driver? this.driver же или просто driver

Да, вы пытаетесь осуществить статический call нестатического поля. Правильно написали выше - нужно this.driver указать.

Плюс ко всему, у вас концептуальная ошибка: вы вначале инициализируете драйвер в BeforeClass, а потом для каждого пейдж обджекта повторяете данную процедуру. Т.е. все ваши страницы попытаются создать свой личный инстанс.

Назовите метод инициализации initDriver(), сделайте его void. Если хотите получать инстанс, создайте геттер вытягивающий именно значение вашего private филда драйвера, но не делайте лишних инициализаций. Просто попробуйте понять одну вещь: на 1 тест вам нужен всего 1 инстанс драйвера, который благополучно создастся при наследовании тестом вашего класса-инициализатора. Все, дальше просто передавайте созданный инстанс по страницам и будет вам счастье.

Спасибо, буду разбираться. 

Пока что одни эксепшены. Запутался с этими драйверами. 

ПС: а BeforeClass я добавил уже после прочтения темы. Думал, что поможет. Изначально его и не было. 

Получилось. Запускается три копии браузера и на них проходят три набора тестов. 

Сейча попробую запустить с гридовским RemoteDriver'ом.

 

А вот с RemoteDriver'ом не получается:

 

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 driver;
}
 
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
Caused by: java.lang.RuntimeException: java.lang.InstantiationException: com.test.pages.LoginPage
at org.openqa.selenium.support.PageFactory.instantiatePage(PageFactory.java:136)
Caused by: java.lang.InstantiationException: com.test.pages.LoginPage
at java.lang.Class.newInstance0(Unknown Source)

 

Его нужно как-то по особенному объявлять, инициализировать? "Обычный" WebDriver успешно работал. 

А точно больше ничего не меняли?

Сложно что-то конкретно сказать по этому стек трейсу, но я бы начал с org.openqa.selenium.support.PageFactory.instantiatePage(PageFactory.java:136)

Плюс, можно ваш метод можно попробовать заставить возвращать не RemoteWebDriver, а просто WebDriver. Т.е.: public WebDriver getWebDriver() {}

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

Извините за дилетантский вопрос. К примеру, я обозвал метод  " public RemoteWebDriver getWebDriver() {....

                                                                                 ...}. 

Нужно ли  public WebDriver driver; - переименовывать на public RemoteWebDrive driver; ? Просто я в соответствии с public RemoteWebDriver getWebDriver() {....

                                                                                 ...}.  переименовал в классах   объявления вида

 

public abstract class Page {
 
public WebDriver driver;
 
public Page(WebDriver driver) {
this.driver = driver;
}
 
на  RemoteWebDrive;

Добрый день.

Вознкла проблема при запуске теста на удаленной машине с помощью Grid'а. 

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

 

Caused by: org.openqa.selenium.remote.ErrorHandler$UnknownServerException: Unable to connect to host 127.0.0.1 on port 7055 after 45000 ms. Firefox console output:

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

Может, проблема с драйвером?

 

public WebDriver 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;
}

какой сервер? jenkins? ОС linux? добавьте в shell след команду:

export DISPLAY=:99

Запускал через eclipse и maven. Jenkins еще не трогал. 

На машине с первой нодой - WinXP, на машине со второй - win server 2008 R2.

Команду добавить к чему?