Ngày 30 tháng 8 năm 2022 | Công Nghệ Thông Tin
Các thành phần chính của kiểm thử Selenium bao gồm: mã kiểm thử, WebDriver, Grid (Selenium Server - không bắt buộc), trình điều khiển trình duyệt (Driver) và trình duyệt.
Khi chúng ta viết xong kịch bản kiểm thử Selenium để gỡ lỗi cục bộ, WebDriver sẽ tương tác trực tiếp với trình duyệt thông qua trình điều khiển. Lúc này, WebDriver, trình điều khiển trình duyệt và trình duyệt nằm trên cùng một máy chủ. Cách tương tác cơ bản nhất được minh họa trong hình dưới đây. !Quy trình tương tác trực tiếp giữa WebDriver và trình duyệt - selenium.dev (Hình ảnh trích từ selenium.dev)
Sau khi hoàn thành việc gỡ lỗi cục bộ và sử dụng pipeline tự động để kích hoạt thực thi các trường hợp kiểm thử, thường không sử dụng cách tương tác trực tiếp giữa WebDriver và trình duyệt như đã đề cập ở trên. Thay vào đó, cách tương tác từ xa sẽ được lựa chọn.
Cách tương tác từ xa nghĩa là WebDriver sẽ tương tác với trình duyệt (và trình điều khiển) thông qua Grid (Selenium Server). Khi đó, Grid có thể không nằm trên cùng một máy chủ với trình duyệt và trình điều khiển của nó, cũng như mã kiểm thử và WebDriver cũng có thể không nằm trên cùng một máy chủ với Grid hoặc trình duyệt. Quy trình tương tác từ xa này được mô tả trong hình sau. !Quy trình tương tác từ xa giữa WebDriver và trình duyệt - selenium.dev (Hình ảnh trích từ selenium.dev)
Như vậy có thể thấy rằng, khi sử dụng Grid, các trường hợp kiểm thử chỉ cần biết địa chỉ của Grid mà không cần cài đặt trình duyệt và trình điều khiển, giúp cho việc thực hiện kiểm thử trở nên rất đơn giản.
Bài viết này sẽ tập trung vào việc xây dựng và sử dụng Grid. Tiếp theo sẽ bao gồm các phần chính sau:
- Giới thiệu đoạn mã kiểm thử, sử dụng cách tương tác trực tiếp tại địa phương để thực hiện.
- Xây dựng môi trường Grid bằng cách sử dụng tệp
jar
gốc và thực hiện đoạn mã kiểm thử. - Xây dựng môi trường Grid bằng cách sử dụng hình ảnh Docker.
- Xây dựng môi trường Grid bằng cách sử dụng tệp mô tả Kubernetes.
1 Mã Kiểm Thử
Dưới đây là đoạn mã kiểm thử Selenium được viết bằng Python. Đây là một kịch bản kiểm thử đơn giản dành cho chức năng tìm kiếm của GitHub. Có các bước sau:
- Mở trang chủ của GitHub;
- Nhập từ khóa
Selenium
vào ô tìm kiếm và nhấn Enter; - Nhấp vào kết quả tìm kiếm đầu tiên và chờ trang chủ kho mở ra;
- Kiểm tra tiêu đề trang chủ kho chứa từ khóa
Selenium
.
import unittest
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
class GithubTestCase(unittest.TestCase):
def setUp(self):
self.browser = webdriver.Chrome()
self.addCleanup(self.browser.quit)
def test_search(self):
# Mở trang chủ GitHub
self.browser.get('https://github.com')
# Nhập từ khóa Selenium vào ô tìm kiếm và nhấn Enter
search_box_elem = self.browser.find_element(By.XPATH, '//input[@name="q"]')
search_box_elem.send_keys('Selenium' + Keys.RETURN)
# Nhấp vào kết quả tìm kiếm đầu tiên
first_result_elem = self.browser.find_element(By.XPATH, '//ul[@class="repo-list"]/li//div[@class="d-flex"]//a')
first_result_elem.click()
# Chờ tab Code xuất hiện, tức là trang chủ kho đã mở
WebDriverWait(self.browser, 10).until(EC.presence_of_element_located((By.ID, 'code-tab')))
# Kiểm tra tiêu đề trang chủ kho chứa Selenium
self.assertIn('Selenium', self.browser.title)
if '__main__' == __name__:
unittest.main(verbosity=2)
Đoạn mã kiểm thử trên sử dụng cách tương tác trực tiếp giữa WebDriver và trình duyệt (và trình điều khiển). Trước khi chạy đoạn mã này, cần cài đặt trình duyệt Chrome và ChromeDriver (tải xuống trình điều khiển tương ứng với phiên bản Chrome từ chromium.org, giải nén đến thư mục chỉ định và thêm thư mục cài đặt vào biến môi trường hệ thống). Đoạn mã kiểm thử sẽ điều khiển trình duyệt cục bộ thực hiện các bước đã chỉ định và in thông tin thành công.
2 Xây Dựng Grid Bằng Tệp jar
Tệp jar
của Grid phụ thuộc vào phiên bản Java 11 hoặc cao hơn.
Để sử dụng Grid, chế độ Standalone là cách đơn giản và nhanh chóng nhất.
Có thể tải xuống tệp selenium-server-<version>.jar
mới nhất từ trang phát hành của github.com/SeleniumHQ/selenium, sau đó sử dụng lệnh sau để khởi động:
java -jar selenium-server-<version>.jar standalone
Sau khi Grid khởi động xong, mở địa chỉ URL
!Giao diện người dùng của Selenium Grid
Tiếp theo, sửa đổi nhẹ đoạn mã kiểm thử (thay đổi cách lấy browser
thành cách viết sau) để chạy thành công.
self.browser = webdriver.Remote(
command_executor='http://localhost:4444/wd/hub',
options=webdriver.ChromeOptions()
)
Để sử dụng tốt hơn Grid, cần hiểu rõ về các vai trò bên trong nó.
- Hub: Chịu trách nhiệm phân phối các lệnh thao tác trình duyệt nhận được từ WebDriver đến Node tương ứng và trả lại kết quả nhận được từ Node cho WebDriver.
- Node: Chịu trách nhiệm nhận lệnh từ Hub và gọi trình điều khiển trình duyệt để thực hiện các thao tác trên trang.
Hub và Node có thể nằm trên các máy chủ khác nhau, giao tiếp với nhau thông qua giao thức HTTP. Lệnh khởi động Grid bằng cách sử dụng Hub và Node được chia nhỏ như sau:
# Khởi động Hub
java -jar selenium-server-<version>.jar hub
# Khởi động Node 1
java -jar selenium-server-<version>.jar node --port 5555
# Khởi động Node 2
java -jar selenium-server-<version>.jar node --port 6666
Sau khi khởi động xong, từ địa chỉ URL http://localhost:4444/ui
, có thể giám sát trạng thái của các Node.
!Giao diện người dùng của Selenium Grid
Cách sử dụng đoạn mã kiểm thử với Grid sẽ không thay đổi, vẫn chỉ cần chỉ định địa chỉ của Grid.
3 Xây Dựng Grid Bằng Hình Ảnh Docker
Lệnh khởi động nhanh một Grid ở chế độ Standalone bằng Docker như sau:
# Khởi động một Grid Chrome Standalone
docker run -d -p 4444:4444 -p 7900:7900 --shm-size="2g" selenium/standalone-chrome:4.4.0
Mở Chức năng tiện lợi khác của Grid phiên bản mới là có thể mở trực tiếp giao diện chạy desktop trong trình duyệt tại !Màn hình chạy của Selenium Grid Đoạn mã kiểm thử chỉ cần chỉ định địa chỉ RemoteWebDriver là Khởi động Grid bằng cách sử dụng Hub và Node với Docker như sau:
# Tạo mạng
docker network create grid
# Khởi động Hub
docker run -d -p 4442-4444:4442-4444 --net grid --name selenium-hub selenium/hub:4.4.0
# Khởi động một Node Chrome
docker run -d -p 7900:7900 --net grid -e SE_EVENT_BUS_HOST=selenium-hub \
--shm-size="2g" \
-e SE_EVENT_BUS_PUBLISH_PORT=4442 \
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 \
selenium/node-chrome:4.4.0
Cũng có thể thêm các Node trình duyệt khác theo nhu cầu, ví dụ lệnh dưới đây thêm Node Edge và Firefox.
# Thêm một Node Edge
docker run -d -p 7901:7900 --net grid -e SE_EVENT_BUS_HOST=selenium-hub \
--shm-size="2g" \
-e SE_EVENT_BUS_PUBLISH_PORT=4442 \
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 \
selenium/node-edge:4.4.0
# Thêm một Node Firefox
docker run -d -p 7902:7900 --net grid -e SE_EVENT_BUS_HOST=selenium-hub \
--shm-size="2g" \
-e SE_EVENT_BUS_PUBLISH_PORT=4442 \
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 \
selenium/node-firefox:4.4.0
Điều này cho thấy sức mạnh của Grid, cung cấp một nhóm trình duyệt mà các dự án kiểm thử chỉ cần chỉ định địa chỉ của Grid để sử dụng trình duyệt mong muốn, rất thuận tiện.
Muốn xem màn hình chạy của trình duyệt, truy cập
Một cách truyền thống khác để xem màn hình chạy của trình duyệt là sử dụng VNC. VNC là một công nghệ hiển thị bàn làm việc từ xa, bao gồm hai phần là server và client. Các hình ảnh Node của Grid mở cổng 5900
để cung cấp dịch vụ VNC. Nếu muốn sử dụng cách này để xem màn hình bên trong Node, cần tải xuống một client VNC.
Client VNC được sử dụng trong bài viết này là VNC Viewer. Tải xuống và cài đặt VNC Viewer từ trang tải về VNC Viewer.
Khởi động một Node Chrome khác và mở cổng 5900
bằng lệnh sau:
docker run -d -p 5900:5900 --net grid -e SE_EVENT_BUS_HOST=selenium-hub \
--shm-size="2g" \
-e SE_EVENT_BUS_PUBLISH_PORT=4442 \
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 \
selenium/node-chrome:4.4.0
Mở VNC Viewer, nhập localhost:5900
và nhấn Enter, sau đó nhập mật khẩu (secret
) để xem màn hình của Node Chrome.
!Xem màn hình chạy của Selenium Grid bằng VNC Viewer
4 Xây Dựng Grid Bằng Tệp Mô Tả Kubernetes
Nếu có môi trường Kubernetes, việc xây dựng Grid trên Kubernetes sẽ rất hữu ích. Khi đó, lộ trình URL của Grid được phơi bày qua Ingress của Kubernetes, có thể được sử dụng bởi bất kỳ dự án kiểm thử nào trong nhóm. Giai đoạn kiểm thử của pipeline tự động hóa cũng trở nên đơn giản hơn, không cần chuẩn bị môi trường chạy cho các trường hợp kiểm thử, chỉ cần chỉ định URL của Grid.
Bài viết này dựa trên môi trường Kubernetes tích hợp sẵn trong Docker Desktop, sử dụng tệp mô tả Kubernetes chính thức để slightly thay đổi và xây dựng một môi trường Selenium Hub/Node (tệp Yaml đã chỉnh sửa được sắp xếp trong kho GitHub cá nhân của tôi), sau đó phơi bày URL của Grid Hub để các dự án kiểm thử sử dụng và phơi bày URL màn hình của một Node Chrome để nhân viên kiểm thử xem.
Áp dụng tệp mô tả Deployment
và Service
của Selenium Hub/Node.
kubectl apply -f selenium-hub-deployment.yaml
kubectl apply -f selenium-node-chrome-deployment.yaml
kubectl apply -f selenium-hub-service.yaml
kubectl apply -f selenium-node-chrome-service.yaml
Phơi bày Selenium Hub:
kubectl expose deployment selenium-hub --name=selenium-hub-external --labels="app=selenium-hub,external=true" --type=LoadBalancer
Phơi bày Selenium Chrome Node:
kubectl expose deployment selenium-node-chrome --name=selenium-node-chrome-external --labels="app=selenium-hub,external=true" --type=LoadBalancer
Như vậy, có thể truy cập vào bảng điều khiển Selenium và màn hình Node Chrome tại địa chỉ cục bộ. Cũng có thể sử dụng cách VNC để xem màn hình Node trình duyệt trong Kubernetes. Sử dụng lệnh sau để chuyển tiếp cổng 5900 của Pod Chrome đến cục bộ:
PODNAME=`kubectl get pods --selector="app=selenium-node-chrome" --output=template --template="{{with index .items 0}}{{.metadata.name}}{{end}}"`
kubectl port-forward $PODNAME 5900:5900
Như vậy, sử dụng VNC Viewer để truy cập localhost:5900
sẽ thấy màn hình của Node Chrome.
Tóm lại, chúng ta đã giới thiệu một đoạn mã kiểm thử Selenium, xây dựng Grid bằng cách sử dụng tệp jar
, hình ảnh Docker và tệp mô tả Kubernetes, đồng thời giải thích cách sử dụng; còn giải thích cách xem màn hình chạy của trình duyệt trong các môi trường khác nhau. Điều này cung cấp sự hỗ trợ cho những ai sử dụng Selenium trong việc chuẩn bị môi trường cho việc gỡ lỗi cục bộ hoặc kiểm thử thực tế.
[1] Tài liệu Selenium Grid - selenium.dev
[2] SeleniumHQ/docker-selenium - github.com
[3] Selenium với Python - readthedocs.io

#Kiểm thử tự động #Python #Selenium