如何测试/与AJAX自动完成和Capybara / Poltergeist交互

时间:2014-08-05 17:43:39

标签: ruby ajax capybara phantomjs poltergeist

我正在尝试与外部网站进行互动:http://is.gd/LtgYEk 我需要能够用id =“textOrigen”填写输入,这里是html

<p>
    <label class="form-label">Departing from:</label>
    <span class="label-field">
        <input type="text" autocomplete="off" onblur="onblur2('textOrigen');" onfocus="initID('textOrigen');" size="17" id="textOrigen" name="text" maxlength="40" style="position:static;color: #505050;">
        <select style="display:none" onchange="clearValidate(); Origen();" class="validate[dynamic]" id="cmbOrigen" name="cmbOrigen">
            <option value="-1" selected="selected">Origin</option>
        </select>
        <label class="label-error" id="lblerrorOrigen"></label> 
    </span>
</p>

我使用'capybara / poltergeist'

组合了一个简单的ruby脚本

我无法复制浏览器行为,即:     单击时,输入字段的默认值将突出显示,因此在您开始输入时将被删除。

我忘记了我试过的所有不同的变化,但尝试了很多。我找到了另一个SO post,它似乎有点用,但没有帮助

这是填写此字段的方法的最后一次修订:

def session.fill_autocomplete(field, options = {})
  execute_script %Q{ $('##{field}').trigger('focus') }
  fill_in field, with: options[:with]
  execute_script %Q{ $('##{field}').trigger('focus') }
  execute_script %Q{ $('##{field}').trigger('keydown') }
  selector = %Q{#output div:contains('#{options[:with]}')}
  execute_script "$(\"#{selector}\").mouseenter().click()"
end

我编写的脚本非常简单,唯一的其他相关位是会话实例化时:

session = Capybara::Session.new(:poltergeist)

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

我注意到使用正确版本的phantomjs 是最基本的。

虽然2.x已经出局,但我注意到 phantomjs 1.8.2 的表现远远超出预期,而且越来越少。

我目前正在RailsAdmin中测试自动填充字段,但成功,没有使用任何延迟技术

def fill_in_autocomplete(selector, text)
  find(selector).native.send_keys(*text.chars)
end

def choose_autocomplete_entry(text)
  find('ul.ui-autocomplete').should have_content(text)
  page.execute_script("$('.ui-menu-item:contains(\"#{text}\")').find('a').trigger('mouseenter').click()")
end

fill_in_autocomplete 的示例选择器为:

".author_field .ui-autocomplete-input"

答案 1 :(得分:0)

我在很多方面测试后找到了解决方案。 关键是增加一些延迟,以允许填充自动建议div。

以下是有效的方法:

def session.fill_city(field, options = {})
  sleep 3
  script = %Q{ $("#{field}").focus().keypress().val("#{options[:with]}") }
  execute_script(script)
  sleep 2
  find('#output').find('div').trigger('click')
end