15

次の HTML スタックを使用してカスタム アップロード フォームを作成しました。

<form>
  <label></label>
  <input type="file">
</form>

ファイル フィールドはプロパティを使用して css を介して非表示にされdisplay: noneます。そのため、ユーザーがラベル (カスタム スタイル) をクリックすると、ファイル添付ダイアログが呼び出されます。

私の機能テストでは、入力フィールドが非表示になっているため、ファイルを添付できません。考えられる解決策をいくつか試しましたが、どちらも機能しません。

find(:xpath, '//input', visible: false).set(some_file_path)

また

within('form') do                                                                                                                                                                       
  attach_file(:input, some_file_path, visible: false)                                                                                                                                          
end

そして他の多く。いつも不明な位置エラーで要素をクリックできませんでした。入力フィールドに重なっているラベルを削除したら、それを表示して、合格したすべての仕様を実行します。したがって、ここでの問題は次の事実です。

  1. 入力ファイル フィールドにはdisplay: noneプロパティがあります (そのため、見つかりません)
  2. 隠しファイル欄に重なっているラベルがある(多分)

Capybara-webkit ドライバーを使用して Capybara にこのデリケートな状況を適切な方法で処理させる方法はありますか?

4

5 に答える 5

16

capybara-webkit を使用すると、ページのコンテキスト内で任意の JavaScript を実行するようにドライバーに指示できるため、可視性の問題をハックするカスタムを作成できます。

script = "$('thelabel').toggle(); " # hide the label
script << "$('myfield').toggle();"  # show your field

page.driver.browser.execute_script(script)

これは疑似コードですが、フィールドを呼び出す前に、同様のことを実行してフィールドを表示できるはずですattach_file

とはいえ、(少なくとも私は)テストでこのような少しひどいことをするたびに、少し時間をとって、修正が必要なのはテストなのかインターフェイスなのかを尋ねることをお勧めします. インターフェイスに満足している場合は、上記のような小さな js スニペットを使用して、テスト用に要素を表示できるはずです。

アップデート:

この動作のサポートはより広範になり、現在はカピバラで標準化されているため、次のことができます。

page.execute_script(script)

この短いバージョンは、カピバラ2.x および最近のバージョンのcapybara-webkitまたはpoltergeistで動作するはずです。これは、現在使用している依存性の低い代替手段です。

パートナー メソッドもありますevaluate_script

result = page.evaluate_script('4 + 4');

お役に立てれば!

于 2013-07-06T01:09:51.367 に答える
4

Matt Sanders は、JS を使用して要素の可視性を切り替えることを提案しています。それはうまくいきますが、もう少しきれいな別の解決策、IMOがあります。

必要な場合にのみ隠しフィールドを含めることをお勧めします。これを実現するために、実際に Capybara に隠しフィールドを含めたいというまれなケースにこのヘルパーを使用しました。例えば:

# features/support/capybara_helpers.rb
module CapybaraHelpers
  # By default, capybara will ignore all hidden fields. This is a smart default
  # except in rare cases. For example, our AS3 file uploader requires you to
  # click a hidden file field - and that makes perfect sense. In those rare
  # cases, you can use this helper to override the default and force capybara
  # to include hidden fields.
  #
  # Examples
  #
  #   include_hidden_fields do
  #     attach_file("hidden-input", "path/to/fixture/file")
  #   end
  #
  def include_hidden_fields
    Capybara.ignore_hidden_elements = false
    yield
    Capybara.ignore_hidden_elements = true
  end
end
World(CapybaraHelpers)
于 2014-06-04T16:22:33.753 に答える
-1

これを試して

file_field = page.find('input[type="file"]', visible: false) file_field.set('path/to/my/image.jpg')

于 2016-07-17T17:48:50.343 に答える