【问题标题】:Capybara can't click on button水豚无法点击按钮
【发布时间】:2015-12-12 02:38:11
【问题描述】:

我是水豚和 poltergeist 的新手,但这是我目前所拥有的。

它找到按钮但无法单击它。我试过'execute_script',但由于NotSupportedByDriverError,我无法让它工作。我已经包含了 gem 'capybara-webkit' 但这并没有改变任何东西。

有问题的行:

assert page.execute_script("$('.js-login-action').click()"), "Failed to click on Login"

这是完整的 test.rb 文件

require 'test_helper'
require 'capybara/poltergeist'
Capybara.javascript_driver = :poltergeist

options = {js_errors: false, js: true}
Capybara.register_driver :poltergeist do |app|
  Capybara::Poltergeist::Driver.new(app, options)
end

 class LoginTest < ActionDispatch::IntegrationTest

  test "Load login page" do
    visit("/users/sign_in")
    assert page.has_content?('derp'), "Page does not have Derp heading"
  end

  test "Successful load of sign in page" do
    get("/users/sign_in")
    assert_response :success
  end

  test "Login" do
    visit("/users/sign_in")
    fill_in "login-username", with: 'derp'
    fill_in "login-password", with: '0123456789'
    assert find_button("Login"), "Failed to Find Login Button"
    assert page.execute_script("$('.js-login-action').click()"), "Failed to click on Login"
    assert page.has_css?('en-main-header'), "Failed to Login"

  end

end

【问题讨论】:

  • 您要点击的按钮是什么?你能分享他的html代码吗? (例如&lt;input tabindex="0" type="submit" value="Save Edits"&gt;

标签: javascript unit-testing capybara


【解决方案1】:

page.execute_script 并不是真的要点击按钮。

正如您在这个非常有用的capybara cheatsheet 中看到的那样,您可以通过不同的方式单击按钮。例如:

click_button('Save')

find_button('Send').click

find('//table/tr').click

【讨论】:

    【解决方案2】:

    这里有几个问题:

    1. 您正在设置 javascript 驱动程序,但没有告诉您的测试使用 javascript 驱动程序,因此他们使用的是默认驱动程序,即 rack-test 并且根本不支持 javascript(因此不受驱动程序错误支持)如果您希望所有测试在 JS 支持下运行,您可以将 Capybara.default_driver 设置为 :poltergeist,或者通过元数据设置驱动程序,例如 https://github.com/wojtekmach/minitest-capybara

    2. 正如@fabersky 指出的那样,您应该使用 click_button 或 Node#click 来单击页面中的项目所以 - click_button('Login') - 这消除了您对 find_button 断言的需要,因为 click_button 如果可以的话会出错找不到按钮。

    3. 在 find_button 上断言不是很好,您最好使用类似 page.assert_selector :button, 'Login' 的东西,它会在失败时提供更具描述性的错误消息。你的断言 has_css 也一样?可能是 page.assert_selector(:css, 'en-main-header') - 如果您的默认选择器设置为 :css,则 :css 是可选的 - 这将给出关于查找/缺失内容的更具描述性的错误

    4. 断言execute_script 的结果不会起作用,因为根据定义,execute_script 不会返回任何内容。如果你真的想在你想使用evaluate_script的页面上查看一些JS正在执行的结果

    【讨论】:

      猜你喜欢
      • 2016-07-22
      • 1970-01-01
      • 1970-01-01
      • 2019-08-28
      • 1970-01-01
      • 2018-03-07
      • 2014-05-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多