Authentication Popup (Basic Auth Dialog) ไม่ใช่ JavaScript alert ปกติ จึงไม่สามารถจัดการด้วย Alert interface ได้ วิธีที่ง่ายที่สุดคือ **ฝัง credentials ลงใน URL**
Syntax
https://username:password@domain.com/path // ตัวอย่าง https://admin:admin@the-internet.herokuapp.com/basic_auth
ตัวอย่างโค้ดสมบูรณ์
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class BasicAuthExample {
public static void main(String[] args) {
System.setProperty("webdriver.chrome.driver",
"C:\\Users\\ghs6kor\\Desktop\\Java\\chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.manage().window().maximize();
try {
String username = "admin";
String password = "admin";
String url = "https://" + username + ":" + password + "@the-internet.herokuapp.com/basic_auth";
driver.get(url);
// ตรวจสอบว่า login สำเร็จ
String successText = driver.findElement(By.cssSelector("p")).getText();
System.out.println("Page text: " + successText);
// ควรแสดง: "Congratulations! You must have the proper credentials."
} finally {
driver.quit();
}
}
}
⚠️ ข้อจำกัดและข้อควรระวัง
| ปัญหา | คำอธิบาย |
|---|---|
| URL เปิดเผย password | Password มองเห็นได้ใน URL bar และ history |
| ไม่ทำงานบบางบราวเซอร์/เวอร์ชัน | Chrome/Firefox บางเวอร์ชันบล็อกการส่ง credentials ใน URL |
| Special characters | ต้อง URL-encode ถ้ามี @ : / ฯลฯ ใน password |
| ไม่ใช่การ test UI จริง | ข้าม dialog ไปเลย ไม่ได้ test การโต้ตอบของ user |
วิธีทางเลือก: ใช้ AutoIT / Robot Class (Windows)
import java.awt.Robot;
import java.awt.event.KeyEvent;
import java.awt.datatransfer.StringSelection;
import java.awt.Toolkit;
// ... หลังจาก driver.get(url) แล้ว popup ปรากฏ ...
Robot robot = new Robot();
robot.delay(1000);
// กด Tab ไป username field
robot.keyPress(KeyEvent.VK_TAB);
robot.keyRelease(KeyEvent.VK_TAB);
// พิมพ์ username
StringSelection username = new StringSelection("admin");
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(username, null);
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_V);
robot.keyRelease(KeyEvent.VK_V);
robot.keyRelease(KeyEvent.VK_CONTROL);
// กด Tab ไป password
robot.keyPress(KeyEvent.VK_TAB);
robot.keyRelease(KeyEvent.VK_TAB);
// พิมพ์ password
StringSelection pwd = new StringSelection("admin");
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(pwd, null);
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_V);
robot.keyRelease(KeyEvent.VK_V);
robot.keyRelease(KeyEvent.VK_CONTROL);
// กด Enter
robot.keyPress(KeyEvent.VK_ENTER);
robot.keyRelease(KeyEvent.VK_ENTER);
วิธีทางเลือก: ใช้ Browser Extension / Proxy
- BrowserMob Proxy - สามารถ inject auth header ได้
- Chrome Extension - สร้าง extension ที่ handle auth 自動
- Selenium 4 CDP (Chrome DevTools Protocol) - ใช้
Network.setExtraHTTPHeaders
ตัวอย่าง Selenium 4 CDP (แนะนำสำหรับ production)
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.devtools.DevTools;
import org.openqa.selenium.devtools.v112.network.Network;
import java.util.Base64;
import java.util.Map;
ChromeDriver driver = new ChromeDriver();
DevTools devTools = driver.getDevTools();
devTools.createSession();
String credentials = "admin:admin";
String encoded = Base64.getEncoder().encodeToString(credentials.getBytes());
devTools.send(Network.enable(Optional.empty(), Optional.empty(), Optional.empty()));
devTools.send(Network.setExtraHTTPHeaders(Map.of("Authorization", "Basic " + encoded)));
driver.get("https://the-internet.herokuapp.com/basic_auth");
สรุป
- Simple cases: ใช้ URL embedding (ง่ายที่สุด)
- CI/CD / Security: ใช้ CDP หรือ Proxy (ไม่เปิดเผย password ใน URL)
- Legacy/Windows only: ใช้ Robot/AutoIT