В Java API такого класса нет. Класс Apache Commons, который вы хотите, будет одной из реализаций BidiMap .
Будучи математиком, я бы назвал такую структуру биекцией.
Похоже, что 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)
У меня была точно такая же проблема, и я обнаружил, что следующее решение работает с capybara-webkit, а также с селеном-хромом:
page.find_field('Email').set "test@gmail.com"
page.find_field('Card number').set ('4242424242424242')
«Электронная почта» и «Номер карты» здесь заполнители. Причина, по которой он работает таким образом, а не с find('#email')
, заключается в том, что на странице нет элемента с id = 'email'. Капибара правильно не может найти этот элемент, он не существует много раз. Причина в отсутствии элемента в том, что иногда iframe полосы выводится без правильного идентификатора, например: element-with-dynamic-id
find_field
выполняет поиск по идентификатору, имени или заполнителю, и в этом случае, заполнитель является единственным атрибутом, который не изменяется в обеих ситуациях и который может быть найден капибарой (например, «тип» тоже не меняется, но я не смог найти способ сделать поиск капибары). по типу, а также тест будет гораздо менее читабельным, чем).
Почему iframe Stripe иногда пропускает эти правильные идентификаторы и заменяет их динамическими идентификаторами? Понятия не имею.
Я сделал его похожим на @humpah, но без злого кода JS.
form_iframe = all('iframe.wysihtml5-sandbox').last
within_frame form_iframe do
page.find('body').set('SomeContent')
end