Selenium 命令在 Chrome web driver 中不起作用(使用 firefox)

Selenium commands not working in Chrome web driver (working with firefox)

我正在编写 integration/e2e 测试,出于某种原因,任何 selenium driver 命令都无法与 chromedriver 一起使用,但它们可以正常工作与 firefox driver 和 firefox headless driver.

完美搭配

已尝试的命令:moveByOffsetdoubleClick

Geb 的 Interact 方法都试过了

interact {
 doubleClick(centerClickable)
}

并直接访问网络driver:

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 driver。既不能与 chrome driver.

一起工作

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

我也试过chrome的2.43版。

附加信息:

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

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

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

非常感谢任何帮助。

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

package de.scrum_master.Whosebug

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,而是针对 Chrome71 64 位 Windows10 上的 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不再有效。

感谢您的回复 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()
    }
  }