【问题标题】:Not able to drag element using Actions无法使用操作拖动元素
【发布时间】:2018-05-23 18:21:28
【问题描述】:

网址 - http://www.seleniumeasy.com/test/drag-and-drop-demo.html

System.setProperty("webdriver.chrome.driver",System.getProperty("user.dir")+"//drivers//chrome//chromedriver.exe");
WebDriver driver=new ChromeDriver();
    driver.manage().window().maximize();
    driver.get("http://www.seleniumeasy.com/test/drag-and-drop-demo.html");
    try {
        Thread.sleep(5000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    WebElement itemToBeDragged=driver.findElement(By.xpath(" (//h3[contains(.,'Items to Drag')]//following-sibling::span)[1]"));
WebElement 
   whereToBeDragged=driver.findElement(By.xpath("//div[@id='mydropzone']"));
    Actions action=new Actions(driver);
    Action dragAndDrop = action.clickAndHold(itemToBeDragged).moveToElement(whereToBeDragged).release(whereToBeDragged).build();
    dragAndDrop.perform();
    try {
        Thread.sleep(5000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    driver.close();

使用上面的代码我无法拖放元素。请帮忙!

【问题讨论】:

    标签: selenium


    【解决方案1】:

    在 url 上实现拖放存在问题:-http://www.seleniumeasy.com/test/drag-and-drop-demo.html,他们可能通过使用元素的悬停事件添加了拖放功能。

    1. 因此,除非或直到我们选择并将 itemToBeDragged 悬停一秒或更长时间,否则它不会将元素添加到拖动列表中,
    2. 并且以同样的方式,除非或直到我们不将所选 itemToBeDragged 悬停在(悬停)放置区域上,否则它不会放下拖动的元素。

    因此,对于这种特殊情况,您可以使用 java 的 Robot 类来生成实际的鼠标事件以在此页面上执行拖放操作,如下所示:-

    WebDriver browser = new ChromeDriver();
    browser.get("http://www.seleniumeasy.com/test/drag-and-drop-demo.html");
    
    // Robot class uses Screen Coordinates, therefore, we need the fullscreen browser 
    // instead of maximised. so that the webpage coordinates are mapped to screen
    // coordinates.
    browser.manage().window().fullscreen();
    
    WebElement itemToBeDragged = browser
                .findElement(By.xpath(" (//h3[contains(.,'Items to Drag')]//following-sibling::span)[1]"));
    WebElement whereToBeDragged = browser.findElement(By.xpath("//div[@id='mydropzone']"));
    
    // robot class object to perform actual mouse events.
    // import java.awt.Robot and java.awt.event.InputEvent
    Robot robot = new Robot();
    
    try {
            robot.mouseMove(itemToBeDragged.getLocation().x+itemToBeDragged.getSize().width/2, itemToBeDragged.getLocation().y+itemToBeDragged.getSize().getHeight()/2);
            Thread.sleep(1000);
            robot.mousePress(InputEvent.BUTTON1_MASK);
            robot.mouseMove(itemToBeDragged.getLocation().x+itemToBeDragged.getSize().width/3, itemToBeDragged.getLocation().y+itemToBeDragged.getSize().getHeight()/3);
            Thread.sleep(1000);
    
    
            Thread.sleep(1000);
            robot.mouseMove(whereToBeDragged.getLocation().x+whereToBeDragged.getSize().width/3, whereToBeDragged.getLocation().y+whereToBeDragged.getSize().getHeight()/3);
    
            Thread.sleep(1000);
            robot.mouseMove(whereToBeDragged.getLocation().x+whereToBeDragged.getSize().width/2, whereToBeDragged.getLocation().y+whereToBeDragged.getSize().getHeight()/2);
    
            Thread.sleep(1000);
            robot.mouseRelease(InputEvent.BUTTON1_MASK);
    
            Thread.sleep(1000);
        } catch (Exception e) {
            e.printStackTrace();
        }
    

    【讨论】:

    • 但是动作类的 moveToElement() 方法做同样的事情,它悬停在元素上。
    • @nandal 我在上面的代码中试过你,但对我不起作用
    【解决方案2】:

    你可以尝试使用builder吗

    实现这个方法

        public static void dragAndDrop(WebElement fromWebElement, WebElement toWebElement) {
    
        Actions builder = new Actions(driver);
        builder.dragAndDrop(fromWebElement, toWebElement);
    }
    

    【讨论】:

    • 这个方法我已经试过了。但它也不起作用
    • ok 你可以试试这个方法 public static void dragAndDrop_Method2(WebElement fromWebElement, WebElement toWebElement) { log.info("拖放一个元素");动作生成器 = 新动作(驱动程序);动作 dragAndDrop = builder.clickAndHold(fromWebElement).moveToElement(toWebElement).release(toWebElement) .build(); dragAndDrop.perform(); }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-28
    • 1970-01-01
    相关资源
    最近更新 更多