这是我的Capybara规范:
describe 'checkout',type: :feature,js: true do it 'checks out correctly' do visit '/' page.should have_content 'Amount: $20.00' page.find('#button-two').click_button 'Pay with Card' Capybara.within_frame 'stripe_checkout_app' do fill_in 'Email',with: 'example@example.com' fill_in 'Name',with: 'Nick Cox' fill_in 'Street',with: '123 Anywhere St.' fill_in 'ZIP',with: '98117' fill_in 'City',with: 'Seattle' click_button 'Payment Info' fill_in 'Card number',with: '4242424242424242' #test card number fill_in 'MM/YY',with: '02/22' fill_in 'CVC',with: '222' click_button 'Pay' end page.should have_content 'Thanks' end end
该规范中的文字是我最近的尝试. Capybara错误无法找到字段“电子邮件”.
我试过了
>这是最近一次通过占位符文本填写现场的尝试,如建议here
>通过name属性查找电子邮件字段(例如,fill_in’email’,带有:’example@example.com’)
>有和没有类型::feature和js:在描述中的真正哈希
>在Capybara有无内部呼叫
>尝试通过css找到输入(例如,page.find(‘.emailInput input’).set(‘example@example.com’)
>在块内添加:in(‘.panel’)在表单输入周围(失败,无法找到css“.panel”)
>在上一步之前添加一个睡眠3,以防它太早地找到该div(失败,无法找到css“.panel”)
>添加一个调用find(也可以是page.find)并将表单操作作为一个块(将嵌入和不包含嵌入到块内的块)传递给一个块:
Capybara.within_frame 'stripe_checkout_app' do page.find('.panel') do fill_in 'Email',with: 'example@example.com' ... end end
我也用poltergeist尝试过.
令人惊奇的是,我将Capybara驱动程序从poltergeist更改为硒/ Firefox,我可以看到驱动程序打开页面,点击按钮并启动模式.
任何关于如何让水豚与这种形式互动的想法?
编辑
我还试着在这里粘贴一个binding.pry,并使用pry gem进行调试.该页面的HTML在模态加载是一些元素,然后脚本标签动态插入JS到iframe的头.在打开binding.pry的位置(在使用Stripe窗体打开模态窗口之后)看到DOM的这个屏幕截图:
所以< div class =“emailInput”>显然是在那里,但是page.has_selector?(‘.emailInput’)在pry控制台中返回false.
Here是一个GitHub要点,当我从pry绑定中打印page.html作为Capybara.within_frame’stripe_checkout_app’之后的下一行时会发生什么.也就是说,这是从Capybara的角度来看的标记,并且与DOM的差异很大,如上图所示,屏幕上出现的实际形式的DOM屏幕截图显示.正如你所看到的,Capybara看到的标记没有任何投入或任何有用的东西.
更新
%form{ action: "/charge?amount=1400",method: 'post',class: 'payment',id: 'fourteen' } %article %label.amount %span Amount: $14.00 .stripejs#button-one %script{ src: 'https://checkout.stripe.com/checkout.js',class:'stripe-button',:'data-key' => settings.publishable_key,:'data-name' => 'Slow Coffee',:'data-description' => '2 8oz. bags (2/month)',:'data-shipping-address' => true }
解决方法
require "capybara" sess = Capybara::Session.new(:selenium) sess.visit("https://stripe.com/docs/checkout") sess.click_button('Pay with Card') sess.within_frame('stripe_checkout_app') do sess.fill_in 'Email',with: 'test@example.com' # it's visible that field becomes filled in sleep 3 # just to inspect that manually end
您所描述的问题是因为有两个名为stripe_checkout_app的iframe. within_frame找到不包含计费字段的第一个.要找到第二个iframe,可以这样做:
stripe_iframe = all('iframe[name=stripe_checkout_app]').last within_frame stripe_iframe do # your code here end