首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Selenium 實戰筆記:iframe 處理、多窗口切換與動態元素定位技巧

     編輯:Java 綜合教學

iframe 切換陷阱與解決方案

遇到多個 iframe 具有相同 id/name 時,driver.switchTo().frame("frmLinkPage1") 會失效。解決策略:

  • 索引定位:driver.switchTo().frame(0)(按頁面順序)
  • WebElement 定位:先定位到 iframe 元素再切換
  • 退出 iframe:driver.switchTo().defaultContent() 返回主文檔
// 推薦:WebElement 方式最穩健
WebElement iframe = driver.findElement(By.cssSelector("iframe[src*='targetPage']"));
driver.switchTo().frame(iframe);
// ... 操作 iframe 內元素
driver.switchTo().defaultContent(); // 返回主頁面

多窗口/標籤頁切換完整模式

點擊按鈕打開新窗口 → 操作新窗口 → 關閉返回主窗口:

// 1. 保存主窗口句柄
String mainWindow = driver.getWindowHandle();

// 2. 觸發打開新窗口的操作
driver.findElement(By.id("openBtn")).click();

// 3. 等待新窗口出現並切換
WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.numberOfWindowsToBe(2));

Set<String> handles = driver.getWindowHandles();
String newWindow = handles.stream()
    .filter(h -> !h.equals(mainWindow))
    .findFirst()
    .orElseThrow(() -> new IllegalStateException("新窗口未找到"));

driver.switchTo().window(newWindow);

// 4. 在新窗口進行業務操作
// ...

// 5. 關閉新窗口並切回主窗口
driver.close(); // 關閉當前窗口
driver.switchTo().window(mainWindow);

進階技巧:動態等待替代 Thread.sleep

// 顯式等待:元素可點擊
wait.until(ExpectedConditions.elementToBeClickable(By.id("submit")));

// 顯式等待:iframe 可用並切換
wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.id("frameId")));

// 隱式等待(全局,慎用)
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

常見坑點避雷指南

  • StaleElementReferenceException:頁面刷新/重渲染導致元素引用失效,需重新定位
  • iframe 嵌套:需逐層 switchTo().frame(),退出時 defaultContent() 直接回頂層
  • Shadow DOM:需使用 JavaScript 穿透 Shadow Root 定位內部元素
  • 文件上傳:input[type=file].sendKeys("絕對路徑"),無需彈窗處理

Page Object Model (POM) 設計建議

public class LoginPage {
    private WebDriver driver;
    @FindBy(id = "username") WebElement usernameInput;
    @FindBy(id = "password") WebElement passwordInput;
    @FindBy(id = "loginBtn") WebElement loginBtn;

    public LoginPage(WebDriver driver) { this.driver = driver; PageFactory.initElements(driver, this); }

    public HomePage login(String user, String pwd) {
        usernameInput.sendKeys(user);
        passwordInput.sendKeys(pwd);
        loginBtn.click();
        return new HomePage(driver);
    }
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved