为什么我的(javascript)变化事件没有在我的测试中被触发?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么我的(javascript)变化事件没有在我的测试中被触发?相关的知识,希望对你有一定的参考价值。
我有一个有许多类似文本框的页面,我在所有的文本框上都安装了一个javascript的变化监听器(虽然我写的是Coffeescript)。
html示例。
<td class="team" data-node="64" id="team_64">
<label for="bracket_teams_attributes_(1)">(1)</label>
<input id="bracket_teams_attributes_name"
name="bracket[teams_attributes][name]" size="30" type="text" value="Team 1">
<input id="bracket_teams_attributes_id"
name="bracket[teams_attributes][id]" type="hidden" value="64">
</td>
Coffeescript中的变更监听器。
nameTeam = (target) ->
send_put(t) for t in $(target)
send_put = (target) ->
newName = target.value
node=$(target).closest('td').data('node')
$.ajax
type: 'PUT'
url: $(target).closest('form').attr('action')
data:
'team[name]': newName
'bracket[node]': node
$ ->
$('input#bracket_teams_attributes_name').on 'change', (e) => nameTeam e.target
忽略性能方面的问题,如果我只是使用这个应用程序,它的工作原理是这样的--无论我如何改变一个文本字段,改变事件都会被触发,数据库也会被更新。
由于我正在努力学习如何测试Javascript,我希望能够在我的测试中编写代码来触发这个变化事件。为此,我有以下一点CapybaraJavascriptjQuery。
within(NODE_64_CSS) do
fill_and_click_script =
%Q(
$('#{NODE_64_CSS} #{INPUT_TEAM_CSS}').focus().val('#{new_name}');
$('#{NODE_64_CSS} #{INPUT_TEAM_CSS}').focus().trigger('change');
)
page.driver.execute_script(fill_and_click_script)
end
其中的常量有适当的值(它们在测试中的其他地方被用来检查最初加载的页面是否正确)。
我花了很多时间在StackOverflow和博客上搜索,试图了解是什么阻碍了我的测试触发变化监听器,并尝试用Webkit和其他各种方法来改变表单值触发变化事件,但都无济于事。如果我使用Webkit和某个版本的 发送键当我启动时,我看不到页面上的变化。send_and_open_page
但使用Selenium-Webdriver的我 做 看到新的文本被输入。然而,页面中的变更监听器并没有被启动,数据库也没有发生变化。
由于我是这个堆栈的新手,我希望我做了一些明显的错误,但我不知道在这一点上应该从哪里寻找。
我的gem环境包含。
cucumber (1.3.11)
~/.rvm/gems/ruby-2.0.0-p451/gems/cucumber-1.3.11
rails (3.2.13)
~/.rvm/gems/ruby-2.0.0-p451/gems/rails-3.2.13
cucumber-rails (1.4.0)
~/.rvm/gems/ruby-2.0.0-p451/gems/cucumber-rails-1.4.0
selenium-webdriver (2.42.0)
~/.rvm/gems/ruby-2.0.0-p451/gems/selenium-webdriver-2.42.0
capybara (2.2.1)
~/.rvm/gems/ruby-2.0.0-p451/gems/capybara-2.2.1
rspec-rails (2.14.1)
~/.rvm/gems/ruby-2.0.0-p451/gems/rspec-rails-2.14.1
capybara-screenshot (0.3.19)
~/.rvm/gems/ruby-2.0.0-p451/gems/capybara-screenshot-0.3.19
如果你觉得需要更多的信息来解决这个问题,我很乐意提供给你。
更新一下。
我现在也试着使用Culerity作为我的Javascript集成测试工具,(毫不奇怪,因为它不再被维护,它的部分基础设施也不再被维护)我到达了一个点,Celerity中存在一个错误,导致NoMethodError--'url'对于我的Cabybara:Server实例在capybara-celerity gem中没有定义。
你的代码看起来应该可以用。你可以尝试一下。添加一个 sleep 5
在您输入文本到字段后,在您的测试中调用AJAX调用,以给AJAX调用完成的时间。这应该由Capybara来处理,但也许那里有什么问题。
另外,你能不能在你的测试中添加一些 console.log
左右的语句,以确保问题是变化处理程序没有被启动,而不是AJAX调用的问题。
很显然,我不清楚这到底是怎么回事,我的问题源于使用预编译的资产。这很奇怪,因为我的开发环境和测试环境的功能是一样的,而且开发版的工作非常好。
无论如何,我现在至少可以让测试启动变更监听器了。
帮助解决我的问题的SO帖子是:如何避免预编译的资产在开发模式下被服务?
我是因为Capybara googlegroup上的这个帖子才知道的。https:/groups.google.comforum#!searchinruby-capybaraselenium。$20$20event$20%7Csort:dateruby-capybarau8Tnd6SqD3kLou4jBsJuo8J。
我也有同样的问题。我很快就发现整个js文件没有被运行。对我来说,预编译的assets似乎也是问题所在。我以前曾手动预编译过assets,以便在本地生产中运行rails,但与开发环境不同的是,测试环境实际上使用了这些预编译的assets。与开发环境不同,测试环境实际上使用了这些预编译的assets。解决的办法是简单地删除这些资产,因为我不再需要它们了。
我在测试环境中添加了一行 environments/test.rb
以防止今后出现这种情况。
config.assets.prefix = "/assets_test" # don't use production precompiled assets
以上是关于为什么我的(javascript)变化事件没有在我的测试中被触发?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我在我的设备上收到成功注册消息,而服务器数据库没有变化?
为啥我的 PostBack 在我的 jQuery 点击事件之前发生?