chrome selenium-webdriver selenium-chromedriver google-chrome-headless

selenium-webdriver - selenium chrome headless c#



alertas sin cabeza de cromedriver (3)

Parece que tengo el mismo problema cuando ejecuto Chrome sin cabeza. La ventana de alerta no aparece como base en las capturas de pantalla. Funciona bien en cromo, pero no en cromo sin cabeza.

Me estoy ejecutando en chrome 60.0.3112.72 y chrome driver 2.30

Porque el cromo sin cabeza descarta automáticamente las alertas. mira esto: https://bugs.chromium.org/p/chromium/issues/detail?id=718235

Por cierto, ¿cómo es posible que la captura de pantalla en Chrome 59 en modo sin cabeza? Chrome 59 tiene un error que hace que cada captura de pantalla sea una imagen de 1x1 píxeles en modo sin cabeza, por lo que actualicé a Chrome 60.

Tengo este problema con las pruebas de selenium webdriver con chromedriver. Aunque puedo ejecutar pruebas con éxito cuando uso el navegador Chrome, no puedo ejecutar las mismas pruebas en modo sin cabeza.

No puedo manejar las alertas de Js. De hecho, al tomar una captura de pantalla parece que la alerta ni siquiera aparecerá.

Captura de pantalla de alerta

He intentado varias soluciones:

1) driver.window_handles -> No hay otra ventana que parece estar presente

2) driver.execute_script("window.confirm = function(){return true;}") -> Nada ha cambiado con esa secuencia de comandos

3) element = WebDriverWait(driver, 20).until(EC.alert_is_present()) y por supuesto una espera explícita

En el modo de navegador, uso un simple:

try: print driver.switch_to.alert.text driver.switch_to.alert.accept() except NoAlertPresentException as e: print("no alert")

¿Alguien más tiene este problema con alertas en modo sin cabeza?

  • chromedriver v.2.30.477691
  • Versión de Chrome 59.0.3071.115

Como Chrome headless no (actualmente) admite alertas, debe monopatchear los métodos de alert() y confirm() . Este es el enfoque que he usado (en C #):

/// <summary> /// The Chrome Headless driver doesn''t support alerts, so we need to override the window.alert method to get the expected behavior. /// </summary> /// <param name="driver">The active IWebDriver instance</param> /// <param name="result">The result that the alert should return, i.e., true if we want it "accepted", false if we don''t</param> public static void SetupAlert(this IWebDriver driver, bool result) { // ks 7/27/17 - The Chrome Headless driver doesn''t support alerts, so override the various window.alert methods to just set const string scriptTemplate = @" window.alertHandlerCalled = false; window.alertMessage = null; window.alert = window.confirm = function(str) { window.alertHandlerCalled = true; window.alertMessage = str; return {{result}}; };"; var script = scriptTemplate.Replace("{{result}}", result.ToString().ToLower()); var js = (IJavaScriptExecutor)driver; js.ExecuteScript(script); } /// <summary> /// This is an optional accompaniment to the <see cref="SetupAlert"/> method, which checks to see /// if the alert was, in fact, called. If you don''t want to bother to check, don''t worry about calling it. /// Note that this doesn''t reset anything, so you need to call <see cref="SetupAlert"/> each time before calling /// this method. /// </summary> public static void WaitForAlert(this IWebDriver driver, TimeSpan? timeout = null) { const string script = @"return window.alertHandlerCalled"; var js = (IJavaScriptExecutor)driver; var timeToBail = DateTime.Now.Add(timeout ?? TimeSpan.FromMilliseconds(500)); while (DateTime.Now < timeToBail) { var result = (bool)js.ExecuteScript(script); if (result) return; Thread.Sleep(100); } throw new InvalidOperationException("The alert was not called."); }

Lo uso así:

Driver.SetupAlert(true); this.ClickElement(ResetButton); Driver.WaitForAlert();


Todavía tengo este problema desde Chrome 61, así que pasé un tiempo buscando una solución diferente. Mi favorito debido a su simplicidad es inyectar javascript antes de que se muestre la alerta para aceptar automáticamente la alerta.

Simplemente coloque la siguiente línea de código antes de la línea que hace que se muestre la alerta:

driver.ExecuteJavaScript("window.confirm = function(){return true;}");

Funciona tanto con Chrome sin cabeza como con PhantomJS.