¿Cómo recupero el “texto” de la página que origina la alerta, especialmente ** después de ** el usuario humano * ha hecho clic * en la alerta de ** la página **?

Básicamente, cuando aparece una alerta en javascript, puedo dismiss() de python perfectamente, llamando a selenium.webdriver.common.alert.Alert(browser).dismiss() .

Sin embargo, si el “usuario del navegador” descarta la alerta haciendo clic en [OK] (en la pantalla) con su mouse, entonces la alerta del navegador se “Perdió en el espacio” body.text ya no se puede acceder a body.text desde python.

Entonces … ¿Cómo recupero el “texto” de la página que origina la alerta, especialmente después de que el usuario humano haya hecho clic en [descartar] en la alerta de la página?

Aquí están las sugerencias y un script para demostrar el problema …

Para su información: el objective del código de origen es permitir que el usuario del navegador intervenga en la pantalla en las pruebas y responda manualmente a alertas específicas.

     #!/usr/bin/env python import os,sys,time import selenium.webdriver import selenium.webdriver.support.expected_conditions print dict(python=sys.version,selenium=selenium.__version__) path=os.path.join(os.getcwd(),"hello_worlds.html") url="file:///"+path open(path,"w").write(""" Head Title 

    Hello, worlds!

    """) browser=selenium.webdriver.Firefox() browser.get(url) body=browser.find_element_by_tag_name("body") print "BODY:",body.text try: for enum,world in enumerate("Mercury Venus Earth Mars Asteroids Jupiter Saturn Uranus Neptune".split()): if "Earth" in world: world+=": So do MANUALLY dismiss! {Click [OK] now!!!}" else: world+=": AUTO PILOT... please DONT dismiss! {done via selenium.dismiss()!}" browser.execute_script('alert("Hello, %s!")'%world) if selenium.webdriver.support.expected_conditions.alert_is_present(): print selenium.webdriver.common.alert.Alert(browser).text time.sleep(enum+5) if "Earth" not in world: selenium.webdriver.common.alert.Alert(browser).dismiss() print "BODY:",body.text finally: browser.quit()

    Salida: (Choque en la Tierra)

     {'python': '2.6.6 (r266:84292, Aug 18 2016, 15:13:37) \n[GCC 4.4.7 20120313 (Red Hat 4.4.7-17)]', 'selenium': '2.53.2'} BODY: Hello, worlds! Hello, Mercury: AUTO PILOT... please DONT dismiss! {done via selenium.dismiss()!}! BODY: Hello, worlds! Hello, Venus: AUTO PILOT... please DONT dismiss! {done via selenium.dismiss()!}! BODY: Hello, worlds! Hello, Earth: So do MANUALLY dismiss! {Click [OK] now!!!}! BODY: Traceback (most recent call last): File "./js_alert.py", line 37, in  print "BODY:",body.text ... selenium.common.exceptions.UnexpectedAlertPresentException: Alert Text: Hello, Earth: So do MANUALLY dismiss! {Click [OK] now!!!}! Message: Unexpected modal dialog (text: Hello, Earth: So do MANUALLY dismiss! {Click [OK] now!!!}!) The alert disappeared before it could be closed. 

    Lo extraño es que si el usuario del navegador activa otra alerta (¡incluso en otra página!), Entonces un selenium.dismiss() body.text del limbo y el selenium desde entonces funcionará según mis (mis) expectativas.

    ¿Alguna sugerencia sobre cómo hacer que el navegador regrese a page.body ? (Y escapar de la alerta)

    Anexo: Aquí hay preguntas similares (encontradas con una búsqueda intensa):

    • descargando – Problemas al descargar el archivo usando Selenium + Firefox
    • alerta de java – Selenium WebDriver – Alerta de diálogo modal inesperado
    • UnexpectedAlertPresentException: error de Webdriver: “No hay alerta presente” después de que se emite UnexpectedAlertPresentException
    • DesiredCapabilities – ¿Cómo manejar una alerta con la capacidad “UnexpectedAlertBehaviour” en Selenium?
    • java & javascript – org.openqa.selenium.UnhandledAlertException: alerta inesperada abierta
    • deshabilita la excepción o DesiredCapabilities – org.openqa.selenium.UnhandledAlertException: alerta inesperada abierta
    • Sugerencia de no hacer clic: cuando se muestra un cuadro de diálogo, se lanza una excepción “UnhandledAlertException: Modal dialog present”
    • IE y en la naturaleza – https://github.com/SeleniumHQ/selenium-google-code-issue-archive/issues/4839
    • informe de error de Java? https://groups.google.com/forum/#!topic/webdriver/aNyOfEjMENg
    • “Todavía no funciona”. la excepción de captura no restablece el problema – (Sin embargo, casi exactamente el mismo problema) – cómo manejar las alertas de javascript en selenium usando python
    • sugirió hacer un driver.findElement(By.id("myAlert")); pero eso produce la misma excepción: https://sqa.stackexchange.com/questions/22482/why-my-alert-is-not-popping-up
    • browser.refresh(); da UnexpectedAlertPresentException lo que no funciona. https://github.com/angular/protractor/issues/1486
    • browser.switch_to.window(browser.window_handles[0]) luego body.text da: UnexpectedAlertPresentException
    • Similar: el controlador web de Python para manejar ventanas emergentes del navegador que no es una alerta

    He estado luchando con este problema de vez en cuando; Tu comentario sobre tu pregunta me solucionó el problema:

    Después de que se NoAlertPresentException tanto UnexpectedAlertPresentException como NoAlertPresentException

     browser.execute_script('alert("Clearing out past dialogs.")') browser.switch_to.alert.accept() 

    Como dijo en su respuesta, el controlador web está creando un “diálogo” cuando la alerta está presente. Cerrar la alerta a mano hace que su referencia se pierda en el limbo, pero sigue bloqueando el acceso a body.text . La creación de una nueva alerta parece permitir que Webdriver borre ese viejo “diálogo” y (después de aceptar) otorga acceso a la página nuevamente.

    Aún no hay solución … sospecho que es un error en el controlador web de Firefox en el archivo modals.js

    El controlador web de Firefox captura la ventana emergente de alerta y la reemplaza con un elemento llamado ‘dialog’ {por ejemplo, getElementsByTagName('dialog')[0] }

    El problema es que si el probador es humano y hace clic en “descartar” o “aceptar”, entonces “onclick” para “diálogo” no llama a fxdriver.modals.clearFlag_ … de ahí el problema.

    https://github.com/SeleniumHQ/selenium/blob/master/javascript/firefox-driver/js/modals.js#LC39

     fxdriver.modals.isModalPresent = function(callback, timeout) { fxdriver.modaltimer = new fxdriver.Timer(); fxdriver.modaltimer.runWhenTrue( function() { var modal = fxdriver.modals.find_(); return modal && modal.document && modal.document.getElementsByTagName('dialog')[0]; }, function() { callback(true) }, timeout, function() { callback(false) }); }; fxdriver.modals.acceptAlert = function(driver) { var modal = fxdriver.modals.find_(); var button = fxdriver.modals.findButton_(modal, 'accept'); button.click(); fxdriver.modals.clearFlag_(driver); }; 

    https://github.com/SeleniumHQ/selenium/blob/master/javascript/firefox-driver/js/modals.js#LC127

     fxdriver.modals.setFlag = function(driver, flagValue) { driver.modalOpen = flagValue; }; fxdriver.modals.clearFlag_ = function(driver) { fxdriver.modals.setFlag(driver, false); }; 

    Tal vez el file_detector que selecciona los archivos locales tiene un trabajo alrededor …

    Problema similar:

    • ¿Cómo depurar el cierre automático del cuadro de alerta de Firefox y no poder detectar la alerta en Serenity BDD?

    Informe de error: