【发布时间】: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