如何从自动完成中选择li

Pet*_*Kim 1 ajax jquery ruby-on-rails

在文本框中,当您键入时,我们有自动完成功能,可生成采用此结构的列表:

<div class="results">
  <ul>
    <li class="even">
    <li class="odd">
    <li class="even">
    etc...
Run Code Online (Sandbox Code Playgroud)

我正在用Cucumber(加上Capybara和Webdriver)编写测试,我需要选择第一个li.

page.execute_script我想,因为下面的代码片段不断返回,所以没有通过正确的jQuery null.

page.execute_script %Q{ $('li').eq(1).trigger("mouseenter").click(); }
Run Code Online (Sandbox Code Playgroud)

也就是说,我收到了这个错误:

TypeError: $("li") is null (Selenium::WebDriver::Error::UnexpectedJavascriptError)
Run Code Online (Sandbox Code Playgroud)

我只是拿起jQuery,所以有人会告诉我什么是错的,为什么它是错的,可能是如何解决它?

li元素存在于页面上,我查看了源代码以确保,所以我真的很困惑,它无法找到它.

nzi*_*nab 5

我可能不会尝试使用page.execute_script方法单击自动完成列表项.理想情况下When,黄瓜的步骤应始终100%模仿用户能够做的事情.而且我不希望他们打开一个javascript控制台并开始输入脚本来执行以选择列表项;)

显然我知道这不是你想要的,但这就是你用你的方法测试的东西.

一个更好的方法是在你的黄瓜步骤定义之一:

When /^I follow the autocomplete link containing "([^"]*)"$/ do |link_text|
  page.find(:css, ".results ul li", :text => link_text).click
end
Run Code Online (Sandbox Code Playgroud)

我认为这应该有效,而且比在黄瓜步骤中尝试破解JS代码更好.

请注意,page.find方法返回Capybara :: Node :: Element(我相信).:text hash选项告诉capybara只查找包含指定文本的元素.如果找不到该元素,capybara将引发异常.

如果由于某种原因你的li实际上没有可点击的文本,你可以将选择器更改为".results ul li:first",但理想情况下你可以使用该定义而不仅仅是选择第一项.

您可能会遇到一个错误(有关'节点'方法未找到或某些shinanigans).如果你得到一个奇怪的错误,你无法解释这样做,并且它不是很明显它是什么,那么你可能需要在黄瓜的支持目录的env.rb中注释掉以下行:

require 'cucumber/rails/capybara_javascript_emulation'
Run Code Online (Sandbox Code Playgroud)

当水豚升级时,放在那里的monkeypatch黄瓜破了,最后我检查还没有部署为稳定释放.

希望这能解决你的问题:)

编辑添加:

我只是再次看了你的问题,觉得我可能想让你知道为什么$("li")会返回null.当您在此脚本执行之前添加"我应该看到..."步骤时,capybara内置了等待元素显示的默认超时,当您在页面上查找某个元素时,它会使用它还有.如果它没有出现在指定的时间内(我认为默认情况下是5秒?)那么水豚会给你一个失败的测试.

但是,当你运行execute_script调用时,你绕过所有Capybara的真棒框架,并尝试使用jquery直接与DOM交互 - 除了Capybara还没有"等待"对象出现,所以你的javascript可能不是要找到它.

我相信我使用page.find发布的解决方案对您有用,因为该方法会在引发错误之前等待元素出现在页面上.这里有更详细的解释:https: //github.com/jnicklas/capybara在显示自述文件的"查找"子标题下.