Cách viết custom PageFactory

Như đã nói ở bài trước, cách viết custom PageFactory có 1 mục đích là 1 bước verify rằng chúng ta đang khởi tạo đúng Page, trước khi chúng ta gọi các method của Page đó.

I. Cách sử dụng PageFactory thông thường

public class LoginPage {
	
	@FindBy (id = "user_login")
	WebElement user_login;
	
	@FindBy (id = "user_pass")
	WebElement user_pass;
	
	@FindBy (id = "wp-submit")
	WebElement submitBtn;

	WebDriver driver;

	public LoginPage(WebDriver driver) {
		this.driver = driver;
		PageFactory.initElements(driver, this);
	}
}
@Test
public void login_test(){
	LoginPage login = new LoginPage(driver);
	...
}

II. Cách custom PageFactory

@Verify(title = "Log In", css="#user_login") //add annotation @Verify
public class LoginPage {
	
	@FindBy (id = "user_login")
	WebElement user_login;
	
	@FindBy (id = "user_pass")
	WebElement user_pass;
	
	@FindBy (id = "wp-submit")
	WebElement submitBtn;

	WebDriver driver;

	public LoginPage(WebDriver driver) {
		this.driver = driver;
        //no need PageFacetory here
	}
}

Check 2 điều kiện khi khởi tạo page:

  • check title của page có chứa text “Log In
  • và 1 element có cssSelector “#user_login
  • Verify.java
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Verify {
  String INVALID_TITLE = "\0"; (1)
  String title() default INVALID_TITLE;
  
  String INVALID_CSS = "\0"; (2)
  String css() default INVALID_CSS;
}
  • (1): default title cho page, để nếu không điền giá trị nào vào @Verify thì vẫn ko bị lỗi compile.
  • (2): default css
  • LoadingPageFactory.java
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.support.PageFactory;

public class LoadingPageFactory {

    public static <T> T get(WebDriver driver, Class<T> pageObjectClass) {
        Verify verify = pageObjectClass.getAnnotation(Verify.class); (1)
        checkTitle(driver, verify);	(2)
        checkCss(driver, verify); (3)
        return PageFactory.initElements(driver, pageObjectClass); (4)
    }

    private static void checkCss(WebDriver driver, Verify verify) {
        String css = verify.css();
        if (!css.equals(Verify.INVALID_CSS)) {
            if (driver.findElements(By.cssSelector(css)).isEmpty()) {
                throw new IllegalStateException("expected CSS " + css));
            }
        }
    }

    private static void checkTitle(WebDriver driver, Verify verify) {
        String expectedTitle = verify.title();
        
        if (!expectedTitle.equals(Verify.INVALID_TITLE)) { 
            String actualTitle = driver.getTitle();
            
            if (!expectedTitle.equals(actualTitle)) {
                throw new IllegalStateException(
                        String.format("expected page title %s but was %s", 
                                expectedTitle,
                                actualTitle
                        )
                );
            }
        }
    }

}
  • (1) Lấy thông tin từ annotation @Verify
  • (2) Check title
  • (3) Check css
  • (4) Khởi tạo page

III. Cách sử dụng

@Test
public void login_test(){
	LoginPage login = LoadingPageFactory.get(driver, LoginPage.class);
	...
}

IV. Tổng kết

Đây là 1 trong các cách để có thể check điều kiện của từng Page Object trước khi khởi tạo page đó, nếu không pass điều kiện thì test sẽ bị dừng ngay lập tức và ta biết vấn đề nằm ở đâu, thay vì khởi tạo sai page rồi gọi method mới thấy không đúng.

Leave a Reply

Your email address will not be published. Required fields are marked *