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
相关产品推荐
相关产品推荐

