12/08/2018, 14:49

<Selenium 2 Testing Tools> Chương 4: Design Patterns (tiếp)

LoadableComponent Loadablecompanet là một cách để tiếp cận PageObjects . LoadableComponent là một lớp cơ sở mà tất cả các trang đều cần phải extend. Lớp cơ sở sẽ bao gồm những phương thức sau trên giao diện: ‹. get() ‹. isLoaded() ‹. load() Thay vì sử dụng public class PageObject như ...

LoadableComponent

Loadablecompanet là một cách để tiếp cận PageObjects. LoadableComponent là một lớp cơ sở mà tất cả các trang đều cần phải extend. Lớp cơ sở sẽ bao gồm những phương thức sau trên giao diện: ‹. get() ‹. isLoaded() ‹. load()

Thay vì sử dụng public class PageObject như thường lệ, ta sẽ thay đổi nó thành:

public class PageObject extends LoadableComponent<PageObject>

Lúc này ta sẽ phải ghi đè cho phương thức load()isLoaded.

  • Phương thức load sẽ tải trang
  • Phương thức isLoaded() cho phép ta kiểm tra xem trang có được tải đúng hay không

Ví dụ:

@override
Protected void load() {
selenium.get("http://book.theautomatedtester.co.uk");
}
@protected void isLoaded() {
String url = selenium.getCurrentUrl();
If (url != "http://book.theautomatedtester.co.uk"){
throw new Exception("The wrong page has loaded");
}
}

Như ta thấy, đây chỉ là 1 ví dụ code rất nhỏ nhưng nó có thể giúp ta chắn chắn rằng mình bắt đầu ở đúng trang.

Thời điểm hành động – thay đổi Page Object sử dụng LoadableCompanent

Ta đã biết về LoadableComponents, giờ thì ta sẽ tìm hiểu cách thức hoạt động của nó. Ta cần phải tạo sự thay đổi với Java Class.

  1. Bên dưới là code ta vẫn thường viết từ trước đến nay:
public class Chapter2 {
WebDriver selenium;
@FindBy(how= How.NAME, using="verifybutton")
WebElement verifybutton;
public Chapter2(WebDriver selenium){
this.selenium = selenium;
if (!"Chapter 2".equalsIgnoreCase(this.selenium.getTitle())){
selenium.get("http://book.theautomatedtester.co.uk/
chapter2");
}
}
public boolean isButtonPresent(String button){
return selenium.findElements(By.xpath
("//input[@id='"+button+"']")).size()>0;
}
}
  1. Nếu xem lại Chương 2 Java class, ta có thể thấy mình cần extend LoadableComponent như sau:

public class Chapter2 extends LoadableComponent<Chapter2> {

  1. Trong hàm tạo, ta sẽ phải định nghĩa page factory. Ta có thể xóa bỏ phần còn lại của code do phần này sẽ được di chuyển đến load(). Nó sẽ như bên dưới:
public Chapter2(WebDriver selenium){
this.selenium = selenium;
PageFactory.initElements(selenium, this);
}
  1. Giờ ta cần thêm phương thức override. Điều này cho phép ta kiểm tra xem mình có ở đúng trang không khi tải component này:
@override
Protected void load() {
selenium.get("http://book.theautomatedtester.co.uk/chapter2");
}
@protected void isLoaded() {
String url = selenium.getCurrentUrl();
If (url != "http://book.theautomatedtester.co.uk/chapter2"){
throw new Exception("The wrong page has loaded");
}
}
  1. Giờ ta sẽ cần thay đổi test để tải mọi thứ ta muốn. Để làm điều nay, ta cần thay đổi:
@Test
public void ShouldLoadTheHomePageAndThenCheckButtonOnChapter2() {
selenium.get("http://book.theautomatedtester.co.uk");
HomePage hp = new HomePage(selenium);
Chapter2 ch2 = hp.clickChapter2();
assertTrue(ch2.isButtonPresent("but1"));
}

@Test
public void ShouldLoadTheHomePageAndThenCheckButtonOnChapter2(){
Chapter2 cht = new Chapter2(selenium).get();
ch2.isButton("but1");
}
FindBy(how= How.NAME, using="verifybutton")
WebElement verifybutton;
public Chapter2(WebDriver selenium){
this.selenium = selenium;
PageFactory.initElements(selenium, this);
}
@override
Protected void load() {
selenium.get("http://book.theautomatedtester.co.uk/chapter2");
}
@protected
public void isLoaded() {
String url = selenium.getCurrentUrl();
If (url != "http://book.theautomatedtester.co.uk/chapter2"){
throw new Exception("The wrong page has loaded");
}
}
public boolean isButtonDisplayed(String button){
return selenium.findElement(By.id("button")).isDisplayed();
}
}
  1. Thành
@Test
public void ShouldLoadTheHomePageAndThenCheckButtonOnChapter2(){
Chapter2 cht = new Chapter2(selenium).get();
ch2.isButton("but1");
}
FindBy(how= How.NAME, using="verifybutton")
WebElement verifybutton;
public Chapter2(WebDriver selenium){
this.selenium = selenium;
PageFactory.initElements(selenium, this);
}
@override
Protected void load() {
selenium.get("http://book.theautomatedtester.co.uk/chapter2");
}
@protected
public void isLoaded() {
String url = selenium.getCurrentUrl();
If (url != "http://book.theautomatedtester.co.uk/chapter2"){
throw new Exception("The wrong page has loaded");
}
}
public boolean isButtonDisplayed(String button){
return selenium.findElement(By.id("button")).isDisplayed();
}
}

Điều gì vừa xảy ra:

Ta vừa chuyển đổi page object bằng cách sử dụng class LoadableComponent để tiến gần với dự án Selenium. Ta đã thấy cách làm đơn giản hóa hàm tạo và sau đó chỉ là di chuyển vào một nơi nào đó để dễ dàng bảo trì hơn.

Have a go hero – LoadableComponent

Hãy tưởng tượng bạn phải làm việc với 1 luồng có rất nhiều trang. LoadableComponent cho phép chúng ta cài đặt 1 luồng làm việc. Để lấy đúng cái này, khi cài đặt test, ta cần đưa vào 1 dòng như bên dưới:

@Before
public void prepareComponents() {
WebDriver selenium = new FirefoxDriver();
HomePage homePage = new HomePage(selenium);
Chapter2 chapter2 = new SecuredPage(selenium, homePage);
}

Nguồn dịch:

Sách Selenium 2 Testing Tools- Beginner's Guide [eBook] - David Burns

0