Cucumber / Capybara 错误:参数 [0] 未定义(Selenium::WebDriver::Error::JavascriptError)

Posted

技术标签:

【中文标题】Cucumber / Capybara 错误:参数 [0] 未定义(Selenium::WebDriver::Error::JavascriptError)【英文标题】:Cucumber / Capybara Error: arguments[0] is undefined (Selenium::WebDriver::Error::JavascriptError) 【发布时间】:2015-03-13 15:34:01 【问题描述】:

我已经通过终端运行我的测试一段时间了,没有任何问题。:

cucumber Create\New\Game.feature

其中包含以下内容:

Feature: Create New Game

  Background: 
    Given I am logged in

  Scenario: Cleanup & New Game 01
    Then I Delete all test Games

还有红宝石:

Given(/^I am logged in$/) do
  el = first("button[ttag='account_dropdown_btn']", :visible => true)
  if el.nil?
    logMeIn("user@user1.com","pa55w0rd")
  end
end

logMeIn 定义为:

# Logs the user in with given credentials
def logMeIn(username, password)
  page.driver.browser.manage.window.maximize
  visit ENV['BASE_URL']
  fill_in 'j_username', :with => username
  fill_in 'j_password', :with => password
  click_button 'Login'
end

从测试开始到现在,以上都没有改变。 今天,当我开始测试时,Firefox 一打开,我立即得到:

  Background:            # features/Create New Game.feature:4
    Given I am logged in # features/step_definitions/Generic Steps.rb:1
      arguments[0] is undefined (Selenium::WebDriver::Error::javascriptError)

如您所见,它在第一行失败了。我不知道为什么。

我更新了所有宝石以确保一切都是新鲜的,但这不起作用。我认为这可能是浏览器问题,因为我的系统今天早上自动更新到 Firefox 35.0。我卸载并尝试了34,但它仍然是同样的问题。代码都没有改变。

我不知道还有什么其他错误配置可能导致此问题,因为我没有更改任何内容。

谁能进一步帮助解决这个错误?

【问题讨论】:

这似乎是 Firefox 35 的更新。我刚刚尝试了 ChromeDriver,它可以工作。当我卸载它并降级到 34 时,我不相信它完全删除了与 Firefox 的所有残留关联。 这是 Firefox 35 和 Selenium-WebDriver 的错误。有一个问题悬而未决 - code.google.com/p/selenium/issues/detail?id=8390。 【参考方案1】:

是的,问题出在 Firefox 35。降级到版本 34。也许这是您降级的方式。我只是运行新的 DMG 安装程序并确认覆盖现有应用程序。

直接链接:https://download-installer.cdn.mozilla.net/pub/firefox/releases/34.0.5/mac/en-US/Firefox%2034.0.5.dmg(链接引用自https://support.mozilla.org/en-US/kb/install-older-version-of-firefox)

关于这个问题的更多信息可以在这里找到:https://code.google.com/p/selenium/issues/detail?id=8387

【讨论】:

我将 Firefox 34 放在一个单独的目录中,并让我的水豚通过 Selenium::WebDriver::Firefox::Binary.path = ENV['firefox_path'] if ENV['firefox_path'] 使用它,然后在运行 cucumber 时设置该环境变量。【参考方案2】:

正如Justin Ko 评论的那样,这是 Firefox 35 和 Selenium-WebDriver 2.44.0 的错误。 Selenium 项目有一个问题单,在撰写本文时,有一个包含修复的预发布 gem (2.45.0.dev3)。

https://code.google.com/p/selenium/issues/detail?id=8390

【讨论】:

【参考方案3】:

正如其他人所说,Firefox 35 中存在错误。 为了避免这种情况,我发现配置 Capybara 以在 Chrome 中运行 Selenium-tests 是最简单的。所以如果你不需要特别在 Firefox 中运行测试,你可以使用 chromedriver。

有一个gem可以轻松搞定。

【讨论】:

【参考方案4】:

这里的 Firefox 驱动程序存在同样的问题。

Caused by: org.openqa.selenium.WebDriverException: arguments[0] is undefined
Command duration or timeout: 24 milliseconds
Build info: version: '2.44.0', revision: '76d78cf323ce037c5f92db6c1bba601c2ac43ad8', time: '2014-10-23 13:11:40'
System info: host: '', ip: '', os.name: 'Windows 7', os.arch: 'amd64', os.version: '6.1', java.version: '1.7.0_71'
Session ID: 49a4f55c-33b7-4ab8-aea5-cb3bb98041e1
Driver info: org.openqa.selenium.firefox.FirefoxDriver
Capabilities [platform=WINDOWS, acceptSslCerts=true, javascriptEnabled=true, cssSelectorsEnabled=true, databaseEnabled=true, browserName=firefox, handlesAlerts=true, nativeEvents=false, webStorageEnabled=true, rotatable=false, locationContextEnabled=true, applicationCacheEnabled=true, takesScreenshot=true, version=35.0.1]
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
    at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:204)
    at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:156)
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:599)
    at org.openqa.selenium.remote.RemoteWebDriver.executeScript(RemoteWebDriver.java:508)

将 Firefox 降级到 34.0.5 和 Javascript 点击:

executeScript("arguments[0].click();", el);

再次像魅力一样工作。

拥有有效的 javascript 点击非常重要,因为原生点击太不可靠了。

【讨论】:

以上是关于Cucumber / Capybara 错误:参数 [0] 未定义(Selenium::WebDriver::Error::JavascriptError)的主要内容,如果未能解决你的问题,请参考以下文章

Cucumber + Capybara + Selenium:选择文本

Rails、Cucumber、Capybara:会话不持久

Cucumber 和 Capybara,单击非链接或按钮元素

Rails + Cucumber/Capybara:如何在测试中设置/检索 cookie?

Cucumber, capybara and selenium - 无需按钮即可提交表单

Rails Cucumber使用Capybara测试AJAX