ในบทความนี้ เราจะเรียนรู้วิธาจัดการ Authentication Popup (Basic Auth Dialog) ใน Selenium WebDriver ด้วย Java
ปัญหา
Authentication Popup เป็น Dialog ระดับ Browser ไม่ใช่ Web Element ทำให้ Selenium หา Element ไม่ได้ และไม่สามารถใช้ switchTo().alert() ได้
วิธีแก้: ส่ง Username/Password ผ่าน URL
รูปแบบ: https://username:password@domain.com/path
ตัวอย่าง
String username = "admin";
String password = "admin";
String url = "https://" + username + ":" + password + "@the-internet.herokuapp.com/basic_auth";
driver.get(url);
โค้ดตัวอย่างสมบูรณ์
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
public class AuthPopupHandler {
public static void main(String[] args) {
// ตั้งค่า ChromeDriver path
System.setProperty("webdriver.chrome.driver", "C:\\path\\to\\chromedriver.exe");
WebDriver driver = new ChromeDriver();
String username = "admin";
String password = "admin";
// สร้าง URL พร้อม Credentials
String authUrl = "https://" + username + ":" + password + "@the-internet.herokuapp.com/basic_auth";
// เข้าไปยัง URL ที่มี Auth แล้ว
driver.get(authUrl);
// ยืนยันว่าเข้าสำเร็จโดยอ่านข้อความ
WebElement element = driver.findElement(By.cssSelector("p"));
String text = element.getText();
System.out.println("Page text after auth: " + text);
// ปิด Browser
driver.quit();
}
}
วิธีอื่นๆ (ถ้า URL Embedding ไม่ได้)
1. ใช้ AutoIT (Windows เท่านั้น)
// คอมไพล์ AutoIT script เป็น .exe แล้วเรียก
Runtime.getRuntime().exec("path/to/auth_handler.exe " + username + " " + password);
2. ใช้ Robot Class (Java AWT)
import java.awt.Robot;
import java.awt.event.KeyEvent;
import java.awt.datatransfer.StringSelection;
import java.awt.Toolkit;
Robot robot = new Robot();
StringSelection usernameSelection = new StringSelection(username);
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(usernameSelection, null);
// Ctrl+V, Tab, Ctrl+V, Enter ...
3. ใช้ Browser Profile / Extension
ตั้งค่า Chrome Profile ที่มี Auto-fill credentials หรือใช้ Extension แทรก Header Authorization
4. ใช้ Proxy Authentication (BrowserMob Proxy)
// กำหนด Proxy ที่จัดการ Auth ให้
BrowserMobProxy proxy = new BrowserMobProxyServer();
proxy.setHttpProxyAuth(username, password);
proxy.start();
ข้อจำกัดของ URL Embedding
- ไม่ทำงานบนบาง Browser ใหม่ (Chrome 59+, Firefox) เพื่อความปลอดภัย
- ไม่รองรับ Special Characters ใน password (ต้อง URL Encode)
- ไม่ปลอดภัยสำหรับ Production (Credentials อยู่ใน URL/Log)
แนวทางปฏิบัติที่ดีที่สุด (Best Practice)
- ใช้ URL Embedding สำหรับ Local/Dev Testing
- ใช้ Proxy Authentication สำหรับ CI/CD Pipeline
- หลีกเลี่ยง Hardcode Credentials ใช้ Environment Variables
- ทดสอบบน Browser/Version ที่ Target จริง