Cómo subir archivo (imagen) con selenium, python

¿Cómo cargar una imagen en una aplicación web con la herramienta de prueba de selenium? Estoy usando python.

Probé muchas cosas, pero nada funcionó.

El control de entrada de carga abre un cuadro de diálogo nativo (se realiza mediante el navegador), por lo que al hacer clic en el botón de control o en el botón de navegación a través de Selenium solo aparecerá el cuadro de diálogo y la prueba se bloqueará.

La solución es establecer el valor de la entrada de carga a través de JavaScript (en Java se realiza a través de JavascriptExecutor) y luego enviar el formulario.

Consulte esta pregunta para obtener una muestra en C #. Estoy seguro de que también hay una forma de llamar a JavaScript en Python, pero nunca usé los enlaces Selenium Python

Lo que estoy haciendo es esto (asegúrate de que drv sea una instancia de webdriver):

drv.find_element_by_id("IdOfInputTypeFile").send_keys(os.getcwd()+"/image.png") 

y luego encuentre su botón de enviar y haga clic en él.

¡Todos estos enfoques no funcionarán con los cargadores de imágenes modernos en olx! Enfoque alternativo (solo para ventanas)

 1. Automation of windows can be done using Autoit 2. Install Autoit and SciTe Script editor 3. Autoit code :(imageupload.au3) WinActivate("File Upload"); for chrome use "open" that is the name of the window that pops send("D:\images\image1.png"); path of the file Send("{ENTER}") 4. compile it to get an .exe file(imageupload.exe) 5. Now from python call the .exe file like import os import os.system('C:\images\imageupload.exe') #path of the .exe file 

Agregué una respuesta para cualquier persona que quiera usar Trato con los molestos msofiledialogs. Esto está funcionando a partir de la solución propuesta de saravanan, pero más desarrollada para Python.

Tuve un problema similar con un guión en el que estoy trabajando para una empresa que está al lado. Estoy intentando cargar documentos para los clientes de una empresa, pero debido a la forma en que funcionaba su sitio, no pude utilizar send_keys para enviar directamente la ruta, por lo que tuve que confiar en msofiledialog.

  1. Solo necesita instalar AutoIt https://pypi.python.org/pypi/PyAutoIt/0.3 o simplemente “pip install -U pyautoit” a través de la pantalla cmd

  2. escribe “import autoit” en tu página de script

  3. Escriba lo siguiente antes de que aparezca el diálogo de archivo en su script:

    autoit.win_active (“Open”) autoit.control_send (“Open”, “Edit1”, r “C: \ Users \ uu \ Desktop \ TestUpload.txt”) autoit.control_send (“Open”, “Edit1”, “{ ENTRAR}”)

Buscará la ventana de diálogo de abrir archivo, la llenará y presionará enter. “Abrir” es el título de la pantalla de diálogo de mi archivo. Pon el título tuyo en lugar de “Open”. Hay formas más creativas de utilizar las funciones de Autoit, pero esta es una manera fácil y directa para los principiantes.

Edición: NO. NO use control_send en la mayoría de las cosas si puede evitarlo. Tiene un problema bien conocido de enviar texto erróneo. En mi caso, los dos puntos en la ruta de mi archivo se estaban convirtiendo en un punto y coma. Si necesita enviar claves de entrada, debería estar bien, sin embargo, si necesita enviar texto, use control_set_text. Tiene la misma syntax.

 autoit.control_set_text("Open","Edit1",r"C:\Users\uu\Desktop\TestUpload.txt") 

Estoy usando fine-uploader , ejecutando pruebas de selenium con pytest y esto funcionó para mí:

  elm = driver.find_element_by_xpath("//input[@type='file']") elm.send_keys(os.getcwd() + "/tests/sample_files/Figure1.tif") 

No es necesario enviar el formulario o la tecla Intro en mi caso.

¡Gracias por todas las respuestas! ¡Ayudó mucho!

 import win32com.client shell = win32com.client.Dispatch("WScript.Shell") shell.Sendkeys("C:\text.txt") shell.Sendkeys("~") 

Resolverá el problema

He usado el siguiente formato de script para subir las imágenes. Esto puede ayudarte.

  Imagepath=os.path.abspath('.\\folder1\\subfolder2\file1.jpg') driver.find_element_by_id("Id of the element").clear() driver.find_element_by_id("Id of the element").send_keys(Imagepath) 

Si no tiene ID del objeto, puede usar xpath o css selector en consecuencia.

Usando la astilla:

browser.attach_file (‘file_chooser_id’, full_qualified_file_path)

Aquí está el código que utilicé:

Imagepath = "C:\User\Desktop\image.png" driver.find_element_by_xpath('//html/body/input').send_keys(Imagepath) driver.find_element_by_xpath('//html/body/button').click()

Acepto la Respuesta de karloskar. Nota: No está funcionando para FireFox (59). Y funciona solo con Chrome Driver.