ruby – Capybara麻烦填写JS模态
让我开始确认这不是重复的(因为那里发布的答案没有解决我的问题).
This post本质上是我的确切问题:Capybara无法找到条纹模态中的表单字段来填充它们.
这是我的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 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看到的标记没有任何投入或任何有用的东西. 更新 这是包含执行模态的JS的表单的标记. (标记在哈姆). %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 } 解决方法
我不能重现这个问题
Stripe’s demo checkout page.
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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |