簡體   English   中英

如何使用 Java 處理 Selenium WebDriver 的身份驗證彈出窗口

[英]How to handle authentication popup with Selenium WebDriver using Java

我正在嘗試使用以下代碼處理身份驗證彈出窗口:

FirefoxProfile profile = new FirefoxProfile();
profile.setPreference("network.http.phishy-userpass-length", 255);
profile.setPreference("network.automatic-ntlm-auth.trusted-uris", "x.x.x.x");
driver = new FirefoxDriver(profile);
baseUrl="http://" + login + ":" + password + "@" + url;
driver.get(baseUrl + "/");

當我執行測試時,頁面會顯示身份驗證彈出窗口,並且在我單擊取消按鈕之前仍在加載。 那一刻,我可以進入下一頁,這意味着身份驗證成功但仍然總是顯示身份驗證彈出窗口

警報方法authenticateUsing()允許您跳過Http Basic Authentication框。

WebDriverWait wait = new WebDriverWait(driver, 10);      
Alert alert = wait.until(ExpectedConditions.alertIsPresent());     
alert.authenticateUsing(new UserAndPassword(username, password));

Selenium 3.4 開始,它仍處於測試階段

現在只為InternetExplorerDriver

不要使用 Firefox 配置文件並嘗試以下代碼:

driver.get("http://UserName:Password@Example.com");

如果你在 IE 瀏覽器中實現它,你需要做一些事情。

如果您的身份驗證服務器需要像“domainuser”這樣的域的用戶名,您需要在 url 中添加雙斜杠/

//localdomain\user:password@example.com

嘗試以下解決方案,如有任何問題,請告訴我:

driver.get('https://example.com/')
driver.switchTo().alert().sendKeys("username" + Keys.TAB + "password");
driver.switchTo().alert().accept();

這對我來說很好用

我在申請中多次遇到這個問題。

我們通常可以使用以下 2 種方法來處理此問題。

  1. 在 url 本身中傳遞用戶名和密碼

  2. 您可以在打開 url 之前創建一個 AutoIT 腳本並調用腳本。

請查看下面我提到的兩種方式的文章:
在 Selenium Webdriver 中處理身份驗證/登錄窗口

這應該適用於使用AutoAuth 插件的Firefox:

FirefoxProfile firefoxProfile = new ProfilesIni().getProfile("default");
File ffPluginAutoAuth = new File("D:\\autoauth-2.1-fx+fn.xpi");
firefoxProfile.addExtension(ffPluginAutoAuth);
driver = new FirefoxDriver(firefoxProfile);

流行的解決方案是在 URL 中附加用戶名和密碼,例如http://username:password@website.com 但是,如果您的用戶名或密碼包含特殊字符,則可能會失敗。 因此,在創建 URL 時,請確保對這些特殊字符進行編碼。

String username = URLEncoder.encode(user, StandardCharsets.UTF_8.toString());
String password = URLEncoder.encode(pass, StandardCharsets.UTF_8.toString());
String url = “http://“ + username + “:” + password + “@website.com”;
driver.get(url);

如果您必須處理 NTLM 代理身份驗證,一個不錯的選擇是使用CNTLM配置本地代理。

憑據和域在/etc/cntlm.conf中配置。

之后,您可以使用自己的代理來處理所有 NTLM 內容。

DesiredCapabilities capabilities = DesiredCapabilities.chrome();

Proxy proxy = new Proxy();
proxy.setHttpProxy("localhost:3128");
capabilities.setCapability(CapabilityType.PROXY, proxy);

driver = new ChromeDriver(capabilities);

Selenium 4支持使用 Basic 和 Digest auth 進行身份驗證。 它使用 CDP,目前僅支持基於鉻的瀏覽器

Java示例:

Webdriver driver = new ChromeDriver();

((HasAuthentication) driver).register(UsernameAndPassword.of("username", "pass"));

driver.get("http://sitewithauth");

注意:在 Alpha-7 中存在一個錯誤,它會同時發送用戶名/密碼的用戶名。 需要等待 selenium 版本的下一個版本,因為主干中有修復https://github.com/SeleniumHQ/selenium/commit/4917444886ba16a033a81a2a9676c9267c472894

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM