Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

จัดการ Authentication Popup ด้วย Selenium WebDriver ใน Java

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 เปิดเผย passwordPassword มองเห็นได้ใน 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