7

アップロード フォームをテストするための watir スクリプトを作成しています。

しかし、スクリプトはハードドライブからアップロードするファイルを自動的に選択しません。

代わりに、IE はファイル選択ダイアログを開いたまま停止します。ダイアログでアップロードするファイルを手動で選択し、[OK] をクリックするとすぐに、watir は必要に応じて続行します。なんで止まるのかしら。

これは私のwatirスクリプトです:

require 'test/unit'
require 'watir'

# runs on win3k, IE 6.0.3790; ruby 1.8.6, watir 

class EpcHomePage < Test::Unit::TestCase

  def test_upload
    ie = @browser
    htmlfile = "C:\\testing\\upload.html"
    uploadfile = "C:\\testing\\upload.html"
    ie.goto(htmlfile)
    ie.file_field(:name,"file1").set(uploadfile)
    assert_equal uploadfile, ie.file_field(:name,"file1").value
    ie.button(:name, 'upload').click
   end

  def setup
    @browser = Watir::IE.new
  end

  def teardown
    @browser.close
  end
end

このページからコードを取得しました: http://wiki.openqa.org/display/WTR/File+Uploads

これは次の形式です。

<html><body>
  <form name="form1" enctype="multipart/form-data" method="post" action="upload.html">
    <input type="file" name="file1">
    <input type="submit" name="upload" value="ok">
  </form>
</body></html>

このマニュアルhttp://svn.openqa.org/svn/watir/trunk/watir/unittests/filefield_test.rbも見つけました。テストには IE 6 と IE 7 を使用しています。

編集:ここに簡単な例をアップロードしました (私のマシンの c:\testing\ にある 3 つのファイル、cmd ファイルを開始するだけです):

http://dl.dropbox.com/u/1508092/testing.rar

3 つの異なるマシン (すべての Windows 2003、2x IE 6 および 1x IE 7) で失敗します。また、スクリプト c:\ruby\lib\ruby\gems\1.8\gems\watir-1.6.5\lib\watir\input_elements.rb のスリープ時間を 1 秒から 5 秒に変更しました。彼の答えで:

    def set(path_to_file)
      assert_exists
      require 'watir/windowhelper'
      WindowHelper.check_autoit_installed
      begin
        Thread.new do
          sleep 5 # it takes some time for popup to appear
          system %{ruby -e '
          ...

ここで停止します (一度、ファイル ダイアログのディレクトリに手動で移動したことに注意してください。その時点から、IE は常にこのディレクトリで開いているダイアログを表示しますが、スクリプトがディレクトリを選択したことを意味するわけではありません。これは、IE が常に最後のディレクトリを表示することを意味します):

ここで停止します http://dl.dropbox.com/u/1508092/upload-dialog.JPG

編集:

ole32 コードが英語のタイトルを探していることがわかりました。

POPUP_TITLES = ['ファイルを選択', 'アップロードするファイルを選択']

IE 7英語版をインストールしました。まだ成功していません。しかし、input_elements.rb はウィンドウ タイトルを検索するため、ローカライズと関係があると思います。なぜ今でも失敗するのだろうか。これはinput_elements.rbのコードです:

  class FileField < InputElement
    INPUT_TYPES = ["file"]
    POPUP_TITLES = ['Choose file', 'Choose File to Upload']

    # set the file location in the Choose file dialog in a new process
    # will raise a Watir Exception if AutoIt is not correctly installed
    def set(path_to_file)
      assert_exists
      require 'watir/windowhelper'
      WindowHelper.check_autoit_installed
      begin
        Thread.new do
          sleep 2 # it takes some time for popup to appear
          system %{ruby -e '
              require "win32ole"
              @autoit = WIN32OLE.new("AutoItX3.Control")
              time    = Time.now
              while (Time.now - time) < 15 # the loop will wait up to 15 seconds for popup to appear
                #{POPUP_TITLES.inspect}.each do |popup_title|
                  next unless @autoit.WinWait(popup_title, "", 1) == 1
                  @autoit.ControlSetText(popup_title, "", "Edit1", #{path_to_file.inspect})
                  @autoit.ControlSend(popup_title, "", "Button2", "{ENTER}")
                  exit
                end # each
              end # while
          '}
        end.join(1)
      rescue
        raise Watir::Exception::WatirException, "Problem accessing Choose file dialog"
      end
      click
    end
  end

新しい IE のタイトルに「ファイルを選択してください」というテキストが表示されるようになりました。ここでローカライズまたは変更する必要があるものは他にありますか? スクリーンショットを英語版に更新しました。

4

5 に答える 5

3

私はその問題を知っていましたが、完全に忘れていました! gems ディレクトリのinput_elements.rbファイルに移動し、ファイル アップロード ウィンドウのタイトルを言語でPOPUP_TITLES(443 行目) に追加します。

例:

  • POPUP_TITLES = ['Choose file', 'Choose File to Upload']
    
  • POPUP_TITLES = ['Choose file', 'Choose File to Upload', 'File upload in my language']
    
于 2010-04-27T11:16:34.773 に答える
2

Windows XP を英語でインストールしましたが、動作します。(ローカライズされた Windows Server 2003 でエラーが発生しました)

ローカライズの問題だったと思います。これからは、英語のコンピューターでwatirを実行します。

于 2010-04-26T16:14:15.543 に答える
1

私は今日(2012年3月1日)同じ問題を抱えていて、Google経由でここに着陸しました。

私を正しい方向に向けてくれたŽeljkoに感謝しますが、[POPUP_TITLES]を変更するソリューションは機能しませんでした。実際、この配列は現在のバージョンのgem(watir-2.0.4)にはもう存在しないようです。あるいは、私が読み間違えただけかもしれません。

問題を解決しましたwatir-2.0.4/lib/watir/dialogs/file_field.rb:ここでは、さまざまなウィンドウとボタンのタイトルが正規表現として定義されています。次の方法で正規表現を変更します

  • open_button()
  • cancel_button()
  • file_upload_window()

ローカライズされたウィンドウ名と一致します。宝石をリロードした後、それは完璧に機能しました。

于 2012-03-01T14:34:35.137 に答える
0

input_elements.rb (Ruby gems ディレクトリ内) のFileField#set を見て、(またはそれ以上の数値)に変更sleep 1することをお勧めします。sleep 2低速のマシンでは、ファイル アップロードのポップアップが表示されるまでに 1 秒以上かかることに気付きました。

于 2010-04-22T08:59:04.783 に答える