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