Selenium: autenticación básica mediante URL
En mi Selenium-Test
(con chromedriver-2.24
), estoy intentando acceder a mi página web mediante autenticación básica con la siguiente declaración:
WebDriver driver = ...;
driver.get("http://admin:admin@localhost:8080/project/");
Pero Google Chrome me da la siguiente advertencia en la consola:
[Obsoleto] Las solicitudes de subrecursos cuyas URL contienen credenciales integradas (por ejemplo,
https://user:pass@host/
) están bloqueadas. Consulte https://www.chromestatus.com/feature/5669008342777856 para obtener más detalles.
En el enlace etiquetado se menciona que se eliminó el soporte:
Eliminación de soporte para credenciales integradas en solicitudes de subrecursos. (remoto)
Mi pregunta ahora es: ¿existe otra forma de autenticación básica desde Selenium?
NOTA : esto no ha ayudado: ¿ Cómo manejar los encabezados de autenticación básica HTTP en Selenium Webdriver usando Java?
La autenticación básica a través de URL está bloqueada solo para los subrecursos. Entonces aún puedes usarlo en el dominio:
driver.get("http://admin:admin@localhost:8080");
driver.get("http://localhost:8080/project");
También puedes crear una pequeña extensión para configurar automáticamente las credenciales cuando se soliciten:
options = webdriver.ChromeOptions()
options.add_extension(r'C:\dev\credentials.zip')
https://gist.github.com/florentbr/25246cd9337cebc07e2bbb0b9bf0de46
Hubo algunas actualizaciones en esto link
como:
Chromium Issue 435547
Eliminación de soporte para credenciales integradas en solicitudes de subrecursos. (remoto)Deberíamos bloquear las solicitudes de subrecursos que contengan credenciales integradas (por ejemplo, " http://ima_user: [email protected] /yay.tiff "). Dichos recursos se manejarían como errores de red.
Sin embargo, la funcionalidad de autenticación básica todavía funciona con Selenium 3.4.0 , geckodriver v0.18.0 , chromedriver v2.31.488763 , Google Chrome 60.x y Mozilla Firefox 53.0 a través de enlaces Selenium-Java .
Aquí está el código de ejemplo que intenta abrir la URL http://the-internet.herokuapp.com/basic_auth con un conjunto válido de credenciales y funciona.
Firefox:
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
public class BasicAuthentication_FF
{
public static void main(String[] args)
{
System.setProperty("webdriver.gecko.driver", "C:\\Utility\\BrowserDrivers\\geckodriver.exe");
WebDriver driver = new FirefoxDriver();
driver.navigate().to("http://admin:[email protected]/basic_auth");
}
}
Cromo:
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
public class BasicAuthentication_Chrome
{
public static void main(String[] args)
{
System.setProperty("webdriver.chrome.driver", "C:\\Utility\\BrowserDrivers\\chromedriver.exe");
ChromeOptions options = new ChromeOptions();
options.addArguments("start-maximized");
options.addArguments("disable-infobars");
options.addArguments("--disable-extensions");
WebDriver driver = new ChromeDriver(options);
driver.navigate().to("http://admin:[email protected]/basic_auth");
}
}
El enfoque de Florent B. de llamar a .get en la URL dos veces funcionó para mí con una ligera modificación. En JS:
driver
.get('http://admin:admin@localhost:8080')
.then( () => driver.get('http://localhost:8080') )
trabajando en Google Chrome 62.0.3202.94 con ChromeDriver 2.33.506092 y el enfoque parece compatible con Firefox 56.0.2 con geckodriver 0.19.1 y phantomjs 2.1.1, todo bajo Debian Linux 9.
Lo que creo que está sucediendo es que la primera llamada configura el encabezado de Autorización enviado por el navegador. La segunda llamada elimina las credenciales de la URL y ya no se aplican a los subrecursos. El then
sincroniza las dos solicitudes asegurando el orden.