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

Cucumber/Selenium/Java如何获取新打开标签页的URL

解决Selenium+Cucumber中验证新标签页URL的问题

你的核心问题是没有切换Selenium的窗口句柄到新打开的标签页,所以无论怎么调用getCurrentUrl(),拿到的都是原页面的URL。另外你之前的尝试里还有几个明显的错误:比如重新实例化ChromeDriver会打开全新的浏览器,用Actions按快捷键的逻辑也搞反了,这些都得调整。

先理清正确的测试流程

要验证新标签页的URL,正确步骤应该是:

  • 点击链接前,记录当前窗口的句柄(原页面的唯一标识)
  • 点击触发新标签页的链接
  • 等待新标签页加载完成,获取所有已打开的窗口句柄
  • 切换到非原页面的窗口句柄(也就是新标签页)
  • 验证该标签页的URL
  • (可选)测试完成后切换回原窗口或关闭新标签页

修改你的代码实现

1. 优化@When方法(替换硬等待,记录原窗口句柄)

首先把不稳定的硬等待换成显式等待,同时在点击前保存原窗口句柄(存在类变量里,方便@Then方法调用):

// 类级别变量,保存原窗口句柄
private String originalWindowHandle;
private WebDriver driver;

// 假设driver是通过依赖注入/初始化方法获取的,绝不要在方法里重新实例化!
public YourStepDefinitions(WebDriver driver) {
    this.driver = driver;
}

@When("^I click on the Visit\\s" + pageElements + "$")
public void iClickOnTheVisitTourismPEIButton(String element) {
    // 点击前先记录原窗口的句柄
    originalWindowHandle = driver.getWindowHandle();
    // 用显式等待确保元素可点击,替代硬等待
    WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
    wait.until(ExpectedConditions.elementToBeClickable(pageModel.pageObject(element))).click();
    // 等待新标签页打开,确保浏览器完成标签页创建
    wait.until(ExpectedConditions.numberOfWindowsToBe(2));
}

2. 修复@Then方法(切换窗口并验证URL)

现在修改@Then方法,切换到新标签页后再做URL验证:

@Then("^I am\\s*((?:not)?)\\staken to the Tourism PEI landing page URL in a new tab$")
public void iAmTakenToTheTourismPEILandingPageURLInANewTab(String isNot) {
    // 获取当前所有打开的窗口句柄
    Set<String> allWindowHandles = driver.getWindowHandles();
    String newWindowHandle = null;

    // 遍历找到非原窗口的句柄(也就是新标签页)
    for (String handle : allWindowHandles) {
        if (!handle.equals(originalWindowHandle)) {
            newWindowHandle = handle;
            break;
        }
    }

    // 切换到新标签页
    driver.switchTo().window(newWindowHandle);

    // 等待新页面URL加载完成,避免拿未加载完全的URL
    WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
    wait.until(ExpectedConditions.urlContains("tourismpei.com"));

    // 执行URL验证逻辑
    String expectedUrl = "https://www.tourismpei.com/";
    String actualUrl = driver.getCurrentUrl();

    if (isNot.isEmpty()) {
        // 反向验证:URL不匹配
        assert !actualUrl.equalsIgnoreCase(expectedUrl) : "URL matched unexpectedly: " + actualUrl;
    } else {
        // 正向验证:URL匹配
        assert actualUrl.equalsIgnoreCase(expectedUrl) : "URL did not match. Expected: " + expectedUrl + ", Actual: " + actualUrl;
    }

    // 可选操作:切换回原窗口,方便后续测试步骤
    driver.switchTo().window(originalWindowHandle);
    // 或者关闭新标签页
    // driver.close();
    // driver.switchTo().window(originalWindowHandle);
}

为什么你的之前尝试失败?

  • 第一个尝试里new ChromeDriver()会打开全新的浏览器实例,和你之前操作的浏览器完全无关,自然拿不到正确的标签页。
  • 用Actions按Ctrl+Shift+Tab是切换到前一个标签页,而你需要切换到新打开的后一个标签页,逻辑完全反了。
  • 第二个尝试直接调用getCurrentUrl(),但没有切换窗口句柄,所以必然拿到原页面的URL。

额外注意事项

  • 尽量避免用Thread.sleep(),改用显式等待(WebDriverWait),这样测试更稳定,能适配不同加载速度的场景。
  • 如果不同语言版本跳转的Tourism PEI URL有差异(比如法语版可能跳转到tourismpei.com/fr),可以在Scenario Outline的Examples里添加对应的预期URL列,或者调整验证逻辑为匹配域名即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:21:12