You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Selenium/Java切换至登录后弹出的新应用窗口?

Great question! Switching between browser windows after a login is a super common task in UI automation, and it’s totally manageable once you get the hang of window handles. Let’s walk through how to do this with the most popular automation frameworks:

Selenium (Python & Java Examples)

Selenium uses window handles—unique identifiers for each open browser window—to switch contexts. Here’s how to implement it:

Python Implementation

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# Initialize your driver (Chrome in this case)
driver = webdriver.Chrome()

# Perform your login steps
driver.get("your_login_page_url")
driver.find_element("id", "username").send_keys("your_username")
driver.find_element("id", "password").send_keys("your_password")
driver.find_element("id", "login_btn").click()

# Wait for the new window to open (wait until there are 2 total windows)
WebDriverWait(driver, 10).until(EC.number_of_windows_to_be(2))

# Get all open window handles
all_handles = driver.window_handles

# Switch to the new window (the second handle in the list)
driver.switch_to.window(all_handles[1])

# Now you can run all your test steps in the new window!
print("Current window title:", driver.title)

Java Implementation

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.By;
import java.util.Set;

public class WindowSwitchDemo {
    public static void main(String[] args) {
        WebDriver driver = new ChromeDriver();
        
        // Execute login flow
        driver.get("your_login_page_url");
        driver.findElement(By.id("username")).sendKeys("your_username");
        driver.findElement(By.id("password")).sendKeys("your_password");
        driver.findElement(By.id("login_btn")).click();
        
        // Wait for new window to load
        new WebDriverWait(driver, 10).until(ExpectedConditions.numberOfWindowsToBe(2));
        
        // Capture all window handles
        Set<String> windowHandles = driver.getWindowHandles();
        String loginWindowHandle = driver.getWindowHandle();
        
        // Switch to the non-login window
        for (String handle : windowHandles) {
            if (!handle.equals(loginWindowHandle)) {
                driver.switchTo().window(handle);
                break;
            }
        }
        
        // Proceed with tests in the new window
        System.out.println("Current window title: " + driver.getTitle());
    }
}

Pro Tip for Selenium

If you’re unsure which handle corresponds to the new window (e.g., if multiple windows might be open), you can validate by checking the window’s title or URL after switching:

# After switching, verify you're in the right window
WebDriverWait(driver, 10).until(EC.title_contains("Expected New Window Title"))
Cypress Example

Cypress handles browser contexts a bit differently (it defaults to a single tab), but you can still capture and interact with new windows:

Method 1: Stub window.open

// Perform login
cy.visit('your_login_page_url')
cy.get('#username').type('your_username')
cy.get('#password').type('your_password')

// Stub the window.open method to capture the new window's URL
cy.window().then((win) => {
  const originalOpen = win.open
  cy.stub(win, 'open').callsFake((newWindowUrl) => {
    // Navigate directly to the new window's URL in Cypress context
    cy.visit(newWindowUrl)
    return originalOpen.call(win, newWindowUrl)
  })
})

// Trigger login which opens the new window
cy.get('#login_btn').click()

// Now all commands will run against the new window's page
cy.get('#element_in_new_window').should('be.visible')

Method 2: Switch Tabs (Cypress 12+)

If you’re using a newer version of Cypress that supports multi-tab handling:

cy.get('#login_btn').click()

// Wait for the new tab to open, then switch to it
cy.wait(1000) // Replace with a more reliable wait if needed
cy.get('@tabs').then((tabs) => {
  cy.switchToTab(tabs[1])
})

// Continue testing in the new tab
cy.title().should('eq', 'Expected New Window Title')

内容的提问来源于stack exchange,提问作者Bob Bolden

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 08:37:37