2010-04-21 38 views
7

我在寫一個watir腳本來測試上傳表單。如何用watir和IE上傳文件?

但該腳本不會自動選擇要從我的硬盤上傳的文件。

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:\我的機器測試\,只需啓動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秒,就像ŽeljkoFilipin在他的回答:

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瀏覽器總是顯示上次目錄在那裏左):

this is where it stops 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的標題。還有什麼應該在這裏進行本地化或更改?我將屏幕截圖更新爲英文版。

+0

我在Internet Explorer中使用Watir的文件上傳很多,我也注意到它有時不會選擇文件,但它幾乎爲我所有的時間。它根本不適合你? – 2010-04-22 08:55:29

回答

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'] 
    
0

我建議你採取input_elements.rb看看的FileField#集(在Ruby寶石目錄),並改變sleep 1sleep 2(或一些更高號)。我注意到,在速度較慢的機器上,彈出文件上傳需要一秒以上的時間。

+0

謝謝Željko--很高興知道它發生的代碼在哪裏。我試圖增加數量,但它似乎不是這裏問題的唯一原因。 – user89021 2010-04-23 08:58:30

+0

我非常感謝你的幫助,否則我會迷失方向。再次感謝你Željko!一切工作現在在英語電腦上。 karlthorwald aka – user89021 2010-04-26 16:15:44

2

我現在安裝了windows xp的英文版,它的工作原理! (該錯誤發生在本地化的Windows Server 2003上)

我想這是本地化問題。我將從現在開始在英語電腦上運行watir。

1

我有同樣的問題今日(March1,2012),並通過谷歌降落在這裏。

感謝Ž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()

以滿足您的本地化的窗口名稱。重新加載寶石後,它的工作完美無瑕。

+0

是的,自從近兩年前這個問題發佈以來,一些watir文件的安排已經發生了很大變化。很高興看到你明白了,並感謝對於像你這樣的人通過google等發現這個答案的答案。 – 2012-03-02 00:03:25

0
@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}')