2012-06-28 3 views
5

Здесь приходят 2 окна выскочить во время тестирования.selenium webdriver окна обрабатываются C# switchTo failed

мой код:

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

Я хочу, чтобы перейти к окну, которое содержит URL "Main". Но когда тест запущен, он переключается между двумя окнами непрерывно, и он не останавливается.

Я отлаживаю и обнаружил, что foreach не сломался, даже если верно boolean a.

Как я могу это решить?

+0

Что произойдет, если вы просто сломаться, без switchTo() 2-ой раз, так как вы уже перешли при назначении логического значения. – VolkerK

ответ

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

Как вы получаете 'existingWindowHandle'? –

+0

existingWindowHandle = driver.CurrentWindowHandle; –

+0

@ Майкл Айерс, как я могу получить дескриптор текущего окна (существующее окно, которое открывается вручную), которое не открывается драйвером, означает, что я не могу использовать driver.getWindowHandle(); –

3
  1. Используя оригинальный почтовый индекс.

    string existingWindowHandle = driver.CurrentWindowHandle;

    Сво первое окно.

  2. Одна важная вещь:

    ReadOnlyCollection<string> windowHandles = driver.WindowHandles

    Содержит имя строки объекта, а не для Windows Название Имя, для примера Collection windowHandles мог содержит:

    Не для Windows Название Имя, как{Menu},{PopUp}
    Содержит: {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

Только на основе кода ответы на 3-летние должности никому не помогают. По крайней мере, дайте объяснение (и действительно, оно должно быть лучше, чем существующие) – BradleyDotNET

+0

Ответ только на код отлично работает для меня. Код более красноречив, чем слова разработчику. И этот ответ лучше в том, что он работает в сценарии множественных всплывающих окон. Первый ответ работает только для 1 всплывающего окна. –

Смежные вопросы