无法使用 capybara-webkit 填写输入字段

Unable to fill in input field using capybara-webkit

我有 javascript 与 selenium 配合良好的功能规范,但出于多种原因我想切换到 capybara-webkit(CI,不弹出浏览器 window, 等等).

我正在尝试从 selenium 切换,但某些东西阻止了我的代码正常工作。我有以下帮手:

def capybara_login(user)
  visit login_path
  fill_in "email", with: user.email
  fill_in "password", with: user.password
  click_button "Log in"
end

这是我正在输出的输入字段:

<input type="email" name="email" id="email" value="" class="form-control" placeholder="you@domain.com" autocomplete="off">

我测试过 user.email 不为零。出于某种原因,当我使用 capybara-webkit 时,它失败了并且没有填写任何内容(我正在通过 save_and_open_page 进行检查)。但是,如果我对 js 使用常规的水豚(非 js)或 selenium,此代码可以正常工作。

我错过了什么吗?关于什么可能阻止水豚 webkit 填写这些字段的任何想法?

编辑:感谢 Tom 的帮助。所以保存并打开页面不会在这些字段中显示任何输入。

我能够使用 save_and_open_screenshot 看到该页面实际上只是停留在登录屏幕上的加载图像上。如果我执行 "sleep(1)" 它会正常登录。

想知道人们使用什么策略来处理这个...等到页面加载后再继续?默认情况下不让 Capybara 执行此操作的原因是什么?还是我做错了?

Capybara 无法知道页面何时 "fully" 加载,因为许多页面将异步加载,根据需要动态加载等。事实上,Capybara 向您展示了您的页面可用性问题,因为用户可以在元素实际可用之前在技术上与元素交互 - 在这种情况下,Capybara 可能比任何用户都快,但仍然......因此你需要确定你正在使用的小部件在页面上做什么以及做什么他们所做的更改 - 例如,当库完成处理页面时,是否在 body 元素上设置了 class,输入字段在被扩充时是否添加了 class/attribute,等等。一旦你'我确定你可以告诉 Capybara 做类似

的事情
expect(page).to have_selector('body.class_added_when_ready')

确保页面完全可交互

这完全是侥幸,我这边有一些 javascript 运行。在某些时候,我认为允许 ladda 加载程序在提交表单之前有 300 毫秒的延迟以完全动画化是个好主意。这导致水豚窒息。我能够将此问题隔离到该特定代码。

谢谢你的帮助,汤姆!