【问题标题】:Selenium commands not working in Chrome web driver (working with firefox)Selenium 命令在 Chrome 网络驱动程序中不起作用(与 firefox 一起使用)
【发布时间】:2019-05-09 16:11:57
【问题描述】:

我正在编写集成/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

我也尝试了 chrome 的 2.43 版。

附加信息:

  • Mac 莫哈韦沙漠
  • 硒 v 3.7.0
  • geb v 2.2
  • spockcore v 1.1-groovy-2.4
  • groovy v 2.4.5
  • webdrivermanager v 3.0.0

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

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

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

非常感谢任何帮助。

【问题讨论】:

  • 我认为,如果您还可以将我们指向一个公开可用的网站来运行您的测试,或者您可以通过以下方式在此处提供 HTML 页面源代码,那么您将有更好的机会获得好的答案编辑你的问题。请始终尝试通过提供MCVE 来帮助您的潜在帮助者,而不是仅仅提供任何人都无法编译和运行的 sn-ps。

标签: selenium spock geb chrome-web-driver webdrivermanager-java


【解决方案1】:

我只是有一点时间并且很好奇,因为我以前从未尝试在任何测试中执行双击。因此,我使用this page 作为测试用例,并使用 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://artoftesting.com/sampleSiteForSelenium.html"
    def doubleClickButton = $("#dblClkBtn")

    expect:
    withAlert {
      interact {
        doubleClick(doubleClickButton)
      }
    } == "Hi! Art Of Testing, Here!"
  }

  def "double-click via Selenium action"() {
    given:
    go "https://artoftesting.com/sampleSiteForSelenium.html"
    def doubleClickButton = driver.findElement(By.id("dblClkBtn"))
    def doubleClick = new Actions(driver).doubleClick(doubleClickButton).build()

    expect:
    withAlert {
      doubleClick.perform()
    } == "Hi! Art Of Testing, Here!"
  }
}

它完美无缺,双击的两种方式都会触发预期的 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,测试仍然有效。

【讨论】:

  • 谢谢,这个测试也适用于我。但由于某种原因不适用于我们的应用程序
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-27
    相关资源
    最近更新 更多