ruby – Capybara麻烦填写JS模态

前端之家收集整理的这篇文章主要介绍了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
>通过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看到的标记没有任何投入或任何有用的东西.

更新

这是包含执行模态的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
原文链接:https://www.f2er.com/ruby/272852.html

猜你在找的Ruby相关文章