Việc xử lý kéo và thả trong Selenium Webdriver không phải lúc nào cũng phổ biến, nhưng đôi khi chúng ta cũng gặp phải. Và vì thời gian rảnh rỗi, tôi quyết định ghi lại những ghi chú này ở đây. Ai biết, có một ngày đẹp trời nào đó, chúng ta có thể sử dụng kiến thức này như một trận sét trong tình yêu!
Thường thì trong các trường hợp kéo và thả, các bước thao tác bao gồm việc kéo một nhãn (label) từ một nhóm sang nhóm khác, hoặc bạn có thể gặp khi danh sách một nhóm nào đó có nhiều mục và bạn cần sắp xếp lại vị trí của chúng bằng cách kéo lên hoặc kéo xuống vị trí mong muốn.
Đơn giản nhất, nếu bạn đã sử dụng Trello, thì việc kéo thả trực quan nhất được thể hiện thông qua kéo một công việc từ danh sách "Đang làm" sang danh sách "Hoàn thành".
Vậy nếu chúng ta sử dụng Selenium, nó sẽ xử lý như thế nào?
Selenium cung cấp một lớp (class) với các phương thức (method) để giúp bạn giải quyết vấn đề này, và cú pháp của nó như sau:
Actions builder = new Actions(driver); Action dragAndDrop = builder.clickAndHold(sourceLocator) .moveToElement(destinationLocator) .release(destinationLocator) .build(); dragAndDrop.perform();
Ở đây, lớp Actions có một phương thức là dragAndDrop(WebElement source, WebElement target), phương thức này nhằm mục đích thực hiện nhấp và giữ phần tử nguồn (source) và sau đó di chuyển phần tử đó đến vị trí đích (target) mà chúng ta muốn kéo đến. Tiếp theo, chúng ta thực hiện phương thức build() để tạo ra quá trình kéo và thả dragAndDrop cùng với các giá trị đầu vào là phần tử nguồn (source element) và phần tử đích (target element), và cuối cùng, thực hiện quá trình này bằng phương thức perform().
Hoặc bạn có thể sử dụng cú pháp sau để mô phỏng thao tác kéo và thả:
(new Actions(driver)).dragAndDrop(element, target).perform();
Với cú pháp này, chúng ta bỏ qua bước tạo quá trình (build method) và thực hiện thao tác ngay lập tức với phương thức perform().
Ngoài ra, còn nhiều cú pháp và cách khác mà bạn có thể sử dụng, bạn có thể tìm hiểu thêm trên Google! Hehe, với mình thì cách này tương đối dễ hiểu và dễ sử dụng. Nhưng điều này không có nghĩa là các cách khác khó dùng hoặc khó hiểu đâu nhé!
Đồng thời, để tránh các ngoại lệ (exception) hoặc lỗi không mong muốn do việc tải dữ liệu, vì trong nhiều trường hợp, các thao tác kéo và thả này được thực hiện trong thẻ iframe, do đó khi truy cập vào trang, dữ liệu không thể tải ngay lập tức. Và sau khi chúng ta thực hiện kéo và thả dữ liệu, cũng cần xác minh xem đã kéo và thả thành công và chính xác hay chưa (điều này phụ thuộc vào yêu cầu và kết quả của từng vấn đề).
Vì vậy, trước khi thực hiện thao tác này, chúng ta cần kiểm tra sự hiện diện của phần tử nguồn và phần tử đích. Và sau khi thực hiện thao tác, cần xác minh tính chính xác của nó, có thể thông qua việc xác nhận dữ liệu hiển thị hoặc hiển thị thông báo thành công khi hoàn thành thao tác.
Về mặt lý thuyết, điều cơ bản là bạn cần nắm vững cú pháp để thực hiện như đã nêu ở trên.
Dưới đây là ví dụ mã nguồn của tôi cho vấn đề này, bạn có thể tham khảo và hi vọng rằng nó sẽ giúp bạn hiểu rõ hơn về cách sử dụng nó.
package basic; import org.openqa.selenium.By; import org.openqa.selenium.WebElement; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.firefox.FirefoxOptions; import org.openqa.selenium.interactions.Action; import org.openqa.selenium.interactions.Actions; public class DragAndDrop { public static void main(String[] args) { System.setProperty("webdriver.gecko.driver","E:ProgramFirefoxgeckodriver.exe"); FirefoxOptions options = new FirefoxOptions(); options.setBinary("C:Program Files (x86)Mozilla Firefoxfirefox.exe"); FirefoxDriver driver = new FirefoxDriver(options); driver.get("http://www.testingbar.com/drag-and-drop/"); WebElement sourceLocator = driver.findElement(By.id("draggable")); WebElement destinationLocator = driver.findElement(By.id("droppable")); Actions builder = new Actions(driver); Action dragAndDrop = builder.clickAndHold(sourceLocator) .moveToElement(destinationLocator) .release(destinationLocator) .build(); dragAndDrop.perform(); } }
Bài viết gốc được đăng tải tại vananhtooo.wordpress.com
Có thể bạn quan tâm:
- [Viết 1 Test Case Đơn Giản Với Python Selenium WebDriver]
- [Selenium - Xác Định Đối Tượng UI]
- [Đợi đối tượng UI hoặc sự kiện với Selenium WebDriver]
Xem thêm Việc làm Developer hấp dẫn trên TopDev