Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

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

selenium-grid
Теги: #<Tag:0x00007f7b62533308>

(Валерий) #1

Доброго времени суток!  Уважаемы друзья, очень нужна помощь в настройке Selenium Grid2. Делал все по этой инструкции http://code.google.com/p/selenium/wiki/Grid2.

Что сделано: написаны тесты которые работают в IDE, запущен хаб командой  java -jar selenium-server-standalone-2.26.0.jar -role hub, запущен нод командой   java -jar selenium-server-standalone-2.26.0.jar -role node -hub http://123.123.123.123:4444/grid/register.

В консолях нет ошибок. При запуске в IDE тестов - открываются 5 окон FF, в одном начинает выполняться  первый тест.

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

Подскажите в чем проблема ? у меня такое ощущение что дело в коде самих тестов, но пока не удалось понять где именно.

 


(Sergey Korol) #2

Я надеюсь, IP просто замаскирован? :)

Думаю, что частично проблема в ноде, частично - в способе распараллеливания тестов. Покажите testng.xml и код с инициализацией RemoteWebDriver. А еще добавьте в нод настройки браузера: имя, версия, платформа, сколько инстансов и сессий будет поддерживать и т.п. Так хоть будет понятно, чей нод вы запускаете. Плюс ко всему, не для FF вам еще придется и путь к драйверу указывать.


(Валерий) #3

IP - разумеется ))

Дело в том что я использую JUnit и файла testng.xml у меня нет. Запускаю тесты из IDE.

Инициализация драйвера:

 

public class BasicTestCase {
    protected static WebDriver driver;
 
    public UserData user = new UserData(ConfigProperties.getProperty("USER_LOGIN"),
                                     ConfigProperties.getProperty("USER_PASSWORD"));
 
    protected WebDriver getWebDriver() {
        DesiredCapabilities capability = DesiredCapabilities.firefox();
        try {
            driver = new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"), capability);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        return driver;
    }
 
    @AfterClass
    public static void tearDown() throws Exception {
        driver.quit();
    }
 
}
 
Настройки добавлял но был нюанс - указывал кол-во инстансов 1 и тест почему то не запускался, точнее  запускался просто экземпляр браузера но в нем не было теста. Такое ощущение что хаб рандомно выбирает в каком браузере запустить тест и ничего не знает о моих настройках нода.
 
Касаемо других браузеров - спасибо за предупреждение, учту. Сейчас пока хватит гемора и с FF )))
 
 

(Pnevmoslon) #4

Очень похоже, что проблема в том, что driver объявлен как static. Локально пробовали запускать тесты параллельно?


(Валерий) #5

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


(Валерий) #6

Еще одни вопрос - городить этот огород из grid  начал потому что запускать тесты будет Jenkins, там нет GUI, ставить эмуляторы по ряду причин туда не получается, можно ли как то по старинке, как selenium RC передать команды на удаленную машину но не использовать Grid ?


(Pnevmoslon) #7

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

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


(Pnevmoslon) #8

Можно.

DesiredCapabilities capability = DesiredCapabilities.firefox();

URL hostURL = new URL("http://localhost:4444/wd/hub");

WebDriver driver = new RemoteWebDriver(hostURL, capability);

 

Ну а на удалённом компе запустить selenium-server без параметров.


(Sergey Korol) #9

В принципе, уже на все ваши вопросы ответили, но основные ошибки так и остались нерешенными. Статический драйвер не позволит вам реализовать масштабирование, т.к. статическая переменная принадлежит классу, а не его экземпляру. Чтобы долго не бродить вокруг да около, драйвер сделайте приватным и не статическим. Инициализацию сведите под аннотацию @BeforeClass. Масштабирование реализуйте либо связкой testng + ant / maven, либо junit + maven. Подправьте нод, указав соответствующие параметры браузера. Пока не разберетесь с этим, можете даже не смотреть в сторону дженкинса, ибо в любом случае вам придется настраивать maven / ant / testng / репозитарий.


(Валерий) #10

Спасибо за участие, друзья, меня к сожалению сейчас оторвали от процесса - через пару дней вернусь, попробую и отпишусь.


(Валерий) #11

Вернулся, попробовл. Рельтаты пока нехорошие. Проблема  в том, что аннотацию @BeforeClass и @Before требует указать метод инстанса драйвера как public static void, а у меня в тестах используется класс  PageFactory, методу которого initElements нужно передать драйвер. Касаемо параллельно запуска тестов - не пробовал так запускать, потому ка кнужно было только последовательно. К grid я пришел не для распаралеливания тестов а для удаленного запуска.  Я наверное всех запутал))) уж извините, не программист, только учусь).  Вот как реализованы тесты:

public class AuthorizationTest extends BasicTestCase {
    private LoginPage loginPage = PageFactory.initElements(getWebDriver(), LoginPage.class);
    private HomePage homePage = PageFactory.initElements(getWebDriver(), HomePage.class);
 
    @Test
    public void openPage() throws Exception {
        loginPage.open();
        assertTrue(loginPage.isLoginPagePresent());
    }
 
    @Test
    public void logIn() throws Exception {
        homePage = loginPage.loginAs(user);
        assertTrue(homePage.isLoggin());
    }
 
 
Что скажите ?

 


(vmaximv) #12

 

1) А зачем Вы методы @Before|@After объявляете статиком? Избавтесь от статических деклараций - 90% что все проблемы изчезнут

2) 

private LoginPage loginPage = PageFactory.initElements(getWebDriver(), LoginPage.class);
private HomePage homePage = PageFactory.initElements(getWebDriver(), HomePage.class);

Зачем городить огород и выносить такую "некрасивость" в тесты?

Гораздо проще будет делать так:

class BasePage{

private WebDriver driver;

private BasePage(WebDriver _driver){

  driver = _driver;

  PageFactory.initElements(driver, this);

}

public BasePage(BasicTestCase _baseTest){

  this(_baseTest.driver);

}

}

public class AuthorizationTest extends BasicTestCase {

@Test
public void openPage() throws Exception {
new LoginPage(this).open();
assertTrue(loginPage.isLoginPagePresent());
}

@Test
public void logIn() throws Exception {
new HomePage(this).loginAs(user);
assertTrue(homePage.isLoggin());
}


(Pnevmoslon) #13

По поводу static вам уже посоветовали. Должно помочь.

А касательно grid. Если вам не нужно параллельно запускать тесты, зачем его вообще использовать?


(Валерий) #14

Что касается  1) -  этого требует JUnit. Попытка добавить аннотацию @BeforeClass и запуск теста в IDE:

     java.lang.Exception: Method getWebDriver() should be static

 Что касается  2) - пока не совсем понял что нужно с этим классом делать. Разбираюсь. 

(Валерий) #15

Я начал как раз с простого - запустил у себя сервер без указания хаба или нода (java -jar selenium-server-standalone-2.26.0.jar )  и запустил класс с тестами в IDE. В итоге запустилось 5 окон и первый тест, а дальше все повисло. Посчитал что дела в сервере. Погуглил на тему удаленного запуска и решил пробовать grid. Но результат оказался тот же.  Чувствую что дело в именно в реализации моих базовых классов и тестов....  сегодня  еще наткнулся на проблему при создании test suit, ситуация очень схожа - один класс с тестами запускается, второй нет. Проблема с аннотацией. Дело все в том что реализацию тестов, скажем так, скопипастил с "Андрей Дзыня - Строим Web Testing Framework за 20 минут" ))  Пока все запускалось локально - проблем небыло. Теперь вот не знаю что и делать, с одной стороны старые примитивные тесты работали, с другой PageFactory очень вкусная штука, не хотелось бы отказываться. 


(Pnevmoslon) #16

Обнаружил у вас занятный метод:

 

 

protected WebDriver getWebDriver() {
        DesiredCapabilities capability = DesiredCapabilities.firefox();
        try {
            driver = new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"), capability);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        return driver;
    }
 
Он стартует новый браузер каждый раз, когда вы его дёргаете. Думаю проблема именно в нём :)

(Sergey Korol) #17

Вот тут уберите static и замените protected на private:

protected static WebDriver driver;

vmaximv посоветовал вам отделить тестовую логику от технической составляющей. В идеале нужно стремиться к тому, чтобы классы тестов не содержали никаких намеков на PageFactory, инициализацию драйвера и т.п. Все это должно быть зашито внутрь вашего фреймворка. Нередко заказчики под фреймворком понимают систему, которая будет являться простым интерпритатором для людей, в принципе не особо умеющих программировать. Грубо говоря, если туда посадят обезъянку, то при помощи небольшого одностраничного гайда она должна суметь написать простенький тест, используя ваш фреймворк. Но для реализации такой модели вам придется строить несколько уровней абстракции для максимального сокрытия лишних для неподкованного юзера вызовов.


(Валерий) #18

Пробовал, но после метода getWebdriver есть метод 

 

@AfterClass
    public static void tearDown() throws Exception {
        driver.quit();
    }
 
он ругается на то что  "не статическое поле не может быть вызвано из статического контекста "(перевод дословный),  а изменить этот метод  на не статический не дает JUnit аннотация(( как это дилему обойти не знаю.  
Что касается фреймворка - возможно мне и не нужны слишком жесткие уровни абстракции  тестов и данных. Раньше мы писали мелкие методы, которые  содержали простые действия и локаторы. Потом объеденяли их в боле крупные. Проблема была в сложной поддержке этого говнокода   кода. Увидев как можно реализовать тесты с помощью PageFactory -  проникся. Сейчас есть классы страниц в которых через аннотацию @FindBy описаны элементы страницы. Эти же классы содержат проверки наличия таких элементов. Тесты находятся в отдельных классах и содержат только поля вида private LoginPage loginPage = PageFactory.initElements(getWebDriver(), LoginPage.class);  и сами тесты. В принципе все удобно если бы не 2 НО - запуск тестовых сюит и удаленный запуск. Мое неважнецкое знание java, как видите, сыграло злую шутку. Нет ли   у кого на примете ссылки на подобную но "более рабочую" реализацию тестов ? 

(Валерий) #19

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

 

public WebDriver getWebDriver() {
 
        if (driver == null) {
            driver = new FirefoxDriver();
            driver.manage().timeouts().implicitlyWait(Long.parseLong(ConfigProperties.getProperty("IMP_WAIT")), TimeUnit.SECONDS);
        }
        return driver;
 
 
 

(Sergey Korol) #20

Не может JUnit ставить подобного рода ограничения на аннотированные методы. Что-то тут не так. Поубирайте везде статические объявления. Возможно где-то забыли подтереть.

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