2013-10-01 65 views
3

我正在使用Selenium Automation。在此,当我单击当前窗口中的链接时,会打开一个新窗口。我只想将控件切换到新窗口。但我不能这样做。 其实新窗口是一个自动生成的窗口。也就是说,链接将会动态生成。帮我的朋友...如何在浏览器中使用Selenium java切换两个窗口

回答

1

在从GitHub上一个getting started with selenium webdriver项目的摘录,

/** 
    * Waits for a window to appear, then switches to it. 
    * @param regex Regex enabled. Url of the window, or title. 
    * @return 
    */ 
    public AutomationTest waitForWindow(String regex) { 
     Set<String> windows = driver.getWindowHandles(); 

     for (String window : windows) { 
      try { 
       driver.switchTo().window(window); 

       p = Pattern.compile(regex); 
       m = p.matcher(driver.getCurrentUrl()); 

       if (m.find()) { 
        attempts = 0; 
        return switchToWindow(regex); 
       } 
       else { 
        // try for title 
        m = p.matcher(driver.getTitle()); 

        if (m.find()) { 
         attempts = 0; 
         return switchToWindow(regex); 
        } 
       } 
      } catch(NoSuchWindowException e) { 
       if (attempts <= MAX_ATTEMPTS) { 
        attempts++; 

        try {Thread.sleep(1);}catch(Exception x) { x.printStackTrace(); } 

        return waitForWindow(regex); 
       } else { 
        fail("Window with url|title: " + regex + " did not appear after " + MAX_ATTEMPTS + " tries. Exiting."); 
       } 
      } 
     } 

     // when we reach this point, that means no window exists with that title.. 
     if (attempts == MAX_ATTEMPTS) { 
      fail("Window with title: " + regex + " did not appear after 5 tries. Exiting."); 
      return this; 
     } else { 
      System.out.println("#waitForWindow() : Window doesn't exist yet. [" + regex + "] Trying again. " + attempts + "/" + MAX_ATTEMPTS); 
      attempts++; 
      return waitForWindow(regex); 
     } 
    } 

    /** 
    * Switch's to a window that is already in existance. 
    * @param regex Regex enabled. Url of the window, or title. 
    * @return 
    */ 
    public AutomationTest switchToWindow(String regex) { 
     Set<String> windows = driver.getWindowHandles(); 

     for (String window : windows) { 
      driver.switchTo().window(window); 
      System.out.println(String.format("#switchToWindow() : title=%s ; url=%s", 
        driver.getTitle(), 
        driver.getCurrentUrl())); 

      p = Pattern.compile(regex); 
      m = p.matcher(driver.getTitle()); 

      if (m.find()) return this; 
      else { 
       m = p.matcher(driver.getCurrentUrl()); 
       if (m.find()) return this; 
      } 
     } 

     fail("Could not switch to window with title/url: " + regex); 
     return this; 
    } 

这些是2个自定义功能,以帮助您开始。或者你可以从github上看看这个项目,让你的硒项目设计得更好,更容易。

这些函数可以切换到或等待(如果它不存在)具有特定标题/ URL的窗口。

+0

它不工作,先生。 – Prasanna

+0

确保您将“AutomationTest”变量更改为“void”。这种方法已被证明并且有效。它在你身边,它不工作。如果你想要一个工作副本,然后下载[这是从这个项目](https://github.com/ddavison/getting-started-with-selenium/archive/master.zip),并将其导入到Eclipse到看到。 – sircapsalot

+0

好的,先生。谢谢..! – Prasanna

2

是的,这是可能的。首先,您需要将参考保存到当前窗口。

String parentWindow= driver.getWindowHandle(); 

点击链接后,您需要切换到其他窗口。

List<String> allWindows = driver.getWindowHandles(); 
for(String curWindow : allWindows){ 
    driver.switchTo().window(curWindow); 
} 

这是你的新窗口进行操作,最后用

driver.close(); 

将其关闭,并切换回父窗口

driver.switchTo().window(parentWindow); 
+0

它不工作。 – Prasanna

+0

哪部分不工作。显示您的一些代码将帮助我们更好地帮助您。切换到新窗口句柄后,将在该窗口上执行所有操作。它应该工作。 – SpartanElite

+0

我记得在IRC中有#selenium这个问题。有人指出了什么是尝试尝试。我编辑了代码,以便清楚地说明,但是您必须确保在循环显示窗口句柄的同时,您并不真正切换到当前窗口。 – aimbire

3

我终于找到了答案, 我用下面的方法切换到新窗口,

public String switchwindow(String object, String data){ 
     try { 

     String winHandleBefore = driver.getWindowHandle(); 

     for(String winHandle : driver.getWindowHandles()){ 
      driver.switchTo().window(winHandle); 
     } 
     }catch(Exception e){ 
     return Constants.KEYWORD_FAIL+ "Unable to Switch Window" + e.getMessage(); 
     } 
     return Constants.KEYWORD_PASS; 
     } 

要移动到父窗口,我用下面的代码,

public String switchwindowback(String object, String data){ 
      try { 
       String winHandleBefore = driver.getWindowHandle(); 
       driver.close(); 
       //Switch back to original browser (first window) 
       driver.switchTo().window(winHandleBefore); 
       //continue with original browser (first window) 
      }catch(Exception e){ 
      return Constants.KEYWORD_FAIL+ "Unable to Switch to main window" + e.getMessage(); 
      } 
      return Constants.KEYWORD_PASS; 
      } 
+0

看看这段代码先生。它运作良好.. !!! – Prasanna

+0

如果不是当前窗口,我建议只切换到窗口。即:比较withHandleBefore和withHandle。否则,你会不必要地切换所有的窗口。 – ndtreviv

1
To switch between windows we have method. driver.switchTo().window("window name")To get the different windows handle, we have method.<b>driver.getWindowHandles() 
    Example: 

    File file = new File("G:\\Selenium\\All_Jars\\chromedriver.exe"); 
    System.setProperty("webdriver.chrome.driver",file.getAbsolutePath()); 
    driver = new ChromeDriver(); 

    //Maximize the window 
    driver.manage().window().maximize(); 

    driver.get("http://www.rediff.com/"); 

    //Get all window handles 
    Set<String> allHandles = driver.getWindowHandles(); 

    //count the handles Here count is=2 
    System.out.println("Count of windows:"+allHandles.size());  

    //Get current handle or default handle 
    String currentWindowHandle = allHandles.iterator().next(); 
    System.out.println("currentWindow Handle"+currentWindowHandle); 

    //Remove first/default Handle 
    allHandles.remove(allHandles.iterator().next()); 

    //get the last Window Handle 
    String lastHandle = allHandles.iterator().next(); 
    System.out.println("last window handle"+lastHandle); 

    //switch to second/last window, because we know there are only two windows 1-parent window 2-other window(ad window) 
driver.switchTo().window(lastHandle); 
    System.out.println(driver.getTitle()); 
    driver.findElement(By.tagName("body")).click(); 
0
 Set <String> set = driver.getWindowHandles(); 
     Iterator<String> it = set.iterator(); 
     String parentWindowId = it.next(); 
     String childWindowId = it.next(); 
     System.out.println(set); 
     driver.switchTo().window(childWindowId); 
0
// fetch all windows before clicking on new window link. 
    Set<String> windowHandles = driver.getWindowHandles(); 
    // Click on link to open new window 
    driver.findElement(By.tagName("a")).click(); // link to open new window 

    Set<String> updatedWindowHandles = driver.getWindowHandles(); 
    updatedWindowHandles.removeAll(windowHandles); 
    for (String window: updatedWindowHandles) { 
     driver.switchTo().window(window); 
    } 
0
//to get the current/parent window 

String parentWindowContact = driver.getWindowHandle(); 

//to switch to the new window from current/parent window 

Set<String> handleswindow =driver.getWindowHandles(); 

for(String windowHandle : handleswindow) 

{ 

    driver .switch To().window(windowHandle); 

} 

//to close the new window 

driver.close(); 

//to switch back to the parent window 

driver.switchTo().window(parentWindowContact); 
      o switch back to the parent window 

driver.switchTo().window(parentWindowContact); 
相关问题