【问题标题】:htmlunit-driver - how to simulate drag-and-drop?htmlunit-driver - 如何模拟拖放?
【发布时间】:2017-01-16 21:37:45
【问题描述】:

有没有办法用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();

有解决办法吗?

【问题讨论】:

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


    【解决方案1】:

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

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

    与其他 Selenium 驱动程序(例如 )相反,您的示例应该可以正常工作。

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

    使用步骤非常简单:

    1. Install PhantomJS in your OS 并将可执行文件正确添加到您的 PATH 环境变量中。
    2. 将 Maven 依赖项添加到您的 pom.xml(连同 Selenium 库: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);
      

    最终输出:

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

    【讨论】:

    • 我已将我的测试切换为现在使用 PhantomJSDriver。使用 PhantomJSDriver 的唯一缺点是它需要在运行测试的计算机上安装 PhantomJS,而 HtmlUnit 则没有这个要求。
    • 是的,这是你应该有的耦合。但是,正如我所说,HtmlUnit 不是灵丹妙药,它存在基于不同方法的局限性。我建议你看看那些:What are the limitations of Headless(HtmlUnitDriver) browser testing in selenium?Selenium vs HtmlUnit?
    • 感谢您提供此信息。我目前通过使用配置文件和类别来解决 phantomjs 要求的问题。 (并在构建服务器上添加带有 phantomjs 配置文件的构建步骤。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-05
    • 2015-06-05
    • 2018-09-21
    • 2010-11-13
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多