opacity: 0
があり、偽のボタンと重なっているファイルフィールドがあります。異なるブラウザ間で一貫して表示される一種の「アップロードボタン」を偽造する一般的なcssテクニック。
Capybaraでは、その入力でattach_file
を呼び出すことはできません。エラーはSelenium::WebDriver::Error::ElementNotVisibleError: Element is not currently visible and so may not be interacted with
です。
カピバラに目に見えない要素と相互作用させる方法を知っている人はいますか?
答えはまだ回答されていませんが、回避策が見つかりました。インテリジェントなものはなく、単純なスクリプトで要素を表示するだけです
page.execute_script %Q{
$('#photos').css({opacity: 1, transform: 'none'});
}
記録のために投稿します。
Capybaraの_visible: false
_プロパティを使用して、非表示の要素を操作できます。
隠された要素をクリックする場合:
_find("#photos", visible: false).click
_
click_button('#photo')
を直接使用しないでください
カピバラの著者は、Capybara.ignore_hidden_elements
目に見えない要素を見る必要がある直前に、後でそれをリセットします:
Capybara.ignore_hidden_elements = false
click_button 'my invisible button'
Capybara.ignore_hidden_elements = true
一般に、Capybaraを使用する場合、非表示要素とのやり取りはできません(visible: false/hidden
オプションはほとんどのファインダーで使用できますが、実際には何もしません)。ただし、要素を非表示にするのが一般的であるため、ファイル入力は特殊なケースであり、セキュリティ上の制限により、ページの可視要素と対話することによってファイルを実際に追加する他の方法はありません。このため attach_file
があります make_visible
オプションは、Capybaraに要素を表示させ、ファイルを添付し、CSSを元の設定にリセットするために使用できます。
attach_file('photos', file_path, make_visible: true)
私はそれを別のルートで解決することになりました。
execute_script()
は私に苦労していました(FireFoxでのテスト実行をフリーズするでしょう)ので、これは私がやったことです:
すでに適切なjavascriptファイルがありました。以下を追加しました
<% if ENV["Rails_ENV"] == "test" %>
$('#photos').show()
<% end %>
適切なRailsアセット処理のために、.erb
をjavascriptファイルに追加する必要もありました。
そして、私のテストファイルでは、すでにENV["Rails_ENV"] = "test"
を設定していました
このようにして、テストのためにUIをダムするだけで、プロダクションのルックアンドフィールを維持することができました。
Miquel、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");
非表示要素が表示可能な親要素にネストされている場合(表示ラベル内の非表示入力など)、代わりに親をクリックできます。それでもIDで入力を検索する場合は、次のように親に移動できます。
find('#hidden_input').find(:xpath, '..').click
CSSスタイルdisplay:none;
が設定されている要素を使用して、この方法でこれを実行しました。
page.execute_script("$('.all-hidden-elements').show();");
all('.all-hidden-elements').first.click