Selenium中getCurrentUrl()方法返回错误URL问题求助
解决Selenium中getCurrentUrl()返回初始页面URL的问题
嘿,我来帮你搞定这个问题!你遇到的情况不是隐式等待没生效,而是点击"Terms of Use"链接后,页面在新窗口打开了,但你的WebDriver还停留在原来的窗口,所以调用getCurrentUrl()自然返回的还是初始页面的地址。
问题根源
你可以手动点击页面上的"Terms of Use"链接看看,这个链接应该带了target="_blank"属性,会在新浏览器窗口打开内容。而WebDriver默认只会聚焦在最初打开的窗口,不会自动切换到新窗口。
解决方案:切换到新窗口
你需要先获取所有窗口的句柄(window handles),然后切换到新打开的窗口,之后再调用getCurrentUrl()就能拿到正确的URL了。下面是修改后的代码:
package SeleniumPackage; import java.util.concurrent.TimeUnit; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.support.ui.Select; import org.openqa.selenium.support.ui.WebDriverWait; import java.util.Set; public class SeleniumClass { public static void main(String[] args) { WebDriver driver = new ChromeDriver(); driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); driver.get("https://learn.letskodeit.com/p/practice"); // 先保存初始窗口的句柄 String originalWindow = driver.getWindowHandle(); WebElement benzRadioBtn = driver.findElement(By.id("benzradio")); benzRadioBtn.click(); WebElement hondaRadioBtn = driver.findElement(By.id("hondaradio")); hondaRadioBtn.click(); WebElement bmwRadioBtn = driver.findElement(By.id("bmwradio")); bmwRadioBtn.click(); WebElement benzCheckBox = driver.findElement(By.id("benzcheck")); benzCheckBox.click(); Select dropdown = new Select (driver.findElement(By.id("carselect"))); dropdown.selectByValue("honda"); WebElement element = driver.findElement(By.id("product")); System.out.println(element.getText()); // 点击链接,打开新窗口 driver.findElement(By.linkText("Terms of Use")).click(); // 等待新窗口加载完成(显式等待更稳定) new WebDriverWait(driver, 10).until( d -> d.getWindowHandles().size() > 1 ); // 获取所有窗口句柄并切换到新窗口 Set<String> windowHandles = driver.getWindowHandles(); for (String handle : windowHandles) { if (!handle.equals(originalWindow)) { driver.switchTo().window(handle); break; } } // 现在获取的就是新窗口的URL了 String currentURL = driver.getCurrentUrl(); System.out.println(currentURL); // 如果之后需要切回原窗口,可以启用这句 // driver.switchTo().window(originalWindow); // 记得关闭驱动 driver.quit(); } }
额外说明
- 我添加了显式等待来确保新窗口完全加载后再切换,比直接遍历句柄更稳定,避免因窗口打开慢导致的空指针或切换失败问题。
- 如果你后续需要操作原窗口,可以用
driver.switchTo().window(originalWindow)切回去。
内容的提问来源于stack exchange,提问作者SlavaCa
相关产品推荐
相关产品推荐

