Подтвердить что ты не робот

Оформление полоски заполняется в Capybara-webkit

Я использую драйвер capybara-webkit для моих тестов с поддержкой JS. Однако, когда я пытаюсь заполнить поля формы для проверки iframe, я не могу это сделать, используя помощник capybara fill_in в обоих драйверах. Selenium драйвер предоставляет методы, которые облегчают выполнение этой задачи.

4.times {page.driver.browser.find_element(:id, 'card_number').send_keys('4242')}         
page.driver.browser.find_element(:id, 'cc-exp').send_keys '5'
page.driver.browser.find_element(:id, 'cc-exp').send_keys '18'
page.driver.browser.find_element(:id, 'cc-csc').send_keys '123'
page.driver.browser.find_element(:id,'billing-zip').send_keys '600004'

Если я использую помощник fill_in, я не могу полностью ввести данные. Например, для 16-значного номера карты поле ввода заполняется только 4 цифрами, а в поле даты я могу ввести только месяц, а не год.

Я хочу знать, есть ли помощники в драйвере webkit, которые позволят мне заполнить формы в форме проверки Stripe. Любые хедз-ап на это было бы здорово! Спасибо заранее.

4b9b3361

Ответ 1

У меня были похожие проблемы с Selenium, которые оба

find(:css, "input[id$='card_number']").set("4242 4242 4242 4242")
fill_in('card_number', with: "4242 4242 4242 4242")

перестала работать. Ранее я нашел (: css,...), который все еще работал несколько месяцев назад, но я думаю, что изменения в checkout.js сделали это так, что он больше не работал. С помощью Capybara не может заполнить поля Stripe Checkout.js Мне удалось заставить его работать. Это не очень красивое (или действительно управляемое поведением) решение, но оно выполняет эту работу:

stripe_iframe = all('iframe[name=stripe_checkout_app]').last
Capybara.within_frame stripe_iframe do
  page.execute_script(%Q{ $('input#card_number').val('4242 4242 4242 4242'); })
  page.execute_script(%Q{ $('input#cc-exp').val('12/16'); })
  #rest of the Stripe-capybara
end

Я не уверен, работает ли он с Webkit.

Ответ 2

Похоже, что Stripe изменила идентификаторы элементов оформления. У многих есть динамические идентификаторы, которые не соответствуют другим примерам здесь.

То, что сработало для меня, - это сопоставление элементов с текстом-заполнителем. Здесь рабочий фрагмент по состоянию на 12/06/16:

stripe_card_number = '4242424242424242'

within_frame 'stripe_checkout_app' do
  find_field('Card number').send_keys(stripe_card_number)
  find_field('MM / YY').send_keys "01#{DateTime.now.year + 1}"
  find_field('CVC').send_keys '123'

  find('button[type="submit"]').click
end

page.has_content?('Success!', wait: 30)

Ответ 3

У меня была точно такая же проблема, и выяснилось, что следующее решение работает с capybara-webkit, а также с селеновым хромом:

page.find_field('Email').set "[email protected]"
page.find_field('Card number').set ('4242424242424242')

"Email" и "Номер карты" здесь являются заполнителями. Причина, по которой он работает таким образом, а не с find('#email') заключается в том, что на странице нет элемента с id = 'email'. Capybara правильно не может найти этот элемент, он не существует много раз. Причина в том, что нет элемента, потому что иногда stripe iframe отображается без соответствующего id, например: element-with-dynamic-id

find_field выполняет поиск по id, name или placeholder, и в этом случае placeholder является единственным атрибутом, который не изменяется в обеих ситуациях и который может быть найден capybara (например, "type" не измените, но я не смог найти способ сделать поиск capybara по типу, а также тест был бы гораздо менее читабельным).

Почему Stripe iframe иногда пропускает эти правильные идентификаторы и заменяет их динамическими идентификаторами? Не знаю.

Ответ 4

Для полноты, здесь рабочий код.

    Capybara.within_frame stripe_iframe do
      page.find_field('Email').set '[email protected]'
      page.find_field('Card number').set '4242 4242 4242 4242'
      page.find_field('MM / YY').set '12/42'
      page.find_field('CVC').set '123'
      find('button[type="submit"]').click
    end

Вы всегда можете найти последнюю рабочую версию в https://github.com/dblock/slack-gamebot/blob/master/spec/integration/upgrade_spec.rb.

Ответ 5

Если вы используете Stripe из iframe (возможно, https://www.paymentiframe.com/?), вы сможете изменить масштаб своих тестов к кадру с помощью Capybara within_frame метод:

within_frame('stripe-iframe') do
    fill_in 'card_number', :with => '4242'
end

Если вы укажете iframe имя (stripe-iframe в этом примере), то это должно сделать это.

Надеюсь на помощь!

Ответ 6

Я сделал его похожим на @humpah, но без злого кода JS.

form_iframe = all('iframe.wysihtml5-sandbox').last
within_frame form_iframe do
  page.find('body').set('SomeContent')
end