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

Передать значение @FindBy в другой метод

selenium
webdriver
testng
java
Теги: #<Tag:0x00007f7b6273f250> #<Tag:0x00007f7b6273f0c0> #<Tag:0x00007f7b6273ef30> #<Tag:0x00007f7b6273e580>

(Roman Ss) #1

Только начал изучать PageObject и не могу понять как передать значение @FindBy в другой метод

package Pages.TestPackage;

import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.How;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

public class FindByClass {


    @FindBy(how = How.XPATH,using = ".//*[@id='text']")
    private WebElement search;


    public FindByClass fieldSearch(){
        return  this;
    }
}

package Pages.TestPackage;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.support.PageFactory;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

public class FirstPage {

    private WebDriver driver;

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

    public void waiter(String someXpathLocator){
        WebDriverWait wait=new WebDriverWait(driver,10);
        wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath(someXpathLocator)));
    }

}


package Pages.TestPackage;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

public class TestClass {
    private WebDriver driver;

    @BeforeClass
    public void open(){
        driver=new FirefoxDriver();
        driver.get("https://yandex.ua/");
        driver.manage().window().maximize();
    }
    @Test
    public void fieldSearch(){
        FirstPage firstPage=new FirstPage(driver);
        FindByClass findByClass =new FindByClass();
        firstPage.waiter(findByClass.fieldSearch());
    }

    @AfterClass
    public void close(){
        driver.close();
    }
}

Как можно в класс TestClass передать значение @FindBy с класса FindByClass


(Evgenii) #2

Зачем?


(Roman Ss) #3

ну например что бы не использовать Thread.sleep а нормальный waiter
В том то и основная парадигма паттерна PageObject что бы разделить все на отдельные классы и использовать локаторы где угодно но при изменении его поменять только в одном месте + тестовый класс сделать сделать максимально читаемый простым


(Roma Marinsky) #4

Описывай ожидания для элементов в соответствующем классе PO, в соответствующем методе для манипуляции. Или в идеале вынеси ожидание любого элемента в отдельный класс типа ElementFinder - в котором будет и поиск элемента и базовое ожидание видимости


(Roma Marinsky) #5

ну или попробуй с помощью обёрток писать тесты и свои PO, типа JDI, FluentLenium, Selenide
У них встроенные ожидания и много удобных методов для манипуляций и кастомных ожиданий


(Дмитрий Мирошник) #6

Обычно с помощью @FindBy описываются элементы на странице в классах наследниках Page (в твоём примере FirstPage), затем в тестовом классе просто работаешь с полями, представляющими элементы на странице.
Что-то типа такого:

class TestPage (Page) {
  @FindBy(how = How.XPATH,using = ".//*[@id='text']")
  public myElement (webElement)
}

class TestClass {
  @Test
  public void someTest () {
    TestPage myPage = new TestPage();
    myPage.myElement.doSomething()
  }
}

Ну и так далее.


(Ramon Menezes) #7

В идеале необходимо разделять методы по уровням

class TestPage (Page) {
@FindBy(how = How.XPATH,using = “.//*[@id=‘text’]”)
public webElement myElement ;
public void testMethodForExampleFillField(){
myElement.val(“val”)
}
}
class TestClass {
@Test
public void someTest () {
TestPage myPage = new TestPage();
myPage.testMethodForExampleFillField();
}
}