htmlunit-driver - 如何模拟拖放?

时间:2017-01-16 21:37:45

标签: java selenium drag-and-drop htmlunit-driver

有没有办法用htmlunit-driver模拟拖放?

使用Actions时会抛出UnsupportedException

课程内HtmlUnitMouse

  @Override
  public void mouseMove(Coordinates where, long xOffset, long yOffset) {
    throw new UnsupportedOperationException("Moving to arbitrary X,Y coordinates not supported.");
  }

我尝试这样做的尝试:

首次尝试

(new Actions(driver)).dragAndDropBy(sliderHandle, 50, 0)
                     .build()
                     .perform();

第二次尝试

(new Actions(driver)).moveToElement(sliderHandle)
                     .clickAndHold()
                     .moveToElement(sliderHandle, 50, 0)
                     .release()
                     .build()
                     .perform();

有解决方法吗?

1 个答案:

答案 0 :(得分:1)

HtmlUnit是一个 GUI-Less浏览器,适用于Java程序,它可以为我们做很多事情,但不是一切。并且,正如您所注意到的,它不支持拖放等操作

new UnsupportedOperationException("Moving to arbitrary X,Y coordinates not supported.");

与其他Selenium驱动程序相反,例如,其中一个示例应该正常工作。

但是,如果您仍然需要使用无头网络测试,则可以使用PhantomJS选项。是的,它专注于JS测试,但是有一个很棒的项目叫Ghost Driver(简单的JS for PhantomJS中的Webdriver Wire协议的实现),它支持Java绑定和Selenium API。

使用它的步骤非常简单:

  1. Install PhantomJS in your OS并将可执行文件正确添加到PATH env变量中。
  2. 将Maven依赖项添加到您的pom.xml(以及Selenium libs:selenium-javaselenium-support):

    <dependency>
        <groupId>com.github.detro</groupId>
        <artifactId>phantomjsdriver</artifactId>
        <version>1.2.0</version>
    </dependency>
    
  3. 并调整您的代码以使用它:

    // Set this property, in order to specify path that PhantomJS executable will use
    System.setProperty("phantomjs.binary.path", System.getenv("PHANTOM_JS") + "/bin/phantomjs.exe");
    
    // New PhantomJS driver from ghostdriver
    WebDriver driver = new PhantomJSDriver();
    driver.get("https://jqueryui.com/resources/demos/draggable/default.html");
    
    // Find draggable element
    WebElement draggable = driver.findElement(By.id("draggable"));
    
    System.out.println("x: " + draggable.getLocation().x 
            + ", y: " + draggable.getLocation().y);
    
    // Perform drag and drop
    (new Actions(driver)).dragAndDropBy(draggable, 50, 0)
        .build()
        .perform();
    
    System.out.println("x: " + draggable.getLocation().x 
            + ", y: " + draggable.getLocation().y);
    
  4. 最终输出:

    x: 8, y: 8
    x: 58, y: 8