Cách kéo và thả vào Selenium (Thí dụ)

⚡ Tóm tắt thông minh

Kéo và thả vào Selenium WebDriver cho phép mô phỏng tự động các tương tác dựa trên chuột để di chuyển một phần tử nguồn và thả nó vào một mục tiêu được xác định. Lớp Actions hỗ trợ các thao tác này thông qua các phương thức dragAndDrop và dragAndDropBy để tự động hóa trình duyệt một cách chính xác và có thể lặp lại.

  • 🎓 Sử dụng lớp Actions để xây dựng các cử chỉ bàn phím và chuột, sau đó gọi build() và perform() để thực thi chúng trên trang.
  • 🌟 Chọn dragAndDrop(source, target) khi bạn có cả hai phần tử, và dragAndDropBy(source, xOffset, yOffset) khi bạn cần độ chính xác đến từng pixel.
  • 🚀 Luôn đợi cho đến khi các phần tử nguồn và đích xuất hiện đầy đủ trước khi thực hiện thao tác kéo để tránh các lỗi kiểm thử không ổn định.
  • 🎖️ Xác minh thao tác thả bằng cách quan sát trực quan hoặc bằng cách khẳng định sự thay đổi thuộc tính trên đối tượng mục tiêu để bài kiểm tra xác nhận tương tác thực sự, chứ không chỉ là một hành động được xếp vào hàng đợi.
  • 🏆 Các công cụ định vị hỗ trợ AI tự động sửa các XPath bị lỗi sau khi cập nhật giao diện người dùng, giảm thiểu việc bảo trì cho các bộ công cụ kéo thả chạy trong quy trình CI.

Kéo và thả vào Selenium

Chức năng kéo và thả là gì? Selenium?

Kéo và thả vào Selenium Đây là một tương tác tự động mô phỏng việc nhấp và giữ một phần tử nguồn, di chuyển nó trên trang và thả nó vào vị trí đích. Nó được sử dụng rộng rãi để kiểm thử các ứng dụng web hiện đại dựa trên giao diện kéo và thả, chẳng hạn như trình tải lên tập tin, bảng Kanban, cửa hàng trực tuyến.ping Giỏ hàng và công cụ xây dựng bảng điều khiển.

In Selenium WebDriver, thao tác kéo và thả được thực hiện thông qua... Hoạt động Lớp này cung cấp các phương thức chuyên biệt để kết hợp các cử chỉ chuột và thực thi chúng như một hành động tổng hợp duy nhất.

Kéo và thả vào Selenium

Lớp Actions cung cấp hai phương thức chính để tự động hóa thao tác kéo và thả:

Cú pháp:

Actions act = new Actions(driver);
//for drag and drop directly on an element
act.dragAndDrop(Source, Destination).build().perform();

//for drag and drop with pixel offsets
act.dragAndDropBy(WebElement Source, int xOffset, int yOffset).build().perform();

Ở đây, dragAndDrop() lấy các WebElements nguồn và đích, trong khi dragAndDropBy() Nó nhận phần tử nguồn và độ lệch pixel x/y để di chuyển phần tử đó.

Cách kéo và thả vào Selenium

Ba tình huống sau đây minh họa việc tự động hóa bằng thao tác kéo và thả thực tế trên... GuruTrang demo 99 https://demo.guru99.com/test/drag_drop.htmlMục tiêu là di chuyển NGÂN HÀNG phần tử ghi nợ vào Tài khoản khu vực bên nợ để số tiền 5000 đô la được hạch toán chính xác là giao dịch ghi nợ.

Tình huống 1: Kéo và thả bằng phương thức dragAndDrop

Trong trường hợp này, phần tử nguồn (NGÂN HÀNG) được kéo đến phần tử đích (Bên ghi nợ tài khoản) bằng cách sử dụng dragAndDrop(source, target) phương thức này chấp nhận trực tiếp các WebElement nguồn và đích.

Thiết lập kịch bản kéo và thả 1

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.interactions.Actions;

public class DragAndDropExample {
    public static void main(String[] args) {
        System.setProperty("webdriver.chrome.driver", "G:\\chromedriver.exe");
        WebDriver driver = new ChromeDriver();
        driver.get("https://demo.guru99.com/test/drag_drop.html");

        // Locate the source (BANK) element
        WebElement Source = driver.findElement(By.xpath("//*[@id='credit2']/a"));
        // Locate the target (Account debit side) element
        WebElement Dest = driver.findElement(By.xpath("//*[@id='bank']/li"));

        // Create the Actions instance
        Actions act = new Actions(driver);
        // Perform drag and drop
        act.dragAndDrop(Source, Dest).build().perform();
    }
}

Sau khi kịch bản chạy xong, NGÂN HÀNG ô gạch di chuyển vào Tài khoản khu vực ghi nợ và số tiền 5000 đô la được ghi nhận là khoản ghi nợ.

Eclipse chạy tập lệnh kéo và thả

Kết quả hiển thị trên trang demo trông như thế này:

Hoạt ảnh đầu ra kéo và thả

Tình huống 2: Kéo và thả bằng phương thức dragAndDropBy

dragAndDropBy(source, xOffset, yOffset) Phương pháp này cung cấp độ chính xác ở cấp độ pixel. Thay vì bỏ quaping Trên một phần tử mục tiêu, nó di chuyển nguồn một số pixel nhất định dọc theo trục X và Y.

Để xác định độ lệch, hãy di chuột qua khu vực đích trong trình duyệt của bạn và đọc tọa độ pixel bằng một công cụ như thước kiểm tra hoặc tiện ích mở rộng tọa độ màn hình.

Xác định độ lệch pixel cho thao tác kéo và thả bằng

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.interactions.Actions;

public class DragAndDropByExample {
    public static void main(String[] args) {
        System.setProperty("webdriver.chrome.driver", "G:\\chromedriver.exe");
        WebDriver driver = new ChromeDriver();
        driver.get("https://demo.guru99.com/test/drag_drop.html");

        // Locate the source (BANK) element
        WebElement Source = driver.findElement(By.xpath("//*[@id='credit2']/a"));

        // Create the Actions instance
        Actions act = new Actions(driver);
        // Drag the source by 400 pixels right and 0 pixels down
        act.dragAndDropBy(Source, 400, 0).build().perform();
    }
}

Đoạn mã này di chuyển ô BANK theo khoảng cách được cung cấp và đặt nó vào phía ghi nợ của Tài khoản, tạo ra kết quả tài chính tương tự như Kịch bản 1.

Tình huống 3: Kéo, thả và xác minh nhiều phần tử

Kịch bản này kết hợp nhiều thao tác kéo và thả, sau đó xác minh kết quả bằng cách khẳng định số tiền cuối cùng trên đích đến. Một số phần tử nguồn (BANK, SALES, 5000, 500) được di chuyển vào các vùng ghi nợ và ghi có tương ứng, và kịch bản xác nhận tổng số tiền khớp với số dư dự kiến.

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.interactions.Actions;

public class DragAndDropMultiple {
    public static void main(String[] args) {
        System.setProperty("webdriver.chrome.driver", "G:\\chromedriver.exe");
        WebDriver driver = new ChromeDriver();
        driver.get("https://demo.guru99.com/test/drag_drop.html");

        // Locate sources
        WebElement srcBank = driver.findElement(By.xpath("//*[@id='credit2']/a"));
        WebElement srcSales = driver.findElement(By.xpath("//*[@id='credit1']/a"));
        WebElement src5000 = driver.findElement(By.xpath("//*[@id='fourth']/a"));
        WebElement src500 = driver.findElement(By.xpath("//*[@id='fourth']/a"));

        // Locate targets
        WebElement debitSide = driver.findElement(By.xpath("//*[@id='bank']/li"));
        WebElement creditSide = driver.findElement(By.xpath("//*[@id='loan']/li"));
        WebElement amount7 = driver.findElement(By.xpath("//*[@id='amt7']/li"));
        WebElement amount8 = driver.findElement(By.xpath("//*[@id='amt8']/li"));

        Actions act = new Actions(driver);
        act.dragAndDrop(srcBank, debitSide).build().perform();
        act.dragAndDrop(srcSales, creditSide).build().perform();
        act.dragAndDrop(src5000, amount7).build().perform();
        act.dragAndDrop(src500, amount8).build().perform();

        // Verify the displayed total
        String total = driver.findElement(By.xpath("//*[@id='totamt']")).getText();
        if (total.equals("5500")) {
            System.out.println("Test Passed: total matches expected 5500");
        } else {
            System.out.println("Test Failed: actual total " + total);
        }
    }
}

Mô hình này minh họa cách kết hợp thao tác kéo thả với các khẳng định để xác thực hành vi chức năng, chứ không chỉ là chuyển động trực quan.

Các phương pháp tốt nhất cho tự động hóa kéo và thả

Các bài kiểm tra kéo và thả là một trong những loại kịch bản dễ gặp lỗi nhất. Selenium Bộ phần mềm này phụ thuộc vào tọa độ chuột chính xác và trạng thái sẵn sàng của DOM. Các biện pháp sau đây giúp đảm bảo độ tin cậy của chúng:

  • Chờ đợi các yếu tố: Sử dụng WebDriverWait với ExpectedConditions.elementToBeClickable trước khi thực hiện thao tác kéo.
  • Tôi thích thao tác kéo và thả hơn. JavaThủ thuật chỉnh sửa mã nguồn: Các sự kiện kéo thả HTML5 gốc đôi khi cần một JavaSử dụng kịch bản dự phòng, nhưng ưu tiên dựa vào API Hành động trước.
  • Di chuyển mục tiêu vào tầm nhìn: Việc chọn điểm đến không hiển thị trên màn hình sẽ gây ra lỗi không báo trước. Hãy sử dụng... Actions.scrollToElement hoặc một JavaCuộn kịch bản trước khi kéo.
  • Kiểm tra kết quả: Luôn luôn xác nhận sự thay đổi trạng thái có thể đo lường được (văn bản, thuộc tính, số lượng) sau khi thực hiện thao tác thả thay vì chỉ tin tưởng vào việc hành động đó đã được thực thi.
  • Chạy ở độ phân giải ổn định: Thao tác kéo bù pixel sẽ bị lỗi nếu kích thước khung nhìn khác với kích thước được sử dụng để tính toán độ bù.

Câu Hỏi Thường Gặp

Kéo và thả vào Selenium Đây là một thao tác chuột tự động, chọn một phần tử nguồn và thả nó vào một phần tử đích. Thao tác này được thực hiện thông qua lớp Actions bằng cách sử dụng dragAndDrop hoặc dragAndDropBy.

Phương thức `dragAndDrop` chấp nhận các phần tử web nguồn và đích. Phương thức `dragAndDropBy` nhận phần tử nguồn cộng thêm độ lệch pixel x và y, cho phép điều khiển chính xác khi đích đến không phải là một phần tử riêng biệt.

Hàm `build()` biên dịch các tương tác được xâu chuỗi thành một Action tổng hợp duy nhất, và hàm `perform()` thực thi Action đó. Nếu không có `perform()`, các bước được xếp hàng chờ sẽ không bao giờ được chạy trên trình duyệt.

Nhiều trang web HTML5 sử dụng các sự kiện kéo thả gốc mà API Actions không phải lúc nào cũng kích hoạt. Trong những trường hợp đó, hãy gửi các sự kiện dragstart, dragover và drop thông qua executeScript như một phương thức. JavaKịch bản dự phòng.

Mở công cụ dành cho nhà phát triển của trình duyệt, di chuột qua đích đến và đọc giá trị getBoundingClientRect của phần tử đó. SubtracSử dụng vị trí nguồn để xác định khoảng cách từ vị trí đích nhằm lấy được độ lệch x và y tính bằng pixel.

Đúng vậy. Hãy bọc các thao tác tìm kiếm nguồn và đích trong WebDriverWait với ExpectedConditions.elementToBeClickable để thao tác kéo chỉ chạy sau khi cả hai phần tử đều tương tác được, giảm thiểu sự không ổn định trong các lần chạy CI.

Các công cụ AI cung cấp các bộ định vị tự phục hồi, tự điều chỉnh khi XPath thay đổi và đề xuất các bộ chọn ổn định cho các phần tử nguồn và đích. Điều này giúp giảm thiểu việc bảo trì cho các bộ công cụ kéo thả chạy trên nhiều phiên bản khác nhau.

Đúng vậy. Trợ lý lập trình AI biến một kịch bản đơn giản bằng tiếng Anh như "kéo BANK sang bên ghi nợ và xác nhận tổng số tiền" thành một chuỗi hành động hoàn chỉnh với các bước kéo và thả, xây dựng, thực hiện và xác minh.

Tóm tắt bài viết này với: