Interactuando con cuadros emergentes usando selenium en python

Estoy intentando usar el módulo Selenium en Python para generar una lista de texto de un sitio web, guardarla en un directorio y buscar esa lista de texto en otro sitio para enviarla.

Estoy trabajando en la secuencia de comandos en dos partes: 1. Obtener metadatos y 2. Ordenar datos. He completado con éxito el script en la parte 1, excepto por lo último: elegir guardar el archivo de metadatos que se acaba de generar. Lo dejé solo para trabajar en la parte 2, con la esperanza de encontrar la respuesta, pero estoy llegando al mismo problema cuando aparece la ventana emergente para elegir el archivo.

En la documentación , me dicen que Selenium WebDriver tiene soporte incorporado para manejar cuadros de diálogo emergentes y que, después de activar un cuadro de diálogo, si llamo alert = driver.switch_to_alert() entonces puedo “aceptar, descartar, leer su contenido , o incluso escribir en un aviso “.

Sin embargo, no está funcionando. Cuando bash alert.text('some text') o alert.send_keys(Keys.TAB) , sigo recibiendo el error NoAlertPresentException: Message: No alert is present y luego de agregar el comando para esperar, recibo el error TimeoutException: Message:

¿Las ventanas emergentes que estoy recibiendo (capturas de pantalla adjuntas) no son reconocidas por Selenium? Si es así, ¿cómo interactúo con ellos? Parece que usar esto para guardar y / o cargar archivos es algo que muchas personas tienen que hacer, pero no puedo encontrar nada en Google. Específicamente, me gustaría elegir ‘Guardar archivo’ luego ‘Aceptar’ para la primera imagen y para la segunda me gustaría buscar el archivo (es decir, ingresar la ruta en el campo del nombre del archivo) y hacer clic en ‘Abrir’. No quiero simplemente cambiar mi configuración de Firefox para guardarlo automáticamente, ya que esto eventualmente se ejecutará en un entorno diferente, y eso no ayudará a resolver mi segundo problema.

¡Gracias!

EDITAR: Estoy probando mi script en Windows pero eventualmente se implementará en un servidor en la nube de Linux. Pensé que iba a tener que cambiar a PhantomJS webdriver (que probablemente iba a empeorar mi problema) para hacer una navegación sin cabeza, pero encontré una manera de mantener Firefox. Supongo que todo esto significa que no puedo usar AutoIT para solucionar mi problema.

guardar diálogo

Las ventanas emergentes que ve no son ventanas emergentes normales con las que se pueda interactuar utilizando switch_to . Estas ventanas emergentes son diálogos del sistema y no se pueden automatizar usando selenium .

Por lo general, las personas evitan que estos cuadros de diálogo se muestren en primer lugar al modificar las preferencias del navegador, por ejemplo:

  • descargando archivo usando selenium
  • Acceso al diálogo de descarga de archivos en Firefox.
  • ¿Cómo descargar un archivo usando el WebDriver de Selenium?

Para cargar, por lo general, puede encontrar el elemento de entrada apropiado y enviarle claves con una ruta al archivo:

  • Cómo subir archivo (imagen) con selenium, python
  • ¿Cómo subir archivos a las entradas de archivos? (documentos de python-selenium)

Avíseme si su caso no puede resolverse utilizando las respuestas en los enlaces que he adjuntado.


En cuanto a su primer problema de “descargar archivo automáticamente”, solo necesita configurar un tipo de contenido correcto:

 profile.set_preference('browser.helperApps.neverAsk.saveToDisk', "application/xml,text/xml") 

Segunda solución del problema (cargar parte):

 driver.find_element_by_name("input_product_list").send_keys(textpath) driver.find_element_by_name('include_sr').click() driver.find_element_by_id('submit').click() 

Implementación extremadamente simple utilizando AutoIT.

Debajo de los scripts y pasos puede hacer clic en “Guardar> Aceptar” en la ventana emergente de esta ventana

Paso 1: descargue el paquete / herramienta AutoIT aquí Autoit Puede seleccionar el formato ZIP (extraerlo)

Paso 2: Abra cualquier editor de texto (por ejemplo, el bloc de notas), copie el siguiente código y guárdelo con la extensión .au3
(por ejemplo, file.au3)

 WinWait("[TITLE:Opening ; CLASS:MozillaDialogClass]","", 10) If WinExists("[TITLE:Opening ; CLASS:MozillaDialogClass]") Then WinActivate("[TITLE:Opening ; CLASS:MozillaDialogClass]") Send("{DOWN}") Sleep(20) Send("{TAB}") Sleep(20) Send("{TAB}") Sleep(20) Send("{ENTER}") EndIf 

Paso 3: Desde el archivo zip extraído (Paso 1) busque la carpeta llamada: Aut2Exe y ábrala

Paso 4: Haga clic en Aut2exe_x64.exe si su sistema operativo es de 64 bits, de lo contrario, haga clic en Aut2exe.exe

Paso 5: Buscar / Localizar el archivo creado en el Paso 2. (archivo guardado como extensión .a3 ) Y Elija Destino (.exe / .a3x) y seleccione la opción .exe (por ejemplo, file.exe) Y luego haga clic en convertir

Paso 6: incluya este archivo.exe en la carpeta de su proyecto y utilícelo según sus requisitos utilizando el siguiente código (como se encuentra en Eclipse):

 driver.dwonload().click(); // it can be something else as per your flow Runtime.getRuntime().exec("C:/*path_to_your_EXE_file(selected in step 6))*/file.exe");