如何使用Java处理Selenium WebDriver中的新窗口?

这是我的代码:

driver.findElement(By.id("ImageButton5")).click(); //Thread.sleep(3000); String winHandleBefore = driver.getWindowHandle(); driver.switchTo().window(winHandleBefore); driver.findElement(By.id("txtEnterCptCode")).sendKeys("99219"); 

现在我有下一个错误:

线程“main”中的exceptionorg.openqa.selenium.NoSuchElementException:无法找到id == txtEnterCptCode的元素(警告:服务器未提供任何堆栈跟踪信息)命令持续时间或超时:404毫秒。

有任何想法吗?

看起来你实际上没有切换到任何新窗口。 您应该获取原始窗口的窗口句柄,保存它,然后获取新窗口的窗口句柄并切换到该窗口。 完成新窗口后,需要将其关闭,然后切换回原始窗口句柄。 请参阅下面的示例:

 String parentHandle = driver.getWindowHandle(); // get the current window handle driver.findElement(By.xpath("//*[@id='someXpath']")).click(); // click some link that opens a new window for (String winHandle : driver.getWindowHandles()) { driver.switchTo().window(winHandle); // switch focus of WebDriver to the next found window handle (that's your newly opened window) } //code to do something on new window driver.close(); // close newly opened window when done with it driver.switchTo().window(parentHandle); // switch back to the original window 

我有一个实用工具方法切换到所需的窗口,如下所示

 public class Utility { public static WebDriver getHandleToWindow(String title){ //parentWindowHandle = WebDriverInitialize.getDriver().getWindowHandle(); // save the current window handle. WebDriver popup = null; Set windowIterator = WebDriverInitialize.getDriver().getWindowHandles(); System.err.println("No of windows : " + windowIterator.size()); for (String s : windowIterator) { String windowHandle = s; popup = WebDriverInitialize.getDriver().switchTo().window(windowHandle); System.out.println("Window Title : " + popup.getTitle()); System.out.println("Window Url : " + popup.getCurrentUrl()); if (popup.getTitle().equals(title) ){ System.out.println("Selected Window Title : " + popup.getTitle()); return popup; } } System.out.println("Window Title :" + popup.getTitle()); System.out.println(); return popup; } } 

一旦窗口的标题作为参数传递,它将带您到所需的窗口。 在你的情况下你可以做到。

 Webdriver childDriver = Utility.getHandleToWindow("titleOfChildWindow"); 

然后再次使用相同的方法切换到父窗口

Webdriver parentDriver = Utility.getHandleToWindow("titleOfParentWindow");

处理多个窗口时,此方法有效。

我有一个示例程序:

public class BrowserBackForward {

 /** * @param args * @throws InterruptedException */ public static void main(String[] args) throws InterruptedException { WebDriver driver = new FirefoxDriver(); driver.get("http://seleniumhq.org/"); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); //maximize the window driver.manage().window().maximize(); driver.findElement(By.linkText("Documentation")).click(); System.out.println(driver.getCurrentUrl()); driver.navigate().back(); System.out.println(driver.getCurrentUrl()); Thread.sleep(30000); driver.navigate().forward(); System.out.println("Forward"); Thread.sleep(30000); driver.navigate().refresh(); } 

}

  string BaseWindow = driver.CurrentWindowHandle; ReadOnlyCollection handles = driver.WindowHandles; foreach (string handle in handles) { if (handle != BaseWindow) { string title = driver.SwitchTo().Window(handle).Title; Thread.Sleep(3000); driver.SwitchTo().Window(handle).Title.Equals(title); Thread.Sleep(3000); } } 

我在使用windowhandle时遇到了一些问题并尝试了这个问题。 这个对我有好处。

 String parentWindowHandler = driver.getWindowHandle(); String subWindowHandler = null; Set handles = driver.getWindowHandles(); Iterator iterator = handles.iterator(); while (iterator.hasNext()){ subWindowHandler = iterator.next(); driver.switchTo().window(subWindowHandler); System.out.println(subWindowHandler); } driver.switchTo().window(parentWindowHandler); 
 Set windows = driver.getWindowHandles(); Iterator itr = windows.iterator(); //patName will provide you parent window String patName = itr.next(); //chldName will provide you child window String chldName = itr.next(); //Switch to child window driver.switchto().window(chldName); //Do normal selenium code for performing action in child window //To come back to parent window driver.switchto().window(patName);