SF

""

Khởi tạo đối tượng driver bằng Webdriver trong Selenium

 Khởi tạo đối tượng Webdriver trong Selenium



Khi thực hiện việc UI automation sử dụng Selenium WebDriver, các bạn hay viết một câu lệnh này rất thường xuyên để khởi tạo browser, đó là: 

WebDriver driver = new FirefoxDriver();


Tùy thuộc vào loại browser mà chúng ta muốn khởi tạo thì chúng ta có thể thay FirefoxDriver() bằng ChromeDriver(), InternetExplorerDriver(),... Nhưng có khi nào bạn tự hỏi tại sao chúng ta lại cần tạo 1 biến thuộc kiểu WebDriver không? Và nếu chúng ta trực tiếp dùng kiểu cụ thể của driver trình duyệt đó luôn thì sao ? Ví dụ như sau: 

FirefoxDriver driver = new FirefoxDriver();

Các bạn đoán xem dòng code trên có sai hay không? Nếu không sai thì lợi ích của việc dùng WebDriver có những gì. Chúng ta cùng tìm hiểu nhé.

WebDriver là gì?

WebDriver là một interface được cung cấp bởi Selenium WebDriver. Như chúng ta biết thì các interface trong Java là tập hợp của các method chưa được implement. Interface WebDriver đề ra template cho các browser cụ thể như ChromeDriver, FireFoxDriver,... phải follow theo. Interface WebDriver khai báo sẵn các method như là get(), navigate(), close(), sendKeys(),... và các developer phải implement các methods này cho từng loại browser. 

Lấy ví dụ về ChromeDriver, nó được developed bởi các developers ở Chromium team, các developers của Selenium không cần lo lắng về việc implement chi tiết của driver này.

Vậy có đúng không khi chúng ta code như sau: 

 FirefoxDriver driver = new FirefoxDriver();

Nó hoàn toàn đúng nha các bạn. FirefoxDriver là implementing class của interface WebDriver và đoạn code trên sẽ launch trình duyệt Firefox.

Quay trở lại với câu hỏi, tại sao chúng ta lại cần biến driver thuộc kiểu WebDriver thay vì FirefoxDriver (tương tự cho các browser khác)?

Bởi vì WebDriver cho phép chúng ta assign đối tượng driver tới các loại browser driver khác nữa. Điều nay đồng nghĩa nó cho phép chúng ta test multi-browser bằng cách gán đối tượng driver cho bất kỳ browser driver khác


Các thành phần cơ bản trong một automation project

 

Các thành phần cơ bản trong một automation project




Các bước cơ bản dưới đây sẽ giúp bạn có cái nhìn tổng quan về những việc cần làm khi bắt đầu một automation project.

Ta có một bài toán đặt ra ở đây như sau:

Bạn có các test case để test chức năng cho một website nào đó: web app đó có thể là một trang quản trị, một trang web bán hàng online, hay là bất kỳ các ứng dụng web nào khác mà bạn cần phải test…

Các test case chức năng này được chuẩn bị để bạn thực hiện manual test. Tất nhiên, bạn phải thực hiện test từng test case một cho đến khi xong bộ test case đó, từ việc setup precondition, input testdata, đến việc so sánh kết quả thực tế và kết quả mong đợi có tương ứng với nhau hay không để đánh pass – fail cho test case đó.

Yêu cầu dành cho bạn là sẽ automate được nhiều test case nhất có thể!

Vậy thì làm thế nào? Cùng xem lời giải dưới đây để biết được các thành phần chính trong project, từ đó định hướng được các công việc bạn cần phải làm nhé!

1. Tạo automation project

Đầu tiên bạn tạo một project – Có thể sử dụng IDE là Eclipse và sau đó add hai thư viện này vào project đó:

  • Selenium Webdriver library: Thư viện hỗ trợ tương tác với trình duyệt thông qua web brower.
  • Một thư viện dùng trong unit test như TestNG: Thư viện này giúp bạn có thể tạo được các script automation độc lập.

Trong project, có các tầng (layer), mỗi tầng chỉ giao tiếp với tầng trước và kế tiếp nó theo thứ tự như dưới đây:

main

Ba layer trên cùng thường thì sẽ được tổ chức thành các package khác nhau đó là:

  1. Test classes package
  2. Page object classes package
  3. Framework classes package

2. Tạo các class page object

Tương ứng với mỗi web page được chia trong bộ test case, bạn sẽ tạo một page object cho nó.

Page object class thực thi các tương tác người dùng trên một trang web cụ thể, nó bao gồm các thông tin về trường dữ liệu (field) và các method.

Các trường dữ liệu của page object bao gồm:

  • Title
  • Ulr
  • Locator của các web elements
  • Và các thông tin đặc trưng khác của page ví dụ như: source page, sub title,…

Các method được sử dụng để:

  • Cung cấp thông tin về webpage và các element:
    • Page title
    • Page url
    • Value của các label
    • Kiểm tra element đó có enable hay không, có thể selected hay không
  • Thực hiện các tương tác trên page như:
    • Click vào một element cụ thể nào đó
    • Input text vào textbox
    • Select options của checkboxes hay listboxes

Các test script của chúng ta sẽ sử dụng các thông tin trong page object này. Từ đó page object sẽ sử dụng các hàm trong classes framework của project để tiến hành thực thi các tương tác với trang web.

3. Tạo các class test

Ở đây mỗi test cript bạn tạo ra sẽ tương ứng với một test case.

Và trước mỗi test script bạn cần phải thêm 1 annotation @Test tương ứng với 1 unit test

Test script này gồm có hai phần:

  • Điều hướng đến trang được test
  • Thực thi việc test, và verify

Để điều hướng đến trang được test thì trong script sẽ gọi đến các thông tin trong page object của trang đó.

Và như vậy mỗi lần khi được điều hướng đến các trang test thì script sẽ thực hiện việc test và so sánh kết quả thực tế thực hiện được với kết quả mong đợi để đưa ra kết luận test.

Trong các class test thì các test ccript được gom nhóm với nhau, thuận tiện cho việc tìm kiếm và nâng cấp.

Mỗi nhóm test script được nhóm lại với nhau dựa vào mục đích test riêng của nhóm script.

Các class test không phải chỉ có các test script mà nó còn bao gồm cả test fixtures (test fixtures này không biết dịch sang tiếng việt sao nữa, thôi để nguyên)

Test fixtures là các method đặc biệt của unit test framework như:

  1. Việc chuẩn bị môi trường test, những cái mà các script test cần phải có trước khi có thể thực thu được (bước này thường để trong một hàm riêng, có annotation là @Before)
  2. Việc clean/reset môi trường test sau khi run test script: như việc reset về các thiết lập ban đầu, không cache…, (bước này cũng được xây dựng thành hàm riêng và có annotation là @After)

Các class test có thể được gom lại với nhau bằng cách sử dụng groups và suites.

4. Tạo một class base – class dùng chung

Các công việc như chuẩn bị môi trường test hay việc reset môi trường sau khi thực hiện test có thể được sử dụng nhiều lần ở nhiều nơi khác nhau trong project, vì thế để tránh việc lặp lại nhiều lần này thì ta sẽ đưa những test fixtures này vào trong một class base.

Các class test sẽ thừa kế class base này để có thể gọi đến và sử dụng các hàm trong đó.

5. Tạo các class framework

Các class framework được sử dụng trong project cho các chức năng chung như:

  • Tạo browser driver cho từng loại browser khác nhau
  • Tương tác với web sử dụng explicit wait
  • Lấy log file
  • Đọc các thông tin từ một file text nào đó
  • Chụp lại ảnh màn hình (capture screen) khi xảy ra exception
  • Tự động gửi email kết quả test
  • Tạo một report sau khi có kết quả test.

Các class page object sẽ gọi đến các function này từ các class framework mà ta đã có, để đưa ra thông tin cần lấy cho page ấy.

Như vậy mình có thể tóm tắt lại một cách tổng quan về thành phần cần có của một automation project đó là: đầu tiên bạn sẽ cần tạo project trong IDE (Eclipse), tiếp theo bạn cần xác định rằng trong project của bạn cần có các class Page objectclass testclass base, và class liên quan đến framework.

Mỗi class đều có mục đích riêng, việc hiểu về các class đó giúp project của bạn khoa học hơn, dễ dàng hơn trong việc quản lý, bảo trì và nâng cấp.

Xử lý Authentication Popup Window sử dụng Selenium WebDriver

Xử lý Authentication Popup Window sử dụng Selenium WebDriver


Bạn có thể gặp Authentication popup này khi thực hiện truy cập vào một trang ứng dụng hay địa chỉ nào đó, ở đây bạn cần phải nhập tên đăng nhập và mật khẩu đúng để có thể thực hiện tiếp các thao tác, tác vụ tiếp theo trên trang đó. Loại popup này không phải là popup thông thường được sinh ra từ java-script của ứng dụng đó, mà là một loại hộp thoại của trình duyệt, do đó mà Selenium không thể thực hiện với cách mà chúng ta vẫn làm là sử dụng sendKey() được.

Auth_popup_1

Để giải quyết vấn đề này, chúng ta có hai cách như dưới đâ.

1. Sử dụng Selenium webdriver

Cách đơn giản nhất là truyền trực tiếp username và password cùng với đường dẫn trang web yêu cầu theo cú pháp:

http://Username:Password@SiteURL

Mình có ví dụ:

http://msanh:12121221@www.thichanbanhcuon.com.vn

Trong đó:

msanh là username của mình

12121221 là mật khẩu

Và trang web đăng nhập của mình ở đây là http://www.thichanbanhcuon.com.vn

Code thì sẽ như thế này:

String URL = "http://" + msanh + ":" + 12121221 + "@" + www.thichanbanhcuon.com.vn;
driver.get(URL);
Alert alert = driver.switchTo().alert();
alert.accept();

2. Sử dụng AutoIT

Auth_popup

Bằng cách sử dụng AutoIT ta cũng có thể xử lý được với trường hợp popup này như sau.

Nếu bạn chưa cài đặt AutoIT thì tham khảo thêm trên các nguồn có sẵn khác.

Nếu đã sẵn sàng rồi, thì chúng ta bắt đầu tạo một AutoIT script có nội dung cú pháp như dưới đây:

; To pass user name and password
WinWaitActive("Windows Security")
Send("admin")
Send("{TAB}")
Send("admin")
Send("{ENTER}")

Hoặc có thể viết gộp như này cũng được:

WinWaitActivate("Authentication Required","")
Send("rajkumar{TAB}myPassword{ENTER}")

Lưu lại và sau đó compile AutoIT script file này thành 1 file exe, lấy đường dẫn của file exe này rồi đưa vào code thôi:

public static void login(String email, String password) throws Exception{
driver.get(URL);

//Passing the AutoIt Script here
Runtime.getRuntime().exec("D:\\Selenium\\AutoItFiles\\ExecutableFiles\\HandleAuth.exe");
driver.findElement
loginpage.setEmail(email);
loginpage.setPassword(password);
loginpage.clickOnLogin();
}

Sử dụng các hàm cơ bản của WebDriver

 Sử dụng  các hàm cơ bản của WebDriver

[Selenium Java]  Lesson 7: Sử dụng các hàm cơ bản của WebDriver | Anh Tester


Initialize

Các cách khởi tạo driver với các loại trình duyệt khác nhau và Import thư viện tương ứng

// Khởi tạo: selenium-chrome-driver
import org.openqa.selenium.chrome.ChromeDriver;
WebDriver driver = new ChromeDriver();
// Khởi tạo: selenium-firefox-driver
import org.openqa.selenium.firefox.FirefoxDriver;
WebDriver driver = new FirefoxDriver();
// Khởi tạo: selenium-edge-driver
import org.openqa.selenium.firefox.EdgeDriver;
WebDriver driver = new EdgeDriver();
// Khởi tạo: selenium-ie-driver
import org.openqa.selenium.ie.InternetExplorerDriver;
WebDriver driver = new InternetExplorerDriver();
// Khởi tạo: selenium-safari-driver
import org.openqa.selenium.safari.SafariDriver;
WebDriver driver = new SafariDriver();
Java
 

Basic Browser Operations

Các thao tác trình duyệt cơ bản

// Navigate to a page
driver.navigate().to("http://google.com");
// Điều hướng về lịch sử trang trước đó
driver.navigate().back();
// Làm mới trang hiện tại
driver.navigate().refresh();
// Điều hướng đến trang tiếp sau
driver.navigate().forward();
// Get the title of the page
String title = driver.getTitle();
// Get the current URL
String url = driver.getCurrentUrl();
// Get the current page HTML source
String html = driver.getPageSource();
Java

 

Advanced Browser Operations

Các thao tác trình duyệt nâng cao
String handle = driver.getWindowHandle();
Java
  • Lấy cái “mã số” của cái browser đang run và nó sẽ return lại 1 giá trị kiểu String.
  • Cái này thường được dùng khi xử lý những phần có nhiều browser.
Ví dụ: Click vào 1 đường link ở page hiện tại, nó open 1 browser mới. Mỗi browser này sẽ có 1 mã số để phân biệt chúng với nhau.


Set<String> allWindows = driver.getWindowHandles();
Java
  • Lấy toàn bộ các “mã số” của các browser đang run mà có sử dụng instance driver. Ví dụ nếu 1 cái browser mở lên do mình tự mở, không phải Selenium mở thì sẽ ko lấy đc “mã số”.
  • Type java.util.Set<java.lang.String>: nó sẽ return lại 1 Set các giá trị kiểu String, Set có ý nghĩa là sẽ không có dữ liệu bị lặp.
Set<String> handle= driver.getWindowHandles();
for (String handle : driver.getWindowHandles()){ 
    driver.switchTo().window(handle);
}
Java

Tương tự phần findElements(), để tương tác được với Set thì ta dùng vòng lặp.

Ví dụ:

Set<String> AllWindowHandles = driver.getWindowHandles();
String window1 = (String) AllWindowHandles.toArray()[0]; 
System.out.println("Window 1 handle code = "+AllWindowHandles.toArray()[0]); 
String window2 = (String) AllWindowHandles.toArray()[1]; 
System.out.print("Window 2 handle code = "+AllWindowHandles.toArray()[1]);
Java
Code ngắn gọn lại:
// Switch between browser windows or tabs
Set<String> windowHandles = driver.getWindowHandles();
String firstTab = (String)windowHandles.toArray()[0]; //Tab đầu
String lastTab = (String)windowHandles.toArray()[1]; //Tab thứ hai
driver.switchTo().window(lastTab);
Java


Các tùy chọn của interface Options

// Phóng hết cỡ trình duyệt theo màn hình máy tính
driver.manage().window().maximize();
// Add a new cookie
Cookie newCookie = new Cookie("customName", "customValue");
driver.manage().addCookie(newCookie);
// Get all cookies
Set<Cookie> cookies = driver.manage().getCookies();
// Delete a cookie by name
driver.manage().deleteCookieNamed("CookieName");
// Delete all cookies
driver.manage().deleteAllCookies();
Java

 

Các tùy chọn của interface TargetLocator

//Ví dụ: Chuyển driver sang 1 phần tử ngoài page như: window khác, alert, iframe.
//Handle Alert
driver.switchTo().alert();
// Switch to Frame
driver.switchTo().frame(1);//Đến khung hiển thị đầu
driver.switchTo().frame("frameName");//Đến khung hiển thị theo tên
WebElement element = driver.findElement(By.id("id"));
driver.switchTo().frame(element); //Chuyển đến khung hiển thị chứa element có ID chỉ định
// Chuyển sang khung hiển thị trên trình duyệt hiện tại
driver.switchTo().defaultContent();
Java

Wait Configurations

Các thao tác tùy chỉnh thời gian chờ

// Đặt thời gian chời ngầm định cho tất cả các element (đơn vị Giây)
// Ví dụ thiết lập 10 giây cho tất cả
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

//Thiết lập thời gian chờ Load page xong mới thao tác (tối đa 30s)
driver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);
Java