ドラッグアンドドロップインの方法 Selenium (例)

⚡ スマートサマリー

ドラッグアンドドロップ Selenium WebDriver を使用すると、マウス操作によるインタラクションを自動的にシミュレーションできます。これは、ソース要素を移動させ、指定されたターゲットにドロップする操作です。Actions クラスは、dragAndDrop メソッドと dragAndDropBy メソッドを通じてこれらのジェスチャーを駆動し、正確で再現性の高いブラウザ自動化を実現します。

  • 🎓 Actions クラスを使用してキーボードとマウスのジェスチャーを作成し、build() と perform() を呼び出してページ上で実行します。
  • 🌟 両方の要素がある場合は dragAndDrop(source, target) を選択し、ピクセルレベルの精度が必要な場合は dragAndDropBy(source, xOffset, yOffset) を選択してください。
  • 🚀 不安定なテストを避けるため、ドラッグ操作を実行する前に、必ずソース要素とターゲット要素が存在することを確認してください。
  • 🎖️ ドロップを視覚的に検証するか、ターゲットの属性変更をアサートすることで、テストがキューに入れられたアクションだけでなく、実際のインタラクションを確認するようにします。
  • 🏆 AI 支援ロケーターは、UI 更新後に破損した XPath を修復し、CI パイプラインで実行されるドラッグ アンド ドロップ スイートのメンテナンスを軽減します。

ドラッグアンドドロップ Selenium

ドラッグアンドドロップとは何ですか Selenium?

ドラッグアンドドロップ Selenium これは、ソース要素をクリックして長押しし、ページ上を移動させて、ターゲット位置で離すという動作をシミュレートする自動化された操作です。ファイルアップローダー、カンバンボード、ショップなど、ドラッグアンドドロップインターフェースに依存する最新のWebアプリケーションのテストに広く使用されています。ping カート、ダッシュボードビルダー。

In Selenium WebDriverでは、ドラッグアンドドロップは このクラスは、マウスのジェスチャーを連結して単一の複合アクションとして実行するための特殊なメソッドを提供します。

ドラッグアンドドロップ Selenium

Actionsクラスは、ドラッグアンドドロップによる自動化のための2つの主要なメソッドを提供します。

構文:

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() ソースと宛先の WebElement を受け取り、 dragAndDropBy() ソース要素と、それを移動させるためのx/yピクセルオフセットを受け取ります。

ドラッグアンドドロップインの方法 Selenium

以下の 3 つのシナリオは、 Guru99 デモページ https://demo.guru99.com/test/drag_drop.html目標は、 バンク 借方要素を アカウント 借方側の領域で、5000ドルの金額が正しく借方取引として計上されるようにします。

シナリオ1:dragAndDropメソッドを使用したドラッグアンドドロップ

このシナリオでは、ソース要素(BANK)を、 dragAndDrop(source, target) ソースおよび宛先の WebElement を直接受け取るメソッド。

ドラッグアンドドロップシナリオ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);
        }
    }
}

このパターンは、ドラッグ&ドロップとアサーションを組み合わせることで、視覚的な動きだけでなく、機能的な動作も検証できることを示しています。

ドラッグ&ドロップ自動化のベストプラクティス

ドラッグアンドドロップテストは、最も不安定なスクリプトの1つです。 Selenium これらのスイートは、正確なマウス座標とDOMの準備状況に依存するため、信頼性が低い。以下の対策を講じることで、これらの信頼性を維持できる。

  • 要素を待機する:   WebDriverWait   ExpectedConditions.elementToBeClickable ドラッグを呼び出す前に。
  • ドラッグアンドドロップを優先する Javaスクリプトのハック: ネイティブ HTML5 ドラッグ イベントでは、 Javaスクリプトによるフォールバックも可能ですが、まずはActions APIを利用することをお勧めします。
  • 対象物を画面にスクロール表示します。 画面外の宛先では、サイレントエラーが発生します。 Actions.scrollToElement または Javaドラッグする前にスクリプトをスクロールしてください。
  • 結果を確認してください: アクションが実行されたと信頼するのではなく、ドロップ後に必ず測定可能な状態変化(テキスト、属性、カウント)を主張してください。
  • 安定した解像度で実行してください。 ビューポートのサイズがオフセットの計算に使用されたサイズと異なる場合、ピクセルオフセットによるドラッグ操作は失敗します。

よくあるご質問

ドラッグアンドドロップ Selenium は、マウスの自動操作で、ソース要素をピックアップしてターゲット要素にドロップします。これは、ActionsクラスのdragAndDropまたはdragAndDropByを使用して実行されます。

dragAndDrop は、ソースと宛先の WebElement を受け取ります。dragAndDropBy は、ソースに加えて x ピクセルと y ピクセルのオフセットを受け取り、宛先が個別の要素でない場合に正確な制御を可能にします。

build() は連鎖したインタラクションを単一の複合アクションにコンパイルし、perform() はそれを実行します。perform() がないと、キューに入れられたステップはブラウザ上で実行されません。

多くの HTML5 サイトは、Actions API が常にトリガーするとは限らないネイティブのドラッグ イベントを使用します。そのような場合は、executeScript を介して dragstart、dragover、および drop イベントをディスパッチします。 Javaスクリプトのフォールバック。

ブラウザの開発者ツールを開き、目的の要素にカーソルを合わせ、要素のgetBoundingClientRect値を読み取ります。tracターゲット位置からソース位置をtで切り離して、ピクセル単位のxおよびyオフセットを取得します。

はい。ソースとターゲットのルックアップを、ExpectedConditions.elementToBeClickable を含む WebDriverWait でラップすることで、両方の要素がインタラクティブになった後にのみドラッグが実行され、CI 実行時の不安定さを軽減できます。

AIツールは、XPathが変更された際に適応する自己修復型ロケーターを提供し、ソース要素とターゲット要素に対して安定したセレクタを推奨します。これにより、リリースをまたいで動作するドラッグ&ドロップスイートのメンテナンスが軽減されます。

はい。AIコーディングアシスタントは、「BANKをデビット側にドラッグして合計金額を確定する」といった平易な英語のシナリオを、ドラッグアンドドロップ、構築、実行、検証ステップを含む完全なアクションチェーンに変換します。