2010-04-21 31 views
7

Tôi đang viết kịch bản lệnh để kiểm tra biểu mẫu tải lên.Cách tải lên tệp bằng watir và IE?

Nhưng tập lệnh không tự động chọn tệp được tải lên từ đĩa cứng của tôi.

Thay vào đó, IE dừng bằng hộp thoại chọn tệp. Ngay khi tôi chọn thủ công tệp được tải lên trong hộp thoại và bấm ok, watir tiếp tục như mong muốn. Tôi tự hỏi tại sao nó dừng lại.

Đây là kịch bản watir tôi:

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 

Tôi đã nhận mã từ trang này: http://wiki.openqa.org/display/WTR/File+Uploads

Đây là hình thức:

<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> 

Tôi đã tìm thấy thủ http://svn.openqa.org/svn/watir/trunk/watir/unittests/filefield_test.rb này cũng có. Tôi đang sử dụng IE 6 và IE 7 cho thử nghiệm.

Edit: Tôi đã tải lên ví dụ đơn giản của tôi ở đây (3 file mà sống trong c: \ thử nghiệm \ trên máy của tôi, chỉ cần bắt đầu file cmd):

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

Nó không thành công trên 3 các máy khác nhau (tất cả các cửa sổ 2003, 2x IE 6 và 1 x IE 7). Tôi cũng đã thay đổi thời gian ngủ trong script c: \ ruby ​​\ lib \ ruby ​​\ gems \ 1.8 \ gems \ watir-1.6.5 \ lib \ watir \ input_elements.rb từ 1 giây đến 5 giây, như đề xuất bởi Željko Filipin trong câu trả lời của mình:

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 ' 
      ... 

Đây là nơi dừng lại (hãy lưu ý rằng tôi đã điều hướng thủ công thư mục trong hộp thoại tệp một lần). . không có nghĩa là kịch bản được lựa chọn thư mục tôi nghĩ rằng nó có nghĩa là IE luôn luôn hiển thị thư mục cuối cùng mà nó trái):

this is where it stops http://dl.dropbox.com/u/1508092/upload-dialog.JPG

Edit:

tôi thấy rằng rằng mã Ole32 tìm kiếm tiêu đề tiếng Anh:

POPUP_TITLES = [ 'Chọn tập tin', 'Chọn tệp để tải']

Tôi đã cài đặt IE 7 phiên bản tiếng Anh hiện nay. Vẫn không thành công. Nhưng tôi nghĩ rằng nó có một cái gì đó để làm với nội địa hóa, bởi vì input_elements.rb tìm kiếm các tiêu đề cửa sổ. Tôi tự hỏi tại sao nó vẫn thất bại bây giờ. Đây là mã từ 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 

Văn bản "Chọn tệp" hiện xuất hiện trong tiêu đề IE mới của tôi. Bất cứ điều gì khác cần được bản địa hóa hoặc thay đổi ở đây? Tôi đã cập nhật ảnh chụp màn hình lên phiên bản tiếng Anh.

+0

Tôi sử dụng tệp tải lên với Watir trong Internet Explorer rất nhiều và tôi cũng nhận thấy rằng đôi khi nó không chọn tệp, nhưng nó hoạt động gần như mọi lúc với tôi. Nó không làm việc cho bạn cả? –

Trả lời

3

Tôi biết về vấn đề đó và hoàn toàn quên! Truy cập input_elements.rb tệp trong thư mục đá quý của bạn và thêm tiêu đề của cửa sổ tải tệp lên bằng ngôn ngữ của bạn lên POPUP_TITLES (dòng 443).

Ví dụ:

  • trước

    POPUP_TITLES = ['Choose file', 'Choose File to Upload'] 
    
  • sau

    POPUP_TITLES = ['Choose file', 'Choose File to Upload', 'File upload in my language'] 
    
0

Tôi khuyên bạn nên xem FileField # set trong input_elements.rb (trong thư mục đá quý Ruby) và thay đổi sleep 1 thành sleep 2 (hoặc một số cao hơn). Tôi đã nhận thấy rằng trên các máy chậm hơn phải mất hơn một giây để tải lên tệp bật lên xuất hiện.

+0

Cảm ơn bạn Željko - thật tuyệt vời khi biết mã trong đó xảy ra ở đâu. Tôi đã cố gắng để tăng số lượng nhưng nó không có vẻ là lý do duy nhất cho các vấn đề ở đây. – user89021

+0

Tôi đánh giá cao sự giúp đỡ của bạn rất nhiều, nếu không tôi đã có thể bị mất khá nhiều. Cảm ơn bạn một lần nữa Željko! Tất cả mọi thứ hoạt động ngay bây giờ trên một máy tính tiếng Anh. karlthorwald aka – user89021

2

Tôi đã cài đặt windows xp bằng tiếng Anh ngay bây giờ và nó hoạt động! (Lỗi xảy ra trên máy chủ cửa sổ được bản địa hóa năm 2003)

Tôi đoán đó là vấn đề địa phương hóa. Tôi sẽ chỉ chạy watir trên máy tính tiếng anh từ bây giờ.

1

tôi đã cùng một vấn đề ngày hôm nay (March1,2012) và hạ cánh ở đây thông qua Google.

Cảm ơn Željko đã chỉ cho tôi đúng hướng, tuy nhiên giải pháp thay đổi [POPUP_TITLES] không hoạt động. Trong thực tế, mảng này dường như không tồn tại nữa trong phiên bản hiện tại của đá quý (watir-2.0.4), hoặc có lẽ tôi chỉ đọc sai.

Tôi đã giải quyết sự cố trong watir-2.0.4/lib/watir/dialogs/file_field.rb: Ở đây, các tiêu đề cửa sổ và nút khác nhau được định nghĩa là biểu thức chính quy. Thay đổi regexps trong các phương pháp sau

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

để phù hợp với tên cửa sổ cục bộ của bạn. Sau khi tải lại đá quý, nó hoạt động hoàn hảo.

+0

Vâng, sự sắp xếp của một số tệp watir đã thay đổi một chút từ gần hai năm trước khi câu hỏi này được đăng. Vui mừng khi thấy bạn đã tìm ra và cảm ơn câu trả lời có thể hữu ích cho bất kỳ ai như chính bạn, những người tìm thấy điều này qua google, v.v. –

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}') 
Các vấn đề liên quan