【问题标题】:Drag and Drop doesn't work inside iFrame with Selenium WebDriver with Java使用 Selenium WebDriver 和 Java 在 iF​​rame 中拖放不起作用
【发布时间】:2018-02-26 13:08:52
【问题描述】:

我正在尝试使用 Selenium 和 Java 执行拖放操作,但它不起作用..可能是什么原因..它没有给我任何错误,但它没有发生..

这是我的代码。

public class ActionDragDrop {

    public static void main(String[] args) throws InterruptedException {

        WebDriver driver = new ChromeDriver();
        driver.get("https://www.w3schools.com/html/tryit.asp?filename=tryhtml5_draganddrop");
        driver.manage().window().maximize();
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        WebElement f=driver.findElement(By.xpath("//*[@id='iframeResult']"));
        driver.switchTo().frame(f);

        WebElement drag = driver.findElement(By.xpath("//*[@id='drag1']"));
        WebElement drop = driver.findElement(By.xpath("//*[@id='div1']"));

        Actions builder = new Actions(driver);
        Actions dragAndDrop = builder.clickAndHold(drag);
        builder.moveToElement(drop);
        builder.release(drop);
        builder.build();
        dragAndDrop.perform();  
    } 
}

【问题讨论】:

  • 什么是错误,你错过了 setproperty
  • 它在 Chrome 上运行良好,唯一没有发生的是拖放。它没有给我任何错误。
  • 这就是逻辑问题
  • 我单独点击了元素,它们工作正常。唯一没有发生的是拖放。我不确定我在这里面临哪种问题。
  • 你我也面临同样的问题,奇怪

标签: java selenium iframe webdriver action


【解决方案1】:

您将首先切换到 iframe 以执行拖放事件:

driver.switchTo().frame(0);                      //Move inside to the frame. 
WebElement body = driver.findElement(By.tagName("body"));
body.click();
WebElement from = driver.findElement(By.xpath("//your xpath")); 
Actions act = new Actions(driver);
act.clickAndHold(from).build().perform();
Thread.sleep(4000);
driver.switchTo().defaultContent();              //Move outside to the frame.

driver.switchTo().frame(1);                     //Move inside to another frame.
WebElement body = driver.findElement(By.tagName("body"));
body.click();
WebElement to = driver.findElement(By.id("guide_RIGHT_SAFETY_rect"));
act.clickAndHold(to).moveToElement(to).release(to).build().perform();
Thread.sleep(2000);
driver.switchTo().defaultContent();                //Move outside to another frame.

注意:请使用您的 xpath、id、类名等,我刚刚复制了一个示例。或多或少的想法应该是相同的。

【讨论】:

  • 我用这段代码做了同样的事情 --- WebElement f=driver.findElement(By.xpath("//*[@id='iframeResult']")); driver.switchTo().frame(f);
  • 你能分享你想要达到同样效果的页面的 POM 吗?
  • 我只是使用 main 方法运行简单的 java 程序。任何框架和 Maven 都没有附加到此。
  • @anshul Gupta,我猜 fromto 元素在同一个 iframe 中,因此无需从一个 iframe 移动到另一个 iframe。
  • @JainishKapadia 当然,我只是给他一个例子,说明如何做到这一点 iframe 可以相同。
【解决方案2】:

试试下面的代码。

因为您的fromto web 元素位于同一个iframe 内。首先你需要在iframe.里面切换

driver.get("https://www.w3schools.com/html/tryit.asp?filename=tryhtml5_draganddrop");
driver.manage().window().maximize();

driver.switchTo().frame("iframeResult");   //Move inside to the frame. 
WebElement body = driver.findElement(By.tagName("body"));
body.click();
WebElement from = driver.findElement(By.xpath("//img[@id='drag1']")); 
WebElement to = driver.findElement(By.xpath("//div[@id='div1']"));

Actions act = new Actions(driver);
act.clickAndHold(from).perform();
Thread.sleep(4000);
act.clickAndHold().moveToElement(to).release(to).build().perform();
Thread.sleep(2000);
driver.switchTo().defaultContent();    //Move outside to the frame.

【讨论】:

  • 实际上问题是代码执行成功,没有显示任何错误。请在您最后查看我的代码,看看是否显示任何错误。我猜 Action 类不再起作用最新的 selenium 3.5.3
  • 您也可以查看我的这个问题。有关更多详细信息,请参阅此问题。 stackoverflow.com/questions/45911879/…
  • 如果您有其他方法可以解决此类问题,请提供您的建议。 (比如我们可以在不使用动作类的情况下实现这个功能吗?)
  • 是的,我会试试的。但这很奇怪
  • 我也想知道为什么它不起作用?是否有任何地方记录此操作是否不适用于某某版本的硒?我在这里看不到 - raw.githubusercontent.com/SeleniumHQ/selenium/master/java/…
【解决方案3】:

我做了很多实验,终于在Python中找到了如下代码的解决方案。

DragAndDrop 的失败不是 iframe 引起的。

只需将每个步骤分开并执行即可。

# drag leftbox and drop on rightbox

actions = ActionChains(driver)
actions.click_and_hold(leftbox).perform()
sleep(4)
actions.move_to_element(rightbox).perform()
sleep(4)
actions.release(rightbox).perform()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 2017-01-19
    • 1970-01-01
    相关资源
    最近更新 更多