Trong quá trình sử dụng ứng dụng web, người dùng sẽ sử dụng bàn phím cũng như chuột để thao tác như nhấp đúp chuột, chọn nhiều giá trị dùng phím Ctrl+ nhấp chuột, kéo và thả… Trong bài viết này, chúng ta sẽ cùng tìm hiểu về cách xử lý các sự kiện của bàn phím và chuột sử dụng class Actions trong Selenium nhé.
Class Actions là gì?
Class Actions là một lớp được cung cấp bởi Selenium. Nó được dùng để xử lý các sự kiện của bàn phím (Nhấn phím ENTER, TAB…) và chuột (nhấp đúp chuột, chọn giá trị từ dropdown list, drag và drop)… , các thao tác này từ class Actions được thực hiện bằng cách sử dụng API tương tác người dùng nâng cao (advanced user interaction API) trong Selenium Webdriver.
Để sử dụng class Actions, các bạn thực hiện như sau:
Import thư viện
import org.openqa.selenium.interactions.Actions;
Khởi tạo đối tượng thuộc class Actions
Actions action = new Actions(driver);
Thực hiện thao tác phím hay chuột theo cấu trúc sau
action.Keyboard_mouse_method().build().perform();
- Keyboard_mouse_method() – là phương thức của bàn phím hoặc chuột được cung cấp bởi class Actions
- Chúng ta sử dụng .build().perform() để biên dịch và thực thi lớp action
Bây giờ, chúng ta hãy tìm hiểu về các phương thức khác nhau trong lớp này được sử dụng để thực hiện một số hành động nhé
Các phương thức thuộc class Actions
Về cơ bản, có hai phương pháp giúp làm việc với các hành động trong Selenium, đó là:
- Keyboard actions
- Mouse actions
- Pen actions
- Thanh cuộn (Scroll actions)
Keyboard Actions
# | Phương thức | Diễn giải | Ví dụ |
1 | sendKeys(CharSequence keysTosend) | Gửi một loạt các phím được nhấn đến phần tử web – Nhấn các phím shift/ctrl/tab … trên bàn phím | Actions action = new Actions(driver); action.sendKeys(Keys.ENTER).perform(); action.sendKeys(Keys.ESCAPE).perform(); action.sendKeys(Keys.TAB).perform(); action.sendKeys(“a”); |
2 | KeyDown() | Thực hiện nhấn phím bổ trợ. Không giải phóng phím bổ trợ Các tương tác tiếp theo có thể cho rằng nó được nhấn liên tục. | action.keyDown(Keys.CONTROL); |
3 | keyUp() | Thực hiện giải phóng phím bổ trợ | action.keyUp(Keys.CONTROL); |
Chúng ta có thể sử dụng Keys enum cho các phím không phải văn bản và chuyển chúng sang phương thức sendKeys như danh sách dưới đây. Các bạn cũng có thể xem ở đây
Các phím | Giá trị enum của phím |
---|---|
Arrow Key – Down | Keys.ARROW_DOWN |
Arrow Key – Up | Keys.ARROW_UP |
Arrow Key – Left | Keys.ARROW_LEFT |
Arrow Key – Right | Keys.ARROW_RIGHT |
Backspace | Keys.BACK_SPACE |
Ctrl Key | Keys.CONTROL |
Alt key | Keys.ALT |
DELETE | Keys.DELETE |
Enter Key | Keys.ENTER |
Shift Key | Keys.SHIFT |
Spacebar | Keys.SPACE |
Tab Key | Keys.TAB |
Equals Key | Keys.EQUALS |
Esc Key | Keys.ESCAPE |
Home Key | Keys.HOME |
Insert Key | Keys.INSERT |
PgUp Key | Keys.PAGE_UP |
PgDn Key | Keys.PAGE_DOWN |
Function Key F1 – F12 | Keys.Fx (trong đó Fx – giá trị từ F1 – F12) Ví dụ: Keys.F1 |
Mouse actions
# | Phương thức | Diễn giải | Ví dụ |
1 | click() | Thực hiện click chuột vào vị trí hiện tại | action.click(); |
2 | doubleClick() | Thực hiện double click vào phần tử | action.doubleClick(); |
3 | clickAndHold() | Thực hiện click và giữ chuột | action.clickAndHold(); |
4 | dragAndDrop(source, target) | Kéo phần tử từ điểm này và thả xuống điểm khác | action.dragAnđrop(elementSource, elementTarget); |
5 | dragAndDropBy(source, xOffset, yOffset) | Nhấp và giữ tại vị trí của phần tử nguồn, di chuyển theo một độ lệch nhất định | action.dragAndDropBy(elementSource, xOffset, yOffset) |
6 | moveByOffset(x-offset, y-offset) | Di chuyển chuột từ vị trí hiện tại của nó (hoặc 0,0) theo độ lệch đã cho | action.moveByOffset(x-offset, y-offset) |
7 | moveToElement(toElement) | Di chuyển con trỏ chuột đến trung tâm của phần tử (mouse hover) | action.moveToElement(toElement); |
8 | contextClick(): | Thực hiện click phải chuột | action.contextClick(); |
9 | release() | Nhả nút chuột trái đang nhấn tại vị trí chuột hiện tại | action.release(); |
Scroll actions
- Chức năng này chỉ hỗ trợ cho Chromium và Selenium từ phiên bản v4.2
- Có 5 kịch bản để cuộn trên một trang như sau:
# | Phương thức | Diễn giải | Ví dụ |
1 | scrollToElement(WebElement e) | Đây là kịch bản phổ biến nhất. Không giống như các phương thức truyền thống như click() và sendKeys(), class Actions sẽ không tự động thực hiện cuộn đến phần tử đích và để chế độ xem, vì vậy phương pháp này sẽ cần được sử dụng nếu các phần tử chưa có trong chế độ xem. Bất kể phần tử web đang ở trên hay dưới màn hình hiện tại, thì chế độ xem sẽ được cuộn đến phần dưới cùng của phần tử nằm ở cuối màn hình. | action.scrollToElement(element); |
2 | scrollByAmoit(int delta x, int delta y) | Đây là kịch bản phổ biến thứ hai để cuộn. Nhập giá trị delta x và delta y để biết mức độ cuộn theo hướng phải và đi xuống. Các giá trị âm tương ứng đại diện cho bên trái và đi lên. | action.scrollByAmount(300,800); |
3 | scrollFromOrgin(WheelInput.ScrollOrigin scrollOrigin, int deltaX, int deltaY) | Kịch bản này thực sự là sự kết hợp của hai phương pháp scrollToElement() và scrollByAmount(). Để thực hiện điều này, hãy sử dụng phương thức “Scroll From”, phương thức này có 3 đối số. – Cái đầu tiên đại diện cho điểm gốc mà chúng tôi chỉ định là phần tử – Hai cái còn lại là các giá trị delta x và delta y. Nếu phần tử nằm ngoài khung nhìn, nó sẽ được cuộn xuống cuối màn hình, sau đó trang sẽ được cuộn theo các giá trị delta x và delta y được cung cấp. | WheelInput.ScrollOrigin scrollOrigin = WheelInput.ScrollOrigin.fromElement(WebElement); action.scrollFromOrigin(scrollOrigin,0,300); |
Ví dụ sử dụng class Actions
Chúng ta đã hiểu cách khai báo cũng như các phương thức của class Actions, giờ chúng ta sẽ cùng thực hiện ví dụ sau nhé
Scenario
Truy cập vào trang https://devopsify.co/ thực hiện các hành động sau sử dụng phím và chuột thông qua class Actions
- Nhập thông tin tìm kiếm “selenium locator” vào ô Search
- Sao chép (Copy) lại nội dung tìm kiếm “selenium locator”
- Nhập lại nội dung tìm kiếm “javascript Executor”
- Nhập lại nội dung tìm kiếm bằng cách dán (paste) nôi dung “selenium locator” đã sao chép từ step 2.
- Nhấn phím ENTER để tìm kiếm
- Mouse hover chuột lên menu “Operation” và giữ 10 giây để xem nội dung danh sách bài viết Operation hiển thị
- Mouse hover chuột lên menu “Test” để xem nội dung hiển thị
Các bước thực hiện
_ Các bước truy cập vào trang web https://devopsify.co/ được thực hiện như các bài khác mình đã nói
Để thực hiện các hành động như yêu cầu, chúng ta sử dụng class Actions
- Để nhập thông tin chúng ta có thể sử dụng phương thức sendKeys(“enter text”)

- Để sao chép nội dung, đầu tiên chúng ta sẽ quét hết nội dung trong ô search (CTRL+A)

- Để dán chúng ta sử dụng CTRL+C

- Sau khi nhập nội dung tìm kiếm chúng ta sử dụng phím ENTER

Mouse hover chuột lên menu “Operation” và giữ 10 giây chúng ta dùng phương thức moveToElement() và pause()

Code
package SeleniumWebDriverTutorial; import io.github.bonigarcia.wdm.WebDriverManager; import org.openqa.selenium.By; import org.openqa.selenium.Keys; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.interactions.Actions; import java.security.Key; import java.time.Duration; public class actionsAndActionExample { public static void main(String[] args) throws InterruptedException { WebDriverManager.chromedriver().setup(); WebDriver driver = new ChromeDriver(); driver.manage().window().maximize(); //Navigate to https://devopsify.co/ driver.get("https://devopsify.co/"); Actions action = new Actions(driver); WebElement searchTxt = driver.findElement(By.className("jeg_search_input")); action.moveToElement(searchTxt) .click() .sendKeys("selenium locator") .perform(); action.keyDown(Keys.CONTROL) .sendKeys("A") //Select all (CTRL+A) .sendKeys("C") // CTRL+C .keyUp(Keys.CONTROL) .perform(); action.sendKeys("javascript Executor").perform(); Thread.sleep(500); action.moveToElement(searchTxt) .keyDown(Keys.CONTROL) .sendKeys("a") .keyUp(Keys.CONTROL) .keyDown(Keys.DELETE) .keyUp(Keys.DELETE) .keyDown(Keys.CONTROL) .sendKeys("V") .keyUp(Keys.CONTROL) .keyDown(Keys.ENTER) .perform(); WebElement testNav = driver.findElement(By.xpath("//div[@class='jeg_mainmenu_wrap']/ul/li[3]")); WebElement operationNav = driver.findElement(By.xpath("//div[@class='jeg_mainmenu_wrap']/ul/li[5]")); action.moveToElement(operationNav) .pause(Duration.ofSeconds(10)) .moveToElement(testNav) .perform(); } }
Cheers!