2013-03-25 2 views
34

У меня есть поле файла, которое имеет opacity: 0 и накладывается поддельной кнопкой. Его обычная техника CSS для подделывания своего рода кнопки «Загрузить», которая постоянно отображается в разных браузерах.Возможно ли взаимодействовать со скрытыми элементами с capybara?

Capybara не позволяет позвонить по телефону attach_file на этот вход. Ошибка Selenium::WebDriver::Error::ElementNotVisibleError: Element is not currently visible and so may not be interacted with.

Кто-нибудь знает, как заставить capybara взаимодействовать с невидимыми элементами?

Ответ по-прежнему остается без ответа, но я нашел работу. Ничего разумного, просто сделайте видимым элемент с простым скриптом

page.execute_script %Q{ 
    $('#photos').css({opacity: 1, transform: 'none'}); 
    } 

Я отправляю его для записи.

+0

Возможно, это будет трудно. Попробуйте начать с JS [здесь] (https://code.google.com/p/selenium/wiki/FrequentlyAskedQuestions#Q:_Does_WebDriver_support_file_uploads?). Но это может не работать во всех случаях и в браузерах. –

+0

Похоже, вы не используете capybara-webkit (из-за «Selenium :: WebDriver :: Error» в сообщении об ошибке), поэтому я удалил тег capybara-webkit из вашего вопроса –

+0

Возможно, он уже ответьте здесь: http://stackoverflow.com/a/10805128/914986 – Hengjie

ответ

61

Вы можете взаимодействовать со скрытыми элементами с помощью свойства visible: false в Capybara.

Если вы хотите, чтобы нажать на использование скрытых элементов:

find("#photos", visible: false).click 

Не используйте click_button('#photo') непосредственно

+2

все еще дает здесь –

+1

Не работает, с сообщением не могу нажать скрытый элемент –

+0

@mc. На каком элементе вы щелкнете, вставьте структуру здесь –

0

Микеля, спасибо за workaraund.

У меня аналогичная проблема для взаимодействия со скрытым входом файла на связывании для Selenium WebDriver 2.35 и Firefox 24. C# Для того, чтобы сделать выбор файла рабочим сделали подобный трюк:

((IJavaScriptExecutor)webdriver).ExecuteScript("$('#fileUploadInput').css({opacity: 1, transform: 'none'});"); 

IWebElement e = webdriver.FindElement(By.CssSelector("input#fileUploadInput"))); 

e.SendKeys("c:\\temp\\inputfile.txt"); 
0

Я в конечном итоге его решением другого маршрута.

execute_script() дает мне трудное время (это было бы заморозить выполнение теста на FireFox), так это то, что я сделал:

Я уже имел соответствующий файл Javascript. Я приложил следующий

<% if ENV["RAILS_ENV"] == "test" %> 
    $('#photos').show() 
<% end %> 

Я также должен был добавить .erb к моему файлу JavaScript для надлежащего Rails обработки активов.

И в моем тестовом файле, я уже садился ENV["RAILS_ENV"] = "test"

Это так, как я мог бы просто немые вниз пользовательский интерфейс для тестирования, и при этом сохранить внешний вид и для производства.

+1

Это единственное решение, которое сработало для меня. – gamov

16

The author of Capybara recommends setting Capybara.ignore_hidden_elements непосредственно перед необходимостью видеть невидимый элемент, и сброс его потом:

Capybara.ignore_hidden_elements = false 
click_button 'my invisible button' 
Capybara.ignore_hidden_elements = true 
+2

Когда вы читаете это, он рекомендует это только в качестве обходного пути к определенной проблеме. В общем, это нехорошее решение, потому что конкретные тесты не должны изменять глобальный вариант. См. Http://makandracards.com/makandra/7617-change-how-capybara-sees-or-ignores-hidden-elements – Arcolye

1

Я сделал это таким образом с элементами, которые имеют стиля CSS display:none; набора:

page.execute_script("$('.all-hidden-elements').show();"); 
all('.all-hidden-elements').first.click 
0

Если скрытый элемент вложен в видимый родительский элемент (например, скрытый ввод внутри видимой метки), вы можете щелкнуть по нему.Если вы все еще хотите, чтобы найти вход с помощью ID, вы можете пройти к родителю, как так:

find('#hidden_input').find(:xpath, '..').click 
2

В общем взаимодействии с не видимых элементов не должно быть возможным при использовании Capybara (вы можете найти их с помощью visible: false/hidden вариант в большинстве искателей, но на самом деле ничего не делает для них). Тем не менее, вход в файл является особым случаем из-за того, насколько распространенным является скрытие элемента и из-за ограничений безопасности нет другого способа фактически добавить файл, взаимодействуя со страницами видимыми элементами. Из-за этого attach_file имеет опцию make_visible, которая может быть использована для того, чтобы Capybara отображала элемент, прикрепляла его, а затем сбрасывала CSS в исходную настройку.

attach_file('photos', file_path, make_visible: true) 
+0

Это должен быть новый принятый ответ. –

Смежные вопросы