2012-06-28 13 views
5

Hier kommt 2 Windows während des Tests Pop-out.selen webdriver window handles C# switchTo fehlgeschlagen

mein Code:

string BaseWindow = driver.CurrentWindowHandle;     
ReadOnlyCollection<string> handles = driver.WindowHandles; 

foreach(string handle in handles)      
{       
Boolean a=driver.SwitchTo().Window(handle).Url.Contains("Main"); 
if (a == true) 
{  
InitialSetting.driver.SwitchTo().Window(handle);  
break; 
} 
}     

ich zum Fenster wechseln möchten, die URL enthält "Main". Aber wenn der Test läuft, wechselt er ständig zwischen zwei Fenstern und hört nicht auf.

Ich debugge und fand die foreach nicht brechen, auch wenn die boolean a wahr ist.

Wie kann ich das beheben?

+0

Was passiert, wenn Sie nur durchbrechen, ohne SwitchTo() ein zweites Mal, da Sie bereits eingeschaltet haben, wenn die Booleschen zuweisen. – VolkerK

Antwort

11
//switch to new window 
driver.FindElement(By.Id("link")).Click(); 

//wait for new window to open 
Thread.Sleep(2000); 

//get the current window handles 
string popupHandle = string.Empty; 
ReadOnlyCollection<string> windowHandles = driver.WindowHandles; 

foreach (string handle in windowHandles) 
{ 
    if (handle != existingWindowHandle) 
    { 
     popupHandle = handle; break; 
    } 
} 

//switch to new window 
driver.SwitchTo().Window(popupHandle); 

//check for element on new page 
webElement = driver.FindElement(By.Id("four04msg")); 
if(webElement.Text == "THE CONTENT YOU REQUESTED COULDN’T BE FOUND...") 
{ 
    return false; 
} 
else 
{ 
    return true; 
} 

//close the new window to navigate to the previous one 
driver.close(); 

//switch back to original window 
driver.SwitchTo().Window(existingWindowHandle); 
+1

Wie bekommen Sie den 'bestehendenWindowHandle'? –

+0

existingWindowHandle = driver.CurrentWindowHandle; –

+0

@Michael Ayers Wie kann ich Griff zum aktuellen Fenster (vorhandenes Fenster, das manuell geöffnet wird), die nicht vom Treiber geöffnet wird, bedeutet, dass ich driver.getWindowHandle() nicht verwenden kann; –

3
  1. Code, um den ursprünglichen Beitrag verwenden.

    string existingWindowHandle = driver.CurrentWindowHandle;

    Es ist das erste Fenster.

  2. Eine wichtige Sache ist:

    ReadOnlyCollection<string> windowHandles = driver.WindowHandles

    das string name Objekt enthält, nicht der Windows-Titelnamen, für Beispiel Sammlung windowHandles konnte enthält:

    Nicht Windows-Titelnamen als{Menu},{PopUp}
    Es enthält: {45e615b3-266f-4ae0-a508-e901f42a36d3},{c6010037-0be6-4842-8d38-7f37c2621e81}

-1
 IWebDriver popup = null; 
     string mainWindow = driver.CurrentWindowHandle; 
     bool foundPopupTitle = false; 
     foreach (string handle in driver.WindowHandles) 
     { 
      popup = driver.SwitchTo().Window(handle); 
      if (popup.Title.Contains(title)) 
      { 
       foundPopupTitle = true; 
       break; 
      } 
     } 

     if (foundPopupTitle) 
     { 
      popup.Close(); 
     } 
     //switch back to original window 
     driver.SwitchTo().Window(mainWindow); 
+0

Code-only Antworten auf 3 Jahre alte Beiträge helfen niemandem. Zumindest eine Erklärung (und eigentlich sollte es besser sein als die bestehenden) – BradleyDotNET

+0

Code-only-Antwort funktioniert perfekt für mich. Code ist eloquenter als Worte für einen Entwickler. Und diese Antwort ist besser, da sie in einem Szenario mit mehreren Pop-ups funktioniert. Die erste Antwort funktioniert nur für 1 Popup. –