2013-10-01 15 views
14

Dies ist:Wie behandelt man das neue Fenster in Selenium WebDriver mit Java? mein Code

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

Jetzt habe ich den nächsten Fehler:

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.

Irgendwelche Ideen?

Antwort

33

Es sieht so aus, als ob Sie nicht wirklich zu einem neuen Fenster wechseln. Sie sollten das Fenster-Handle Ihres ursprünglichen Fensters erhalten, das speichern, dann das Fenster-Handle des neuen Fensters holen und zu diesem wechseln. Sobald Sie mit dem neuen Fenster fertig sind, müssen Sie es schließen und dann zum ursprünglichen Fenstergriff zurückkehren. Sehen Sie meine Probe unter:

heißt

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

Jetzt kann ich die Werte in das Textfeld des neuen Fensters nicht über meinen Code eingeben.String parentHandle = driver.getWindowHandle(); \t \t \t driver.findElement (By.id ("ImageButton5")). Click(); für (String winHandle: driver.getWindowHandles()) { \t \t driver.switchTo(). Window (winHandle); \t \t \t \t \t \t Gewinde.Schlaf (3000); \t \t \t driver.findElement (By.id ("txtEnterCptCode")). SendKeys ("99219"); driver.findElement (By.id ("chklstAllprocedure_0")). Click(); Der Fehler, den ich bekam, ist, das Textboxelement im neu geöffneten Fenster nicht zu finden. Kannst du mir dabei helfen? –

+0

@Arun Kumar: Vielleicht versucht WebDriver, das Element zu finden, bevor die Seite vollständig geladen ist? Thead.sleep ist nicht effektiv, da es nur einige Sekunden wartet, bevor die nächsten Codezeilen ausgeführt werden. Versuchen Sie die WebDriverWait-Klasse.:::: WebDriverWait wait = neuer WebDriverWait (Treiber, 1000); WebElement-Element = wait.until (Erwartete Bedingungen.visibilityOfElementLocated (By.id ("txtEnterCptCode"))); element.sendKeys ("99219"); – CODEBLACK

+0

WebDriverWait wird warten, bis das angegebene Element sichtbar ist ... und sobald es sichtbar wird, wird es weiterhin den Code ausführen ... – CODEBLACK

2

Ich habe eine Hilfsmethode auf die gewünschten Fenster zu wechseln, wie unten

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

Es Ihnen gewünschte Fenster nimmt gezeigt einmal Titel des Fensters als Parameter übergeben wird. In Ihrem Fall können Sie tun.

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

und wechseln Sie dann wieder zu übergeordneten Fenstern mit der gleichen Methode

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

Diese Methode effektiv funktioniert, wenn mit mehreren Fenstern zu tun.

+0

Es hat keinen Sinn, die 'WebDriver'-Instanz zurückzugeben, da sie dieselbe ist, die Sie bereits verwenden. – JeffC

0

Ich habe ein Beispielprogramm für diese:

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

Warum die lange schläft? Das ist wirklich eine schlechte Übung. –

+0

Das ist nur ein Beispiel. –

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

Ich hatte einige Probleme mit dem Fenstergriff und versuchte dies. das funktioniert gut für mich.

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