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

如何使用Java处理SeleniumWebDriver中的新窗口?,java,selenium-webdriver,new-window,Java,Selenium Webdriver,New Window,这是我的代码: driver.findElement(By.id("ImageButton5")).click(); //Thread.sleep(3000); String winHandleBefore = driver.getWindowHandle(); driver.switchTo().window(winHandleBefore); driver.findElement(By.id("txtEnterCptCode")).sendKeys("99219"); 现在我有下一个错误:

这是我的代码:

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”org.openqa.selenium.NoSuchElementException中的异常: 找不到id==txtEnterCptCode的元素(警告:服务器 未提供任何stacktrace信息) 命令持续时间或超时:404毫秒


有什么想法吗?

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

public class Utility 
{
    public static WebDriver getHandleToWindow(String title){

        //parentWindowHandle = WebDriverInitialize.getDriver().getWindowHandle(); // save the current window handle.
        WebDriver popup = null;
        Set<String> 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 parentDriver=Utility.getHandleToWindow(“titleOfParentWindow”)


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

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

i、 e


我有一个示例程序:

公共类浏览转发{

/**
 * @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句柄=driver.WindowHandles;
foreach(句柄中的字符串句柄)
{
if(句柄!=BaseWindow)
{
字符串title=driver.SwitchTo().Window(handle.title);
睡眠(3000);
driver.SwitchTo().Window(句柄).Title.Equals(标题);
睡眠(3000);
}
}
设置windows=driver.getWindowHandles();
迭代器itr=windows.Iterator();
//patName将为您提供父窗口
字符串patName=itr.next();
//chldName将为您提供子窗口
字符串chldName=itr.next();
//切换到子窗口
driver.switchto()窗口(chldName);
//执行常规selenium代码以在子窗口中执行操作
//返回父窗口
driver.switchto().window(patName);

我在windowhandle上遇到一些问题,于是尝试了这个。这个对我有好处

String parentWindowHandler = driver.getWindowHandle(); 
String subWindowHandler = null;

Set<String> handles = driver.getWindowHandles();
Iterator<String> iterator = handles.iterator();
while (iterator.hasNext()){
    subWindowHandler = iterator.next();
    driver.switchTo().window(subWindowHandler);

    System.out.println(subWindowHandler);
}


driver.switchTo().window(parentWindowHandler); 
String parentWindowHandler=driver.getWindowHandle();
字符串子窗口处理程序=null;
Set handles=driver.getWindowHandles();
迭代器迭代器=handles.Iterator();
while(iterator.hasNext()){
subWindowHandler=iterator.next();
driver.switchTo().window(子WindowHandler);
System.out.println(子窗口处理程序);
}
driver.switchTo().window(parentWindowHandler);

现在我无法通过我的代码在新窗口的文本框中输入值。字符串parentHandle=driver.getWindowHandle();driver.findElement(By.id(“ImageButton5”))。单击();对于(字符串winHandle:driver.getWindowHandles()){driver.switchTo().window(winHandle);Thread.sleep(3000);driver.findElement(By.id(“txtEnterCptCode”))。sendKeys(“99219”);driver.findElement(By.id(“chklstAllprocedure_0”)。单击();我遇到的错误是在新打开的窗口中找不到textbox元素。您能帮我解决这个问题吗?@Arun Kumar:也许webDriver正在试图在页面完全加载之前找到该元素?ad.sleep无效,因为它所做的只是在运行下一行代码之前等待几秒钟。请尝试WebDriverWait类。::WebDriverWait wait=new WebDriverWait(driver,1000);WebElement element=wait.until(预期条件。元素的可视性已定位(By.id(“txtEnterCptCode”));element.sendKeys(“99219”);WebDriverWait将等待,直到您指定的元素可见…并且一旦它可见,它将继续运行您的代码…注意,我的wait.until部分代码中有一个输入错误。“预期条件”中应该没有空格。它应该是“预期条件”为什么要长时间睡眠?这是一个很糟糕的练习。这只是一个例子。返回
WebDriver
实例没有意义,因为它与您已经使用的实例相同。
/**
 * @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<string> 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);
                    }
                }
Set<String> windows = driver.getWindowHandles();
Iterator<String> 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);
String parentWindowHandler = driver.getWindowHandle(); 
String subWindowHandler = null;

Set<String> handles = driver.getWindowHandles();
Iterator<String> iterator = handles.iterator();
while (iterator.hasNext()){
    subWindowHandler = iterator.next();
    driver.switchTo().window(subWindowHandler);

    System.out.println(subWindowHandler);
}


driver.switchTo().window(parentWindowHandler);