2013-10-01 19 views
14

Questo è il mio codice:Come gestire la nuova finestra in Selenium WebDriver utilizzando Java?

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

ora ho l'errore successivo:

Exception in thread "main" org.openqa.selenium.NoSuchElementException: Unable to find element with id == txtEnterCptCode (WARNING: The server did not provide any stacktrace information) Command duration or timeout: 404 milliseconds.

Tutte le idee?

risposta

33

Sembra che in realtà non si passi a una nuova finestra. Si suppone di avere l'handle di finestra della finestra originale, salvarlo, quindi ottenere l'handle di finestra della nuova finestra e passare a quello. Una volta che hai finito con la nuova finestra devi chiuderla, quindi tornare alla maniglia della finestra originale. Vedere il mio esempio riportato di seguito:

cioè

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 
+0

Ora non posso immettere i valori nella casella di testo di una nuova finestra attraverso il mio code.String parentHandle = driver.getWindowHandle(); \t \t \t driver.findElement (By.id ("ImageButton5")). Click(); per (String winHandle: driver.getWindowHandles()) { \t \t driver.switchTo(). Window (winHandle); \t \t \t \t \t \t Thread.sleep (3000); \t \t \t driver.findElement (By.id ("txtEnterCptCode")). SendKeys ("99219"); driver.findElement (By.id ("chklstAllprocedure_0")). Click(); L'errore che ho ottenuto non è stato in grado di trovare l'elemento textbox nella finestra appena aperta. Puoi aiutarmi? –

+0

@Arun Kumar: forse webDriver sta cercando di trovare l'elemento prima che la pagina sia completamente caricata? Thead.sleep non è efficace perché tutto ciò che fa è attendere alcuni secondi prima di eseguire le prossime righe di codice. Prova la classe WebDriverWait.:::: WebDriverWait wait = new WebDriverWait (driver, 1000); Elemento WebElement = wait.until (Prevected Conditions.visibilityOfElementLocated (By.id ("txtEnterCptCode"))); element.sendKeys ("99219"); – CODEBLACK

+0

WebDriverWait attenderà fino a quando l'elemento specificato non sarà visibile ... e una volta che sarà visibile continuerà a eseguire il codice ... – CODEBLACK

2

Ho un metodo di utilità per passare alla finestra desiderata come illustrato di seguito

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; 
     } 
} 

Essa vi porterà a finestra desiderata volta del titolo della finestra è passato come parametro. Nel tuo caso puoi farlo.

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

e poi di nuovo passare alla finestra padre utilizzando lo stesso metodo

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

Questo metodo funziona in modo efficace quando si tratta di finestre multiple.

+0

Non ha senso restituire l'istanza 'WebDriver' perché è la stessa che si sta già utilizzando. – JeffC

0

Ho un programma di esempio per questo:

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(); 

} 

}

+1

Perché i lunghi dormono? Questa è una pessima pratica. –

+0

Questo è solo un esempio. –

1
   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); 
        } 
       } 
-1
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); 
0

stavo avendo alcuni problemi con windowhandle e ho provato questo. questo funziona bene per me.

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); 
Problemi correlati