Hướng dẫn selenium jquery python - trăn jquery selen



Như bạn đã biết cơ chế của Selenium Webdriver là sử dụng JavaScript để thực hiện các thao tác với trình duyệt.

Bài này chúng tôi hướng dẫn bạn bơm (inject) JQuery trong Selenium WebDriver. Sau đó bạn có thể thực thi các câu lệnh jQuery trên trang web mà bạn đang kiểm thử. bơm (inject) JQuery trong Selenium WebDriver. Sau đó bạn có thể thực thi các câu lệnh jQuery trên trang web mà bạn đang kiểm thử.


1. Tạo file MyJQuery.txt

Tạo file MyJQuery.txt và lưu trong ổ D:/ hoặc bất kỳ nơi nào bạn muốn.

(function(jqueryUrl, callback) {
    if (typeof jqueryUrl != 'string') {
        jqueryUrl = 
            'https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js';
    }
    if (typeof jQuery == 'undefined') {
        var script = document.createElement('script');
        var head = document.getElementsByTagName('head')[0];
        var done = false;
        script.onload = script.onreadystatechange = (function() {
            if (!done && (!this.readyState || this.readyState == 'loaded' 
                    || this.readyState == 'complete')) {
                done = true;
                script.onload = script.onreadystatechange = null;
                head.removeChild(script);
                callback();
            }
        });
        script.src = jqueryUrl;
        head.appendChild(script);
    }
    else {
        callback();
    }
})(arguments[0], arguments[arguments.length - 1]);

2. Tạo lớp MyUtils.java

Lớp này chưa phương thức openChrome(), readFile() và injectJQuery() - để bơm JQuery vào trang web mà bạn kiểm thử.

package vn.viettuts.selenium;

import java.awt.AWTException;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.nio.charset.Charset;
import java.util.concurrent.TimeUnit;

import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

public class MyUtils {
    /**
     * open chrome browser
     * 
     * @author phamvanthanh
     * @throws InterruptedException
     * @throws AWTException
     */
    public static WebDriver openChrome() {
        System.setProperty("webdriver.chrome.driver", 
                "D:\\SeleniumWebdriver\\chromedriver.exe");
        return new ChromeDriver();
    }
    
    /**
     * read file
     * 
     * @author viettuts.vn
     * @param file
     * @return
     * @throws IOException
     */
    public static String readFile(String file) throws IOException {
        Charset cs = Charset.forName("UTF-8");
        FileInputStream stream = new FileInputStream(file);
        try {
            Reader reader = new BufferedReader(new InputStreamReader(stream, cs));
            StringBuilder builder = new StringBuilder();
            char[] buffer = new char[8192];
            int read;
            while ((read = reader.read(buffer, 0, buffer.length)) > 0) {
                builder.append(buffer, 0, read);
            }
            return builder.toString();
        } finally {
            stream.close();
        }
    }
    
    /**
     * inject jQuery to page
     * 
     * @author viettuts.vn
     * @throws IOException
     */
    public static void injectJQuery(WebDriver driver, String jQueryStr) 
            throws IOException {
        String jQueryLoader = MyUtils.readFile(jQueryStr);
        driver.manage().timeouts().setScriptTimeout(10, TimeUnit.SECONDS);
        JavascriptExecutor js = (JavascriptExecutor) driver;
        js.executeAsyncScript(jQueryLoader);
    }
}

3. Tính độ vao trang viettuts.vn bằng cách sử dụng hàm height() trong JQuery

package vn.viettuts.selenium;

import java.io.IOException;

import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;

public class Test {
    // lenh height() trong JQuery
    private static String HEIGHT_JQ = "return $(document ).height();";
    private static String JQUERY_FILE = "D:\\MyJQuery.txt";
    public static void main(String[] args) throws IOException {
        WebDriver driver = MyUtils.openChrome();
        driver.manage().window().maximize();
        driver.get("");
        // Inject JQuery trong Selenium WebDriver
        MyUtils.injectJQuery(driver, JQUERY_FILE);
        // tinh chieu cao cua trang viettuts.vn
        JavascriptExecutor jse = ((JavascriptExecutor) driver);
        long pageHeight = (Long) jse.executeScript(HEIGHT_JQ);
        System.out.println("$(document ).height() = " + pageHeight);
    }
}

Kết quả:

$(document ).height() = 2727



Trong lĩnh vực công nghệ thông tin những năm gần đây, ngôn ngữ lập trình Python đang ngày càng trở nên phổ biến. Với bất kỳ lập trình viên nào, việc tự kiểm thử (test) những dòng code mình viết ra là rất quan trọng. Với Python, người lập trình cần nắm được những kỹ năng kiểm thử đặc thù. Trong bài viết này, chuyên gia của CO-WELL Asia sẽ hướng dẫn cơ bản về selenium trong Python sử dụng UnitTest.

Nội dung chính

  • 1. Tìm hiểu về Test automation trong python
  •  Các lý do chọn Python là ngôn ngữ để thực hiện automation
  • 2. Cài đặt môi trường
  •  Cài đặt Python
  • Cài đặt selenium với Python
  • Cài đặt IDE
  • 3. Tạo script đơn giản
  • TestCase và data test
  • Tạo project mới trong IDE
  •  Tạo script
  • Chạy script

1. Tìm hiểu về Test automation trong python

 Các lý do chọn Python là ngôn ngữ để thực hiện automation

  • 2. Cài đặt môi trường
  •  Cài đặt Python
  • Cài đặt selenium với Python
  • Cài đặt IDE
  • 3. Tạo script đơn giản

TestCase và data test
Python unittest (còn được gọi là PyUnit) là một nền tảng kiểm thử (testing framework), được phát triển từ JUnit dành cho Python.

  • Tạo project mới trong IDE
    •  Tạo script
    • Python có cộng đồng hỗ trợ đông đảo.
    • Python viết code ngắn ngọn và dễ đọc, đồng thời dễ dàng tiếp cận với người mới đắt đầu.
    • Selenium Python API bạn có thể truy cập tất cả các chức năng của selenium webdriver một cách trực quan.
  • Python được cài đặt đơn giản hơn nhiều so với Java và cách sử dụng thư viện cũng khá tiện lợi.
  • Tốc độ xử lý khá nhanh vì không cần phải biên dịch code trước khi chạy.
    https://docs.python.org/2/library/unittest.html

2. Cài đặt môi trường

 Cài đặt Python

  • Cài đặt selenium với Python
  • Cài đặt IDE
  • 3. Tạo script đơn giản

Cài đặt selenium với Python

Cài đặt IDE

Cài đặt IDE

3. Tạo script đơn giản
Cài plugin Python vào intellij IDE: vào menu File → Settings → Plugins và nhập Python để tìm kiếm. Chọn install vào plugin Python community edition đợi cài đặt hoàn tất thì restart lại intellij.

3. Tạo script đơn giản

TestCase và data test

Tạo project mới trong IDE

  •  Tạo script
  • Python có cộng đồng hỗ trợ đông đảo.
  • Python viết code ngắn ngọn và dễ đọc, đồng thời dễ dàng tiếp cận với người mới đắt đầu.
  • Selenium Python API bạn có thể truy cập tất cả các chức năng của selenium webdriver một cách trực quan.
  • Python được cài đặt đơn giản hơn nhiều so với Java và cách sử dụng thư viện cũng khá tiện lợi.

Tốc độ xử lý khá nhanh vì không cần phải biên dịch code trước khi chạy.


Python unit test Python unittest (còn được gọi là PyUnit) là một nền tảng kiểm thử (testing framework), được phát triển từ JUnit dành cho Python.

Tạo project mới trong IDE

 Tạo script
Chọn Python, phần Project SDK thì các bạn trỏ tới file python.exe trong folder Python mà bạn đã cài đặt.

Python có cộng đồng hỗ trợ đông đảo.
Sau đó tạo các folder trong project vừa tạo để dễ quản lý và maintain:

  • dataTests: lưu dữ liệu dùng để test
  • drivers: lưu các driver của browser
  • pages: lưu các element của page cần thao tác
  • reports: dùng để lưu report
  • steps: lưu các file thực hiện step test
  • tests: lưu file dùng để chạy script, quản lý testcase
  • utils: lưu file custom như: customChromeDriver,…
  • verifys: lưu file kiểm tra kết quả chạy test

 Tạo script

Tải driver chrome theo version chrome hiện có và lưu vào folder “drivers” (Downloads – ChromeDriver – WebDriver for Chrome)
(Downloads – ChromeDriver – WebDriver for Chrome)

 Đọc dữ liệu test từ file data test (Được lưu trong excel)

Tạo function ReadDataTest.py từ folder “steps” dùng để đọc data test từ file excel đã chuẩn bị.

  • Note:
  • Trường hợp lỗi thư viện: Nhấn vào icon lỗi tại thư viện lỗi và chọn import.
  • Đối với file excel “.xlsx”: Cần chạy lệnh 
    package vn.viettuts.selenium;
    
    import java.awt.AWTException;
    import java.io.BufferedReader;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.Reader;
    import java.nio.charset.Charset;
    import java.util.concurrent.TimeUnit;
    
    import org.openqa.selenium.JavascriptExecutor;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.chrome.ChromeDriver;
    
    public class MyUtils {
        /**
         * open chrome browser
         * 
         * @author phamvanthanh
         * @throws InterruptedException
         * @throws AWTException
         */
        public static WebDriver openChrome() {
            System.setProperty("webdriver.chrome.driver", 
                    "D:\\SeleniumWebdriver\\chromedriver.exe");
            return new ChromeDriver();
        }
        
        /**
         * read file
         * 
         * @author viettuts.vn
         * @param file
         * @return
         * @throws IOException
         */
        public static String readFile(String file) throws IOException {
            Charset cs = Charset.forName("UTF-8");
            FileInputStream stream = new FileInputStream(file);
            try {
                Reader reader = new BufferedReader(new InputStreamReader(stream, cs));
                StringBuilder builder = new StringBuilder();
                char[] buffer = new char[8192];
                int read;
                while ((read = reader.read(buffer, 0, buffer.length)) > 0) {
                    builder.append(buffer, 0, read);
                }
                return builder.toString();
            } finally {
                stream.close();
            }
        }
        
        /**
         * inject jQuery to page
         * 
         * @author viettuts.vn
         * @throws IOException
         */
        public static void injectJQuery(WebDriver driver, String jQueryStr) 
                throws IOException {
            String jQueryLoader = MyUtils.readFile(jQueryStr);
            driver.manage().timeouts().setScriptTimeout(10, TimeUnit.SECONDS);
            JavascriptExecutor js = (JavascriptExecutor) driver;
            js.executeAsyncScript(jQueryLoader);
        }
    }
    
    0 trong terminal của intellij.

 Custom trình duyệt Chrome

Tạo function CustomChromeDriver.py từ folder “utils” dùng để tùy chỉnh profile của trình duyệt muốn mở:

Tạo file test

Tại folder “tests” tạo mới file Python: Nhập tên file và chọn “Python unit test”

File LoginTests.py

① Nhận data test đã được tạo trong file ReadDataTest.py ② Mở trình duyệt Chrome ③ Truy nhập URL dùng để chạy script ④ Đóng trình duyệt khi kết thúc test ⑤ Các bước khi test login: Nhập username, password, nhấn nút login ⑥ Kiểm tra kết quả mong muốn đã define trong dataTest với kết quả thực tế khi test
② Mở trình duyệt Chrome
③ Truy nhập URL dùng để chạy script
④ Đóng trình duyệt khi kết thúc test
⑤ Các bước khi test login: Nhập username, password, nhấn nút login
⑥ Kiểm tra kết quả mong muốn đã define trong dataTest với kết quả thực tế khi test

3.3.4. Get các element cần thao tác Tạo file Page_login.py lưu các element cần thao tác.
Tạo file Page_login.py lưu các element cần thao tác.

Tạo script thực hiện step

Tạo file Step_login.py trong folder “step”

① Các thao tác dùng để login: nhập username → nhập password → nhấn nút login. ② Get các element từ các locator trong file Page_login.py.
② Get các element từ các locator trong file Page_login.py.

3.3.6. Tạo script kiểm tra kết quả Script này để get kết quả sau khi thực hiện login. Ở đây tôi sẽ get nội dung thông báo và so sánh với nội dung thông báo mong muốn trong file data test.
Script này để get kết quả sau khi thực hiện login. Ở đây tôi sẽ get nội dung thông báo và so sánh với nội dung thông báo mong muốn trong file data test.

Chạy script

Để xem được kết quả test thuận tiện thì cần thêm html-report vào script: Trên file LoginTests.py thêm 

package vn.viettuts.selenium;

import java.awt.AWTException;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.nio.charset.Charset;
import java.util.concurrent.TimeUnit;

import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

public class MyUtils {
    /**
     * open chrome browser
     * 
     * @author phamvanthanh
     * @throws InterruptedException
     * @throws AWTException
     */
    public static WebDriver openChrome() {
        System.setProperty("webdriver.chrome.driver", 
                "D:\\SeleniumWebdriver\\chromedriver.exe");
        return new ChromeDriver();
    }
    
    /**
     * read file
     * 
     * @author viettuts.vn
     * @param file
     * @return
     * @throws IOException
     */
    public static String readFile(String file) throws IOException {
        Charset cs = Charset.forName("UTF-8");
        FileInputStream stream = new FileInputStream(file);
        try {
            Reader reader = new BufferedReader(new InputStreamReader(stream, cs));
            StringBuilder builder = new StringBuilder();
            char[] buffer = new char[8192];
            int read;
            while ((read = reader.read(buffer, 0, buffer.length)) > 0) {
                builder.append(buffer, 0, read);
            }
            return builder.toString();
        } finally {
            stream.close();
        }
    }
    
    /**
     * inject jQuery to page
     * 
     * @author viettuts.vn
     * @throws IOException
     */
    public static void injectJQuery(WebDriver driver, String jQueryStr) 
            throws IOException {
        String jQueryLoader = MyUtils.readFile(jQueryStr);
        driver.manage().timeouts().setScriptTimeout(10, TimeUnit.SECONDS);
        JavascriptExecutor js = (JavascriptExecutor) driver;
        js.executeAsyncScript(jQueryLoader);
    }
}
1 sau đó import thư viện HTMLTestRunner vào hoặc chạy lệnh 
package vn.viettuts.selenium;

import java.awt.AWTException;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.nio.charset.Charset;
import java.util.concurrent.TimeUnit;

import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

public class MyUtils {
    /**
     * open chrome browser
     * 
     * @author phamvanthanh
     * @throws InterruptedException
     * @throws AWTException
     */
    public static WebDriver openChrome() {
        System.setProperty("webdriver.chrome.driver", 
                "D:\\SeleniumWebdriver\\chromedriver.exe");
        return new ChromeDriver();
    }
    
    /**
     * read file
     * 
     * @author viettuts.vn
     * @param file
     * @return
     * @throws IOException
     */
    public static String readFile(String file) throws IOException {
        Charset cs = Charset.forName("UTF-8");
        FileInputStream stream = new FileInputStream(file);
        try {
            Reader reader = new BufferedReader(new InputStreamReader(stream, cs));
            StringBuilder builder = new StringBuilder();
            char[] buffer = new char[8192];
            int read;
            while ((read = reader.read(buffer, 0, buffer.length)) > 0) {
                builder.append(buffer, 0, read);
            }
            return builder.toString();
        } finally {
            stream.close();
        }
    }
    
    /**
     * inject jQuery to page
     * 
     * @author viettuts.vn
     * @throws IOException
     */
    public static void injectJQuery(WebDriver driver, String jQueryStr) 
            throws IOException {
        String jQueryLoader = MyUtils.readFile(jQueryStr);
        driver.manage().timeouts().setScriptTimeout(10, TimeUnit.SECONDS);
        JavascriptExecutor js = (JavascriptExecutor) driver;
        js.executeAsyncScript(jQueryLoader);
    }
}
2
Trên file LoginTests.py thêm 
package vn.viettuts.selenium;

import java.awt.AWTException;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.nio.charset.Charset;
import java.util.concurrent.TimeUnit;

import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

public class MyUtils {
    /**
     * open chrome browser
     * 
     * @author phamvanthanh
     * @throws InterruptedException
     * @throws AWTException
     */
    public static WebDriver openChrome() {
        System.setProperty("webdriver.chrome.driver", 
                "D:\\SeleniumWebdriver\\chromedriver.exe");
        return new ChromeDriver();
    }
    
    /**
     * read file
     * 
     * @author viettuts.vn
     * @param file
     * @return
     * @throws IOException
     */
    public static String readFile(String file) throws IOException {
        Charset cs = Charset.forName("UTF-8");
        FileInputStream stream = new FileInputStream(file);
        try {
            Reader reader = new BufferedReader(new InputStreamReader(stream, cs));
            StringBuilder builder = new StringBuilder();
            char[] buffer = new char[8192];
            int read;
            while ((read = reader.read(buffer, 0, buffer.length)) > 0) {
                builder.append(buffer, 0, read);
            }
            return builder.toString();
        } finally {
            stream.close();
        }
    }
    
    /**
     * inject jQuery to page
     * 
     * @author viettuts.vn
     * @throws IOException
     */
    public static void injectJQuery(WebDriver driver, String jQueryStr) 
            throws IOException {
        String jQueryLoader = MyUtils.readFile(jQueryStr);
        driver.manage().timeouts().setScriptTimeout(10, TimeUnit.SECONDS);
        JavascriptExecutor js = (JavascriptExecutor) driver;
        js.executeAsyncScript(jQueryLoader);
    }
}
1 sau đó import thư viện HTMLTestRunner vào hoặc chạy lệnh 
package vn.viettuts.selenium;

import java.awt.AWTException;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.nio.charset.Charset;
import java.util.concurrent.TimeUnit;

import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

public class MyUtils {
    /**
     * open chrome browser
     * 
     * @author phamvanthanh
     * @throws InterruptedException
     * @throws AWTException
     */
    public static WebDriver openChrome() {
        System.setProperty("webdriver.chrome.driver", 
                "D:\\SeleniumWebdriver\\chromedriver.exe");
        return new ChromeDriver();
    }
    
    /**
     * read file
     * 
     * @author viettuts.vn
     * @param file
     * @return
     * @throws IOException
     */
    public static String readFile(String file) throws IOException {
        Charset cs = Charset.forName("UTF-8");
        FileInputStream stream = new FileInputStream(file);
        try {
            Reader reader = new BufferedReader(new InputStreamReader(stream, cs));
            StringBuilder builder = new StringBuilder();
            char[] buffer = new char[8192];
            int read;
            while ((read = reader.read(buffer, 0, buffer.length)) > 0) {
                builder.append(buffer, 0, read);
            }
            return builder.toString();
        } finally {
            stream.close();
        }
    }
    
    /**
     * inject jQuery to page
     * 
     * @author viettuts.vn
     * @throws IOException
     */
    public static void injectJQuery(WebDriver driver, String jQueryStr) 
            throws IOException {
        String jQueryLoader = MyUtils.readFile(jQueryStr);
        driver.manage().timeouts().setScriptTimeout(10, TimeUnit.SECONDS);
        JavascriptExecutor js = (JavascriptExecutor) driver;
        js.executeAsyncScript(jQueryLoader);
    }
}
2

Ở lệnh unittest.main() gọi đến phương thức report:

Kết quả chạy test sẽ được lưu vào report:

Ngoài ra để report được dễ nhìn hơn thì có thể custom tại template. Ví dụ template đã được custom lại:

  • Source code on github: GitHub – haunvc7049/UnittestPythonSelenium

Trên đây là những hướng dẫn cơ bản của chuyên gia từ CO-WELL Asia về Unit Testing trong Python. Đừng quên theo dõi chuyên mục CODEWELL trên website CO-WELL Asiađể đón đọc những bài viết công nghệ bổ ích nhé!chuyên mục CODEWELL trên website CO-WELL Asiađể đón đọc những bài viết công nghệ bổ ích nhé!