0

我正在编写集成/e2e 测试,由于某种原因,任何 selenium 驱动程序命令都看不到与 chromedriver 一起使用,但它们与 firefox 驱动程序和 firefox 无头驱动程序完美配合。

尝试的命令:moveByOffsetdoubleClick

尝试了 Geb 的 Interact 方法

interact {
 doubleClick(centerClickable)
}

并直接访问网络驱动程序:

def driver = browser.getDriver()
Actions action = new Actions(driver)
WebElement element= driver.findElement(By.className("vis-drag-center"))
def doubleclick = action.doubleClick(element).build()
doubleclick.perform()

这两种方法都适用于 firefox 驱动程序。两者都不适用于 chrome 驱动程序。

GebConfig.groovy 文件是这样设置的:

import io.github.bonigarcia.wdm.WebDriverManager
import org.openqa.selenium.Dimension
import org.openqa.selenium.chrome.ChromeDriver
import org.openqa.selenium.chrome.ChromeOptions
import org.openqa.selenium.firefox.FirefoxDriver
import org.openqa.selenium.firefox.FirefoxOptions

def chromeWebDriverVersion = '70.0.3538.67'

def driverFirefox = {
  WebDriverManager.firefoxdriver().setup()
  def driver = new FirefoxDriver()
  driver.manage().window().setSize(new Dimension(width, height))
  return driver
}

// ChromeDriver reference: https://sites.google.com/a/chromium.org/chromedriver/
// Download and configure ChromeDriver using https://github.com/bonigarcia/webdrivermanager
def driverChrome = {
  WebDriverManager.chromedriver().version(chromeWebDriverVersion).setup()
  def driver = new ChromeDriver()
  driver.manage().window().setSize(new Dimension(width, height))
  return driver
}

environments {
  firefox {
    driver = driverFirefox
  }
  chrome {
    driver = driverChrome
  }
//driver = driverFirefox
driver = driverChrome

我还尝试了 2.43 版的 chrome。

附加信息:

  • 麦克莫哈韦
  • 硒 v 3.7.0
  • geb v 2.2
  • spockcore v 1.1-groovy-2.4
  • 时髦的 v 2.4.5
  • webdrivermanager v 3.0.0

如果有人感兴趣,测试在做什么:通过单击选择一个 vis.js 元素。休眠一秒钟(此处未包含代码),然后通过双击打开/激活它。或者拖动它。

除了 selenium 动作之外,chromedriver 和 geb 都可以正常工作。只是现在我需要 doubleClick 和 moveByOffset (而不是移动到元素!),我遇到了让事情正常工作的问题

我在这里发现了一个类似的问题,可能是同一个问题。也许不吧。但是没有提供解决方案:Selenium Web Driver DragAndDropToOffset in Chrome not working?

非常感谢任何帮助。

4

2 回答 2

0

我只是有一点时间并且很好奇,因为我以前从未尝试在任何测试中执行双击。所以我使用这个页面作为测试用例,并使用 Firefox 和 Chrome 驱动程序运行以下测试:

package de.scrum_master.stackoverflow

import geb.spock.GebReportingSpec
import org.openqa.selenium.By
import org.openqa.selenium.interactions.Actions

class DoubleClickTest extends GebReportingSpec {
  def "double-click via Geb interaction"() {
    given:
    go "https://demo.guru99.com/test/simple_context_menu.html"
    def doubleClickButton = $("button", text: "Double-Click Me To See Alert")

    expect:
    withAlert {
      interact {
        doubleClick(doubleClickButton)
      }
    } == "You double clicked me.. Thank You.."
  }

  def "double-click via Selenium action"() {
    given:
    go "https://demo.guru99.com/test/simple_context_menu.html"
    def doubleClickButton = driver.findElement(By.tagName("button"))
    def doubleClick = new Actions(driver).doubleClick(doubleClickButton).build()

    expect:
    withAlert {
      doubleClick.perform()
    } == "You double clicked me.. Thank You.."
  }
}

它完美地工作,双击的两种方式都会触发预期的 Javascript 警报。

我什至没有使用最新的驱动程序版本 2.45,而是在 Windows 10 上针对 Chrome 71 64 位使用 2.41。此外,我还使用了 bonigarcia 的 Webdriver Manager。我不知道你的设置有什么问题。我的 Selenium 版本是 3.14.0,比你的更新一点,Geb 2.2、Spock 1.1-groovy-2.4、Groovy 2.4.7。

也许这是MacOS的东西?我无法验证这一点。也许您只是先运行我的测试,然后升级您的 Selenium,如果这也无济于事,请尝试降级 Chrome 驱动程序,以找出问题是否与驱动程序版本有关。


更新:我升级到 Chrome 驱动程序 2.45,测试仍然有效。


2022-02-16 更新:更新了测试以使用另一个示例页面,因为旧 URL 仍然存在,但那里的 Javascript 不再有效。

于 2018-12-24T01:20:33.087 回答
0

感谢您的回复 kriegaex。你的测试也对我有用。这让我认为 selenium 的 chromedriver 和 firefox 驱动程序如何实现双击和 dragAndDropBy 操作 + 我们的应用程序响应命令的方式之间存在一些较低级别的交互。

对于观察到类似行为的任何其他人,我使用了一种变通方法,我为 chromedriver 添加了一个附加操作。实际找出应该使用哪些 KEYDOWN 事件等并触发它们,或者找出应用程序没有响应这些事件的原因,也许会更好。但我觉得已经有足够的时间花在这上面了:)

  if (browser.getDriver().toString().contains("chrome")) {
//      Work-around for chromedriver's double-click implementation
    content.click()
  }

  interact {
    doubleClick(content)
  }

对于 dragAndDropBy:

  def drag(Navigator content, int xOff, int yOff) {
    //Work-around: move additional time for when chrome driver is used.
    int timesToMove = browser.getDriver().toString().contains("chrome") ? 2 : 1

    interact {
      clickAndHold(content)
      timesToMove.times {
        moveByOffset(xOff, yOff)
      }
      release()
    }
  }
于 2019-01-03T10:36:25.853 回答