web-dev-qa-db-ja.com

ターゲット要素と宛先要素が異なるフレームにあるときにSelenium-webdriverを使用してドラッグアンドドロップを実行するにはどうすればよいですか?

画像をドラッグしてCQ5コンポーネントにドロップする必要があります。画像とコンポーネントは異なるフレームにあります。

これは、ターゲットのフレームがアクティブなときにwebelement destinationが見つからなかったために機能しなかったコードです。

new Actions(driver).dragAndDrop(target, destination).perform();

私はまた、次のようにアクション間でフレームを切り替えようとしました:

    Actions builder = new Actions(driver);
    Actions action = builder.clickAndHold(target);
    driver.switchTo().frame("newFrame"); //switching frames
    builder.moveToElement(destination);
    builder.release(destination);
    builder.build();
    action.perform();

これも機能しませんでした。次に、画像をオフセットで動かしてみました

new Actions(driver).dragAndDropBy(target,  x, y).perform(); // x and y 

これにより画像が移動しましたが、コンポーネントが画像をキャプチャしませんでした。おそらくアクションが速すぎたためです。そのようなドラッグドロップを行う方法はありますか?

前もって感謝します。

13
9ikhan

あなたはそれを2つの部分に分ける必要があります。

// grab your element
Actions builder = new Actions(driver);
Actions action = builder.clickAndHold(target);
builder.build();
action.perform();

// switch to the frame (you havent told webdriver to un-grab
driver.switchTo().frame("newFrame"); //switching frames

// move and drop
Actions builder = new Actions(driver);
Actions action = builder.moveToElement(destination);
builder.release(destination);
builder.build();
action.perform();
6
adam goucher

私はあなたと同じprbを持っていました。 1つのフレームから葯に2つの要素をダーグアンドドロップすることはできません。アンサーのアッパーは正しいですが、Selenium3からこのソリューションは機能しなくなりました。作業範囲は、ソース要素(clickAndHolの後)を位置0,0に移動してから、2番目のフレームの下に移動することです。たとえば、150,150。

 Actions builder = new Actions(driver);
 // switsh to the source frame
 driver.switchTo().frame("sourceFrame");
 // take the element with mouse 
 builder.clickAndHold(sourceElt).build().perfom();
 // move mouse to the top of the source frame
 builder.moveToElement(sourceElt, 0, 0 ).build().perfom();
 // move the mouse under the target frame (specific to your case)
 builder.moveToElement(sourceElt, 150,200).build().perfom();
 // switsh to the target frame
 driver.switchTo().frame("targetFrame");
 builder.moveToElement(targetElt).build().perform();
 builder.release(target).build().perform();      

私もお役に立てば幸いです。

1
Ben Aissa Moez

Adobe CQ 5.5の解決策を見つけた人はいますか?

Adobe CQ 5.5で同じ問題に直面しています。複数の異なる方法を試していました。画像をドロップゾーンに移動できますが、画像がアクティブになっていないように見え、ドロップしても意味がありません。マウスポインタが画像とともに動いていないため、ドロップしても意味がないことがわかりました。マウスをドロップゾーンに移動するコードを追加しましたが、コマンドが個別に機能しているように見えるため、ドロップできません。提案をお願いします。

これが私のコードです(CQ 5.5では動作しません)

String handle = driver.getWindowHandle(); // for main window

//ウィンドウに切り替えて画像を選択できるようにする

driver.switchTo().window(handle);
WebElement dragble = driver.findElement(By.xpath("//xpath"));

Actions builder = new Actions(driver);
builder.clickAndHold(dragble);
Action action2 = builder.build();
action2.perform();

//次に、iframeに切り替えます

driver.switchTo().frame("cq-cf-frame");
WebElement droppable = driver.findElement(By.cssSelector("#cssSelector of droppable"));

//マウスをドロップ可能なゾーンに向けるロボット

Point coordinates = driver.findElement(By.cssSelector("#cssSelector of droppable")).getLocation();
Robot robot = new Robot();

//ドロップ可能な要素の場所を見つける

int x = driver.findElement(By.cssSelector("#ext-comp-1271")).getLocation().getX();
int y = driver.findElement(By.cssSelector("#ext-comp-1271")).getLocation().getY();

//ドラッグブルをドロップ可能に移動します

builder = new Actions(driver);
builder.moveByOffset(x,y).perform().
builder.build();
builder.release();
robot.mouseMove(coordinates.getX(),coordinates.getY()+120);
builder.release(droppable).perform();
1
Slav Kurochkin

Selenium/webdriverのドラッグアンドドロップにいくつかの問題があるようです。私はSeleniumの人々に欠陥を提出しました http://code.google.com/p/Selenium/issues/detail?id=442

うまくいけば、私たちはいくつかの肯定的な反応を得るでしょう。

1
Prashant Shukla

上記の解決策は、CQ5.5およびCQ5.6では機能しませんでした

これは機能します:

    Actions builder = new Actions(driver);
    builder.clickAndHold(sideKickComponent);
    Action action = builder.build();
    action.perform();

    driver.switchTo().frame("cq-cf-frame");
    builder = new Actions(driver);
    builder.moveToElement(destination).perform();
    builder.build();
    builder.release();
    builder.release(destination).perform();     

この方法により、便利なコンポーネントの配置が可能になります。

public void addComponentByDragAndDrop(String sideKickComponentName, WebElement destination){
        driver.switchTo().defaultContent();
        WebElement sidekick = driver.findElement(By.id("cq-sk"));
        List<WebElement> components =sidekick.findElements(By.tagName("button"));
        WebElement sideKickComponent = null;
        for (WebElement webElement : components) {
            if (webElement.getText().equals(sideKickComponentName)) {
                sideKickComponent = webElement;
                break;
            }
        }
        if (sideKickComponent == null) {
            fail("SideKick component with the name: "+sideKickComponentName + " was not found.");
        }
        Actions builder = new Actions(driver);
        builder.clickAndHold(sideKickComponent);
        Action action = builder.build();
        action.perform();

        driver.switchTo().frame(Consts.CQ_MAIN_FRAME);
        builder = new Actions(driver);
        builder.moveToElement(destination).perform();
        builder.build();
        builder.release();
        builder.release(destination).perform();     
    }
0
JNS
String source = "xpath_of_source";
String destination = "xpath_of_destination";

// grab your element
Actions builder = new Actions(driver);
Actions action = builder.clickAndHold(driver.findElement(By.xpath(source)));
builder.build();
action.perform();

// switch to the frame
driver.switchTo().frame("newFrame"); //switching frames

// move and drop
builder = new Actions(driver);
action = builder.moveToElement(driver.findElement(By.xpath(destination)));
builder.release(driver.findElement(By.xpath(destination)));
builder.build();
action.perform();
0
Anand Somani

このコードはCQ5.5で動作します

driver.switchTo().defaultContent();

Actions builder = new Actions(driver);
builder.clickAndHold(target);
Action action = builder.build();
action.perform();

driver.switchTo().frame("cq-cf-frame");
builder.moveToElement(destination);
builder.release(destination);     
action = builder.build();
action.perform();
0
theawesome

アクションクラスのオブジェクトを作成する

Actions act=new Actions(driver);

ドラッグする必要のある要素xpathを見つけます

WebElement drag=driver.findElement(By.xpath("put x path"));

ドロップする必要がある要素xpathを見つけます

WebElement drop=driver.findElement(By.xpath("put x path"));

要素を宛先にドラッグします

act.dragAndDrop(drag, drop).build().perform();

CQでドラッグアンドドロップを使用するには、最初にダブルクリック機能を使用し、任意のコンポーネントを配置してから、上記の方法を試してください。

0
Tejas Vinerkar

以下のコードは機能します。お役に立てば幸いです。

WebElement dragElement = (WebElement) elements.get(sourceElement);
Actions builder = new Actions(driver);          
Actions action = builder.clickAndHold(dragElement);
action.build().perform();
driver.switchTo().frame("cq-cf-frame");   
WebElement dropElement = driver.findElement(By.id("ext-comp-1411"));
builder.moveToElement(dropElement).build().perform();
//click the destination 
builder.click(dropElement).build().perform();
//back to main page to release the hold mouse
driver.switchTo().defaultContent();
builder.release(dragElement).build().perform();
0
Waylon Zhang

Iframeから別のiframeにドラッグアンドドロップするには、ソースWeb要素のiframe内のすべてのアクションを参照する必要があります。これを行うには、ターゲットiframeの親を取得し、それを使用して操作する必要があります。つまり、ターゲットiframeを持つdivであるCqFrameParentです。

ソースとターゲットは単一のiframeに属しているため、これを行うためにiframeを切り替える必要はありません。

builder.moveElement(CqFrameParent(), targetX, targetY).build().perform();
builder.release().build().perform();
0
JV_CQ