遇到多個 iframe 具有相同 id/name 時,driver.switchTo().frame("frmLinkPage1") 會失效。解決策略:
driver.switchTo().frame(0)(按頁面順序)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);
// 顯式等待:元素可點擊
wait.until(ExpectedConditions.elementToBeClickable(By.id("submit")));
// 顯式等待:iframe 可用並切換
wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.id("frameId")));
// 隱式等待(全局,慎用)
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
switchTo().frame(),退出時 defaultContent() 直接回頂層input[type=file].sendKeys("絕對路徑"),無需彈窗處理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);
}
}