Как да влачите и пускате Selenium (Пример)

⚡ Умно обобщение

Плъзгане и пускане Selenium WebDriver позволява автоматизирана симулация на взаимодействия, базирани на мишка, които преместват изходен елемент и го освобождават върху определена цел. Класът Actions захранва тези жестове чрез методите dragAndDrop и dragAndDropBy за прецизна и повтаряема автоматизация на браузъра.

  • 🎓 Използвайте класа Actions, за да изградите жестове с клавиатура и мишка, след което извикайте build() и perform(), за да ги изпълните на страницата.
  • 🌟 Изберете dragAndDrop(source, target), когато имате и двата елемента, и dragAndDropBy(source, xOffset, yOffset), когато ви е необходима точност на ниво пиксел.
  • 🚀 Винаги изчаквайте изходните и целевите елементи да са налични, преди да извикате операцията по плъзгане, за да избегнете нестабилни тестове.
  • 🎖️ Проверете падането визуално или като потвърдите промени в атрибутите на целта, така че тестът да потвърди реално взаимодействие, а не просто действие в опашката.
  • 🏆 Локаторите, подпомагани от изкуствен интелект, поправят счупени XPath-ове след актуализации на потребителския интерфейс, което намалява поддръжката за пакети с плъзгане и пускане, работещи в CI конвейери.

Плъзгане и пускане Selenium

Какво е „плъзгане и пускане“ Selenium?

Плъзгане и пускане Selenium е автоматизирано взаимодействие, което симулира щракване и задържане на изходен елемент, преместването му по страницата и пускането му на целево място. Широко се използва за тестване на съвременни уеб приложения, които разчитат на интерфейси за плъзгане и пускане, като например качващи файлове, канбан табла, магазини.ping колички и конструктори на табла.

In Selenium WebDriver, плъзгането и пускането се извършва чрез Действия клас, който предоставя специализирани методи за верижно свързване на жестове с мишката и изпълнението им като едно съставно действие.

Плъзгане и пускане Selenium

Класът Actions предоставя два основни метода за автоматизация на плъзгане и пускане:

Синтаксис:

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();

Тук dragAndDrop() приема изходния и целевия WebElements, докато dragAndDropBy() взема изходния елемент и отместванията на пикселите x/y, за да го премести.

Как да влачите и пускате Selenium

Следните три сценария демонстрират практическа автоматизация с плъзгане и пускане на Guru99 демонстрационна страница https://demo.guru99.com/test/drag_drop.htmlЦелта е да се премести БАНКА дебитен елемент в Акаунт дебитната страна, така че сумата от $5000 да бъде правилно осчетоводена като дебитна транзакция.

Сценарий 1: Плъзгане и пускане с помощта на метода dragAndDrop

В този сценарий, изходният елемент (BANK) се изтегля върху местоназначението (дебитна страна на сметката), използвайки dragAndDrop(source, target) метод, който приема директно изходния и целевия WebElements.

Настройка на сценарий 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();
    }
}

След като скриптът се изпълни, БАНКА плочката се премества в Акаунт дебитна зона и сумата от $5000 е регистрирана като дебит.

Eclipse изпълнение на скрипта за плъзгане и пускане

Визуалният резултат на демонстрационната страница изглежда така:

Анимация на изхода с плъзгане и пускане

Сценарий 2: Плъзгане и пускане с помощта на метода dragAndDropBy

- dragAndDropBy(source, xOffset, yOffset) методът предлага прецизност на ниво пиксел. Вместо да се пускатping Върху целевия елемент, той премества източника с определен брой пиксели по осите X и Y.

За да определите отместването, задръжте курсора на мишката върху целевата област в браузъра си и прочетете пикселните координати с инструмент като линийката на инспектора или разширението за екранни координати.

Идентифициране на пикселни отмествания за dragAndDropBy

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();
    }
}

Скриптът премества плочката BANK с предоставеното отместване и я поставя върху дебитната страна на сметката, което води до същия финансов резултат като в Сценарий 1.

Сценарий 3: Плъзгане, пускане и проверка на множество елементи

Този сценарий свързва множество операции с плъзгане и пускане и проверява резултата, като потвърждава крайната сума в целта. Няколко изходни елемента (BANK, SALES, 5000, 500) се преместват в съответните им дебитни и кредитни зони и скриптът потвърждава, че общите суми съответстват на очакваното салдо.

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);
        }
    }
}

Този модел демонстрира как плъзгането и пускането може да се комбинира с твърдения, за да се валидира функционално поведение, а не само визуално движение.

Най-добри практики за автоматизация на плъзгане и пускане

Тестовете с плъзгане и пускане са сред най-нестабилните скриптове в Selenium пакет, защото зависят от точни координати на мишката и готовност на DOM. Следните практики ги поддържат надеждни:

  • Изчакайте елементите: употреба WebDriverWait с ExpectedConditions.elementToBeClickable преди да се задейства плъзгането.
  • Предпочитам dragAndDrop пред JavaХакове за скриптове: Събитията за плъзгане в оригиналния HTML5 понякога се нуждаят от JavaРезервен скрипт, но първо разчитайте на API за действия.
  • Превъртете целта в полезрението: Дестинация извън екрана причинява тихи повреди. Използвайте Actions.scrollToElement или JavaПревъртане на скрипта преди плъзгане.
  • Проверете резултата: Винаги заявявайте измерима промяна на състоянието (текст, атрибут, брой) след пускането, вместо да се доверявате на изпълнението на действието.
  • Работи със стабилна резолюция: Плъзгането на пикселно отместване се прекъсва, ако размерът на прозореца за преглед се различава от този, използван за изчисляване на отместванията.

Въпроси и Отговори

Плъзгане и пускане Selenium е автоматизиран жест с мишката, който взема изходен елемент и го освобождава върху целта. Изпълнява се чрез класа Actions, използвайки dragAndDrop или dragAndDropBy.

dragAndDrop приема изходните и целевите WebElements. dragAndDropBy приема изходния елемент плюс отместванията по x и y, което дава прецизен контрол, когато целевият елемент не е дискретен елемент.

build() компилира верижните взаимодействия в едно съставно действие (Action), а perform() го изпълнява. Без perform(), стъпките в опашката никога не се изпълняват в браузъра.

Много HTML5 сайтове използват вградени събития за плъзгане, които API-то за действия не винаги задейства. В тези случаи, изпратете събитията dragstart, dragover и drop чрез executeScript като JavaРезервен скрипт.

Отворете DevTools на браузъра, задръжте курсора на мишката върху дестинацията и прочетете стойностите на getBoundingClientRect на елемента.tracОтделете позицията на източника от целевата позиция, за да получите отместванията по x и y в пиксели.

Да. Обвийте изходните и целевите търсения в WebDriverWait с ExpectedConditions.elementToBeClickable, така че плъзгането да се изпълнява само след като и двата елемента са интерактивни, намалявайки нестабилността при CI изпълненията.

Инструментите с изкуствен интелект предоставят самовъзстановяващи се локатори, които се адаптират при промяна на XPath и препоръчват стабилни селектори за изходни и целеви елементи. Това намалява поддръжката за пакети с плъзгане и пускане, работещи в различни версии.

Да. Асистентите за кодиране с изкуствен интелект превръщат сценарий на обикновен английски език, като например „плъзнете БАНКА към дебитната страна и утвърдете общата сума“ в пълна верига от действия с dragAndDrop, изграждане, изпълнение и стъпка за проверка.

Обобщете тази публикация с: