Не понимаю необходимости использования класса PageFactory. По-моему, без него все выглядит гораздо проще и логичнее. Ну вот, например, создадим два класса: PageObjectWithPageFactory и PageObjectWithoutPageFactory и воспользуемся ними для работы с объектом PageObject.
В первом случае имеем:
package selenium; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; import org.openqa.selenium.support.How; public class PageObjectWithPageFactory { WebDriver driver; @FindBy(how=How.ID, id="lst-ib") WebElement fieldSearch; @FindBy(how=How.NAME, name="btnK") WebElement btnSearch; public PageObjectWithPageFactory(WebDriver driver){ this.driver = driver; driver.get("https://www.google.com.ua"); } public void find(){ fieldSearch.sendKeys("Искать что-нибудь"); btnSearch.click(); } }
и соответственно его реализация:
public class Selenium { public static void main(String[] args) { WebDriver driver = new FirefoxDriver(); PageObjectWithPageFactory page = PageFactory.initElements(driver, PageObjectWithPageFactory.class); page.find(); } }
Во втором случае:
package selenium; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; public class PageObjectWithoutPageFactory { WebDriver driver; WebElement fieldSearch; WebElement btnSearch; public PageObjectWithoutPageFactory(WebDriver driver){ this.driver = driver; driver.get("https://www.google.com.ua"); fieldSearch = driver.findElement(By.id("lst-ib")); btnSearch = driver.findElement(By.name("btnK")); } public void find(){ fieldSearch.sendKeys("Искать что-нибудь"); btnSearch.click(); } }
и его реализация:
public class Selenium { public static void main(String[] args) { WebDriver driver = new FirefoxDriver(); PageObjectWithoutPageFactory page = new PageObjectWithoutPageFactory(driver); page.find(); } }
Все абсолютно одинаково вплоть до количества строчек кода, но во втором случае все логичнее и понятнее и без всяких дополнительных классов PageFactory.