Page Factory là phần mở rộng của Page Object Model, nó giúp khởi tạo các đối tượng WebElement tối ưu hơn và giảm thiểu code ngắn gọn hơn.
Nó được sử dụng để khởi tạo các đối tượng Trang hoặc để khởi tạo chính đối tượng Trang. Nó cũng được sử dụng để khởi tạo các hành động xử lý mà không cần sử dụng cú pháp driver.findElement / driver.findElements.
Có hai bước đơn giản để sử dụng Page Factory trong các dự án Selenium:
1. Sử dụng chú thích @FindBy - Không giống như cách tiếp cận thông thường để khởi tạo các phần tử trang web bằng FindElement hoặc FindElements , Page Factory sử dụng chú thích @FindBy. Các chú thích này được sử dụng trong Page Factory mang tính mô tả. Hơn nữa, chúng giúp cải thiện khả năng đọc mã mà chúng ta sẽ thảo luận trong phần tiếp theo. Nó cung cấp cú pháp sau để xác định vị trí các phần tử web:
@FindBy có thể chấp nhận tagName, partialLinkText, name, linkText, id, css, className, xpath dưới dạng thuộc tính.
2 . Khởi tạo các phần tử bằng initElements () - Đây là một phương thức tĩnh được sử dụng để khởi tạo các phần tử web mà chúng định vị bằng cách sử dụng @FindBy trên hoặc (các) chú thích khác, đặt nó vào chổ hàm xây dựng khởi tạo lớp trang.
Chúng ta thấy class SignInPage bài trước khi chưa dùng Page Factory:
Khi chúng ta áp dụng dùng Page Factory thì nó sẽ như này:
Vậy là xong. Gọn ràng hơn chứ hả.
Ta thấy cách khai báo một WebElement khá rõ ràng
Nếu dùng xpath hay name hay classname thì chứ thay vào chổ "id" là xong.
Hàm khởi tạo (constructor) sẽ thay đổi thêm 1 dòng khởi tạo initElements vì bây giờ sẽ sử dụng thêm PageFactory.
Vậy thì chính xác là Page Factory làm gì?
Sau khi khai báo WebElement và Locator, thì 2 cái này phải được liên kết với nhau. Có nghĩa là WebElement sẽ luôn luôn được tìm thấy sử dụng bởi Locator thông qua annotation @FindBy. Và thực hiện công việc trên, ta cần khởi tạo Element thông qua constructor:
- Các WebElement sẽ KHÔNG được tìm thấy ngay khi khởi tạo. Khởi tạo chỉ để tạo ra LIÊN KẾT giữa WebElement và Locator. Khi nào WebElement đó được sử dụng thì chúng mới được tìm kiếm dựa trên các biến loại WebElement đã được khai báo ở trên.
- Nếu WebElement đó được sử dụng nhiều lần thì nó tiếp tục tìm kiếm nhiều lần hay sao đây??
Chính xác là như vậy, nó sẽ được tìm kiếm mỗi lần sử dụng. Tuy nhiên, có 1 cách để chỉ tìm 1 lần rồi sử dụng lại, đó là sử dụng annotation @CacheLookup. Ví dụ:
Ngoài ra, bạn có thể sử dụng @FindAll với nhiều chú thích @FindBy để tìm kiếm các phần tử khớp với bất kỳ bộ định vị nào đã cho:
Hoặc khi cần tìm danh sách các phần tử trên một trang (findElements) thì chúng ta dùng @FindBys như sau:
Và cách khác để viết đơn giản hơn nữa là:
==> Vậy là xong rồi.
Phần DashboardPage viết tương tự thôi nào =))
Severity: Notice
Message: Undefined variable: new
Filename: post/post_detail.php
Line Number: 384
Backtrace:
File: /home/anhtest2/public_html/application/views/frontend/post/post_detail.php
Line: 384
Function: _error_handler
File: /home/anhtest2/public_html/application/views/frontend/layout/layout_view.php
Line: 370
Function: view
File: /home/anhtest2/public_html/application/core/MY_Controller.php
Line: 34
Function: view
File: /home/anhtest2/public_html/application/controllers/frontend/Post.php
Line: 59
Function: render
File: /home/anhtest2/public_html/index.php
Line: 315
Function: require_once
Severity: Notice
Message: Trying to get property 'slug' of non-object
Filename: post/post_detail.php
Line Number: 384
Backtrace:
File: /home/anhtest2/public_html/application/views/frontend/post/post_detail.php
Line: 384
Function: _error_handler
File: /home/anhtest2/public_html/application/views/frontend/layout/layout_view.php
Line: 370
Function: view
File: /home/anhtest2/public_html/application/core/MY_Controller.php
Line: 34
Function: view
File: /home/anhtest2/public_html/application/controllers/frontend/Post.php
Line: 59
Function: render
File: /home/anhtest2/public_html/index.php
Line: 315
Function: require_once
Anh Tester
Đường dẫu khó chân vẫn cần bước đi
Đời dẫu khổ tâm vẫn cần nghĩ thấu