Удаленка для jenkins+selenide+selenoid+allure+docker спецов на 2-3 часа в день. 100% remote! Присоединиться к проекту

Подсчет кол-ва web элементов через Page Factory

page-factory
page-object
webdriver
Теги: #<Tag:0x00007fedb831a508> #<Tag:0x00007fedb831a3c8> #<Tag:0x00007fedb831a238>

(Test17) #1

Всем привет!
Переписываю проект под Page Factory и столкнулась с такой проблемой: не могу получить верное кол-во веб элементов.
В Page Object все прекрасно работало, кол-во элементов считалось верно.Как я реалиовывала подсчет через Page Obj:
private final By _tableRows = By.xpath("//table/tbody/tr");

private List tableRows () {
return driver.findElements(_tableRows);
}

public int countOfRow() {
return tableRows().size();
}

Все довольно банально и просто, казалось бы. Однако, на PageFactory я столкнулась с проблемой, попытка моего подсчета возвращает ошибку
java.lang.NullPointerException
** at com.test.MessageListPage.countOfRow**

Реализация на PageFac:

@FindBys(@FindBy (xpath = “//table/tbody/tr”))
private List tableRows;

public int countOfRow() {
return tableRows.size();
}

Так же пыталась объявить список элементов через
private List tableRows=new ArrayList();

пробовала также использовать @FindBy, но ничего из этих способов не помогло.

Сталкивался ли кто-нибудь с такой ситуацией и есть ли у нее решение?


(Vladimir) #2

а ты делала PageFactory.initElements ?


(Test17) #3

да, конечно


(Taras) #4

скиньте весь код целиком, Page Factory просто делает lazy init елементов, - сомневаюсь что что то с с етим связано, скорее всего initElements неправильно используеться


(Test17) #5

public class MessageListPage {

protected WebDriver driver;

@FindBy(className = "home")
private WebElement homeButton;

@FindBy(className = "create")
private WebElement newMessageButton;

@FindBy (linkText = "Logout")
private WebElement logoutButton;

@FindBy(xpath = "//div[@class='body']/h1")
private WebElement title;

@FindBy(xpath = "//div[@class='body']/div[@class='nav']")
private WebElement navPartOfPage;

@FindBy(xpath = "//div[@class='body']/div[@class='message']")
private WebElement welcomeMessage;

@FindBy(xpath = "//div[@class='nav']/span[@class='leftSpan']/input[@type='checkbox']")
private WebElement checkBoxShowMess;

@FindBys(@FindBy (xpath = "//table/tbody/tr"))
private List<WebElement> tableRows;


public MessageListPage(WebDriver driver) {
    this.driver =  driver;
    PageFactory.initElements(driver, this);
}

public void assertIsOpened() {
    Assert.assertTrue(navPartOfPage.isDisplayed(), "Message List page is not opened");
}


public CreateMessagePage createNewMessage() {
    newMessageButton.click();
    return new CreateMessagePage(driver);
}

public HomePage returnToHome() {
    homeButton.click();
    return new HomePage(driver);
}

public LoginPage logout() {
    logoutButton.click();
    return new LoginPage(driver);
}

public int countOfRow() {
   int a = tableRows.size();
    return a;
}

}


(Test17) #6

многи методы вырезала, т.к класс очень большой


(Юрий) #7

Попробуйте вместо
@FindBys
использовать просто @FindBy(xpath="…"), он тоже возвращает лист, если укажете, или @FindAll(xpath="…").