画像をドラッグして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
これにより画像が移動しましたが、コンポーネントが画像をキャプチャしませんでした。おそらくアクションが速すぎたためです。そのようなドラッグドロップを行う方法はありますか?
前もって感謝します。
あなたはそれを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();
私はあなたと同じ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();
私もお役に立てば幸いです。
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();
Selenium/webdriverのドラッグアンドドロップにいくつかの問題があるようです。私はSeleniumの人々に欠陥を提出しました http://code.google.com/p/Selenium/issues/detail?id=442
うまくいけば、私たちはいくつかの肯定的な反応を得るでしょう。
上記の解決策は、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();
}
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();
このコードは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();
アクションクラスのオブジェクトを作成する
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でドラッグアンドドロップを使用するには、最初にダブルクリック機能を使用し、任意のコンポーネントを配置してから、上記の方法を試してください。
以下のコードは機能します。お役に立てば幸いです。
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();
Iframeから別のiframeにドラッグアンドドロップするには、ソースWeb要素のiframe内のすべてのアクションを参照する必要があります。これを行うには、ターゲットiframeの親を取得し、それを使用して操作する必要があります。つまり、ターゲットiframeを持つdivであるCqFrameParentです。
ソースとターゲットは単一のiframeに属しているため、これを行うためにiframeを切り替える必要はありません。
builder.moveElement(CqFrameParent(), targetX, targetY).build().perform();
builder.release().build().perform();