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

RemoteWebDriver vs PageObject


(Александр Беликов) #1

Здравствуйте! Никак не могу победить одну штукенцию. Имеется тест, который заполняет поля на странице (input-ы, select-ы, checkbox-ы). Тест запускается как на windows (локальная машина), так и на Linux(виртуальная машина). Локально используется FirefoxDriver, для удаленного запуска использую RemoteWebDriver. Локально тест проходит успешно, удаленно - не получается отыскать два элемента, пишет что они невидимы “org.openqa.selenium.ElementNotVisibleException: Element is not currently visible and so may not be interacted with”
Все элементы находятся на одной странице - факт. Теперь код:
Вот эта страница с полями, которая заполняется:

public class A extends Page {

public A(PageManager pages) {
    super(pages);
}

@FindBy(name = "firstName")
private WebElement firstName;

@FindBy(name = "secondName")
private WebElement secondName;

@FindBy(name = "lastName")
private WebElement lastName;

@FindBy(name = "country")
private WebElement country;

@FindBy(name = "city")
private WebElement city;

@FindBy(name = "phone")
private WebElement phone;

public A setFirstName(String text) {
firstName.clear();
firstName.sendKeys(text);
return this;
}

public A setSecondName(String text) {
secondName.clear();
secondName.sendKeys(text);
return this;
}

public A setLastName(String text) {
lastName.clear();
lastName.sendKeys(text);
return this;
}

public A selectCountry(String text) {
new Select(country).selectByVisibleText(text);
return this;
}

public A setCity(String text) {
city.clear();
city.sendKeys(text);
return this;
}

public A setPhone(String text) {
phone.clear();
phone.sendKeys(text);
return this;
}

Поля city и phone - невидимы.
Эти поля заполняются так:

@Override
public void createUser(User user) {
    pages.adminMainPage.gotoUserPage().gotoAddNewUser()
            .setFirstName(user.getFirstName())
            .setSecondName(user.getSecondName)
            .setLastName(user.getLastName)
            .selectCountry(user.getCountry)
            .setCity(user.getCity)
            .setPhone(user.getPhone)

Класс AdminMainPage выглядит следующим образом:

public class AdminMainPage extends Page {

private PageManager pages;

public AdminMainPage(PageManager pages) {
    super(pages);
    this.pages = pages;
}

@FindBy(linkText = "Пользователи")
private WebElement userLink;

Класс Page

public abstract class Page {

protected WebDriver driver;
protected PageManager pages;

public Page(PageManager pages) {
    this.pages = pages;
    driver = pages.getWebDriver();
}

И наконец PageManager

public class PageManager {

private WebDriver driver;

public A aPage;
public AdminMainPage adminMainPage;

public PageManager(WebDriver driver) {
this.driver = driver;
aPage = (A) initElements(new A(this));
adminMainPage = (AdminMainPage) initElements(new AdminMainPage(this));

protected Page initElements(Page page) {
PageFactory.initElements(new AjaxElementLocatorFactory(driver, 10), page);
return page;
}

public WebDriver getWebDriver() {
    return driver;
}

Гуглив, натыкался на похожие случаи, неверная инициализация элементов страницы, якобы значение драйвера выставлялось в null. Мне непонятно как на одной странице 4 элемента находятся, а остальные два нет.


(vmaximv) #2

Руками на удаленной машине проверяли?


(Александр Беликов) #3

Поясните, что значит руками? Вручную открыть браузер, протыкать все, или зайти на виртуалку и выполнить тест? Дело в том, что если второй вариант, т.е из под виртуалки выполнять, то нужно будет использовать FirefoxDriver, а он работает отлично(проверялось на linux + FFDriver). Я подозреваю дело в связке RemoteWebDriver + @FindBy.


(vmaximv) #4

Дойти до места фейла скриптов (можно руками, можно через дебаг) и выяснить почему данные контролы невидимые.

[quote=“belikov_as88, post:3, topic:5083”]
Я подозреваю дело в связке RemoteWebDriver + @FindBy.
[/quote]Очень-очень маловероятно. Единственное, что можно проверить - это версии селениума/браузера/джавы на удаленной и локальной машине.


(Александр Беликов) #5

Зашел на виртуалку, с иксами, все корректно отображается, поля видимые, рабочие.


(Александр Беликов) #6

Стартанул hub на локальной машине, под windows, подцепил ноду, используя RemoteWebDriver запустил тест. Тест прошел. Не понимаю почему не проходит под debian. Что такого может быть отличительного?


(Александр Таранков) #7

Паузы пробовал вставлять перед работой с элементом? Для эксперимента попробуй sleep поставить, если заработает, значит дело банально в задержке при работе с удаленным драйвером