Как загрузить файл с помощью watir и IE? - PullRequest
7 голосов
/ 22 апреля 2010

Я пишу сценарий watir для проверки формы загрузки.

Но скрипт не выбирает автоматически файл, который должен быть загружен с моего жесткого диска.

Вместо этого IE останавливается с открытым диалоговым окном выбора файлов. Как только я вручную выберу файл для загрузки в диалоговом окне и нажму «ОК», 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 для тестирования.

Редактировать: Я загрузил свой простой пример здесь (3 файла, которые находятся в c: \ testing \ на моих машинах, просто запустите файл cmd):

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

Сбой на 3 разных машинах (все Windows 2003, 2x IE 6 и 1 x IE 7). Я также изменил время ожидания в сценарии c: \ ruby ​​\ lib \ ruby ​​\ gems \ 1.8 \ gems \ watir-1.6.5 \ lib \ watir \ input_elements.rb с 1 секунды до 5 секунд, как предложено jeljko Filipin в своем ответе:

    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

Edit:

Я обнаружил, что код 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. Что-нибудь еще, что должно быть локализовано или изменено здесь? Я обновил скриншот до английской версии.

Ответы [ 5 ]

3 голосов
/ 27 апреля 2010

Я знал об этой проблеме и совершенно забыл! Перейдите к файлу input_elements.rb в вашем каталоге gems и добавьте заголовок окна загрузки файла на вашем языке в POPUP_TITLES (строка 443).

Пример:

  • до

    POPUP_TITLES = ['Choose file', 'Choose File to Upload']
    
  • после

    POPUP_TITLES = ['Choose file', 'Choose File to Upload', 'File upload in my language']
    
2 голосов
/ 26 апреля 2010

Я установил Windows XP на английском языке, и это работает!(Ошибка произошла на локализованном сервере Windows 2003)

Я думаю, это была проблема локализации.Теперь я буду просто запускать watir на английском компьютере.

1 голос
/ 01 марта 2012

У меня была такая же проблема сегодня (1 марта 2002 г.), и я попал сюда через Google.

Спасибо Желько за то, что он указал мне правильное направление, однако решение по изменению [POPUP_TITLES] не сработало. На самом деле, этот массив больше не существует в текущей версии гема (watir-2.0.4), или, может быть, я просто неправильно прочитал.

Я решил проблему в watir-2.0.4/lib/watir/dialogs/file_field.rb: Здесь различные заголовки окон и кнопок определяются как регулярные выражения. Измените регулярные выражения следующими способами

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

, чтобы соответствовать вашим локализованным именам окон. После перезагрузки камень работал безупречно.

0 голосов
/ 22 ноября 2016
  @modal = @browser.driver.switch_to.alert   #Switch to open windows modal
  key_to_send = "C:\\Users\\singhku\\Calabash_doc.pdf"  #Path and name of file
  @modal.send_keys(key_to_send)

  require 'win32ole'
  wsh = WIN32OLE.new('Wscript.Shell')
  wsh.AppActivate('Choose File to Upload')  #Name of the modal that is open
  wsh.SendKeys('{ENTER}')
0 голосов
/ 22 апреля 2010

Я бы посоветовал вам взглянуть на FileField #, установленный в input_elements.rb (в вашем каталоге Ruby gems), и изменить sleep 1 на sleep 2 (или на большее число). Я заметил, что на более медленных компьютерах всплывающее окно загрузки файла занимает больше секунды.

...