【问题标题】:Capybara fill_in not entering all the textCapybara fill_in 未输入所有文本
【发布时间】:2017-07-12 03:38:15
【问题描述】:

我在 rspec 3.6.0 下使用 chromedriver 2.30 和 capybara 2.14.4

fill_in "total-amount", with: "33"
expect(find_by_id("total-amount").value).to have_text("33")
click_on "create_btn"

有时候会报错

1) Create purchase with discount transaction creates a Sales Return Transaction
     Failure/Error: expect(find_by_id("total-amount").value).to have_text("33")
       expected to find text "33" in "3"
     # ./spec/integration/transactions/create_purchase_with_discount_spec.rb:67:in `block (2 levels) in <top (required)>'

就像fill_in 一次输入一个字符。如何让 fill_in 一次性输入所有字符?

更新

我试过了

expect(page).to have_field('total-amount', with: "33")

但得到了这个片状错误

expected to find field "total-amount" with value "33" but there were no matches. Also found "", which matched the selector but not all filters.

它正在查找元素,但尚未在其中输入值,即使 fill_in 行在它之前。我正在使用材料设计,所有这些字段都在进行计算,这可能会影响这些元素的更新时间。

更新

把default_max_wait_time改成20秒,还是有问题

更新

如果我在填充“总金额”周围加上:“33”这样的睡眠;

sleep 1
fill_in "total-amount", with: "33"
sleep 1
expect(find_by_id("total-amount").value).to have_text("33")
click_on "create_btn"

这行得通,但是让 sleep 是错误的!所以我仍然需要一种方法来检查我在材料设计框中输入的内容是否确实存在并设置为角度模型,然后再继续。

【问题讨论】:

  • 这种类型的错误通常是页面中的一些JS在输入字符的时候把焦点移开了造成的。在致电fill_in 之前尝试睡眠几秒钟以查看问题是否消失。此外,您不应在字符串值上调用have_text,因为这会导致value 返回的字符串被解析为HTML 文档然后进行比较,这是不可预测的。你应该做expect(find_by_id("total-amount").value).to eq "33" 或者更好expect(page).to have_field('total-amount', with: '33')
  • 您正在运行的 expect(page).to have_field('total-amount', with: "33") 行将等待 Capybara.default_max_wait_time 秒以匹配条件 -- 该字段正在进行什么类型的计算?尝试设置Capybara.default_max_wait_time = 10 看看是否能解决问题。如果没有,那么您将不得不查看附加到该输入的 JS,看看是否可以改进它以不错过按键。你也试过在fill_in之前睡几秒钟看看是不是你页面上的JS在fill_in发生之前没有完全初始化
  • 我确实在之前和之后尝试过睡眠,发现将睡眠置于之后似乎有效。我显然不想睡觉,但它确实证明了计算可能会延迟文本的出现。我已将 default_max_wait_time 调整为 20,但仍然遇到问题。我会看一下关于那个元素的 ng-change 的 JS,看看我是否可以这样修复它。

标签: rspec capybara selenium-chromedriver


【解决方案1】:

带有 Selenium 的 Chromedriver 不支持非焦点填充

任何输入的用户体验都有两个步骤:

  1. 单击或通过键盘选择一些输入
  2. 输入任何数据

要完成您的测试,请使用以下代码:

area = find("#total-amount").click # user usually click before input
area.send_keys "33"

【讨论】:

    【解决方案2】:

    您似乎遇到了this 帖子的水豚,一种耐心的动物部分中提到的比赛条件。

    我找不到 Capybara 文档提供的等待方法的规范列表,但根据该博客文章中提供的列表,#has_field?应该等待并阻止您看到的竞争条件。

    page.has_field?('total-amount', :with =&gt; '33')

    【讨论】:

    • 我已经尝试过 page.has_field 并且我在“with”部分中输入的内容似乎并不重要,测试只是继续进行。即:我之前输入了 page.has_field?('total-amount', :with => '13') 并且测试没有显示错误。
    • @map7 has_field?只是返回一个布尔值,如果事情不匹配,它不会引发错误,因为你需要使用我的评论中的 have_field 匹配器
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-22
    • 1970-01-01
    相关资源
    最近更新 更多