2010-04-21 9 views
7

Estoy escribiendo un script de watir para probar un formulario de carga.¿Cómo subir un archivo con watir e IE?

Pero la secuencia de comandos no selecciona automáticamente el archivo que se va a cargar desde mi disco duro.

En cambio, IE se detiene con el cuadro de diálogo del selector de archivos abierto. Tan pronto como selecciono manualmente el archivo que se va a cargar en el cuadro de diálogo y hago clic en Aceptar, watir continúa como lo desee. Me pregunto por qué se detiene.

Ésta es mi guión 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 

que tiene el código de esta página: http://wiki.openqa.org/display/WTR/File+Uploads

Ésta es la forma:

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

He encontrado este manual http://svn.openqa.org/svn/watir/trunk/watir/unittests/filefield_test.rb también. Estoy usando IE 6 y también IE 7 para las pruebas.

Editar: He subido mi ejemplo simple aquí (3 archivos que viven en c: \ prueba \ en mis máquinas, acaba de empezar el archivo cmd):

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

falla el 3 de diferentes máquinas (todas las ventanas 2003, 2x IE 6 y 1 x IE 7). También cambié el tiempo de suspensión en el script c: \ ruby ​​\ lib \ ruby ​​\ gems \ 1.8 \ gems \ watir-1.6.5 \ lib \ watir \ input_elements.rb de 1 segundo a 5 segundos, como lo sugirió Željko Filipin en su respuesta:

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

esto es donde se detiene (tenga en cuenta que yo navegar manualmente al directorio en el diálogo una vez que el archivo partir de ese momento IE siempre muestra el cuadro de diálogo abierto con este directorio, pero que lo haga. . no quiere decir que el guión ha seleccionado el directorio que creo que significa que el IE muestra siempre el último directorio donde la izquierda):

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

Editar:

encontré que que el código OLE32 busca el título de Inglés:

POPUP_TITLES = [ 'Elegir archivo', 'Elegir un archivo para subir']

he instalado IE 7 Versión Inglés ahora. Todavía no hay éxito Pero creo que tiene algo que ver con la localización, porque input_elements.rb busca en los títulos de las ventanas. Me pregunto por qué todavía falla ahora. Este es el código de 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 

El texto "Elegir archivo" ahora aparece en el título de mi nuevo IE. ¿Algo más que deba ser localizado o cambiado aquí? Actualicé la captura de pantalla a la versión en inglés.

+0

Uso mucho la carga de archivos con Watir en Internet Explorer, y también he notado que a veces no selecciona el archivo, pero funciona casi todo el tiempo para mí. No funciona para usted en absoluto? –

Respuesta

3

¡Sabía de ese problema y lo olvidé por completo! Vaya al archivo input_elements.rb en su directorio gems, y agregue el título de la ventana de carga de archivos en su idioma al POPUP_TITLES (línea 443).

Ejemplo:

  • antes

    POPUP_TITLES = ['Choose file', 'Choose File to Upload'] 
    
  • después

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

Yo sugeriría que usted echa un vistazo a FileField # coloca en input_elements.rb (en su directorio de gemas de Ruby), y cambiar a sleep 1sleep 2 (o algún número más alto). Me he dado cuenta de que en máquinas más lentas, demora más de un segundo para que aparezca la ventana emergente de carga de archivos.

+0

Gracias Željko - es genial saber dónde ocurre el código. Traté de aumentar el número, pero no parece ser la única razón de los problemas aquí. – user89021

+0

Agradezco mucho su ayuda, de lo contrario me habría perdido. ¡Gracias de nuevo Željko! Todo funciona ahora en una computadora inglesa. karlthorwald aka – user89021

2

Instalé Windows XP en inglés ahora, ¡y funciona! (El error ocurrió en un servidor de Windows localizado 2003)

Supongo que fue el problema de localización. Simplemente ejecutaré watir en la computadora inglesa a partir de ahora.

1

Yo tenía el mismo problema hoy en día (March1,2012) y aterrizó aquí a través de Google.

Gracias a Željko por orientarme en la dirección correcta, sin embargo, la solución de cambiar [POPUP_TITLES] no funcionó. De hecho, esta matriz parece no existir más en la versión actual de la gema (watir-2.0.4), o tal vez simplemente me malinterpreté.

Resolví el problema en watir-2.0.4/lib/watir/dialogs/file_field.rb: Aquí, los títulos de varias ventanas y botones se definen como expresiones regulares. Cambiar las expresiones regulares en los siguientes métodos

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

para que coincida con sus nombres de las ventanas localizadas. Después de volver a cargar la gema, funcionó a la perfección.

+0

Sí, la disposición de algunos de los archivos de watir ha cambiado bastante desde hace casi dos años cuando se publicó esta pregunta. Me alegra ver que lo entendiste, y gracias por la respuesta que podría ser útil para cualquier persona como tú que encuentre esto a través de Google, etc. –

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}') 
Cuestiones relacionadas