2012-06-28 33 views
5

Ở đây có 2 cửa sổ bật ra trong khi thử nghiệm.selenium webdriver window handles C# switchTo thất bại

mã của tôi:

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

Tôi muốn chuyển sang cửa sổ đó url chứa "Main". Nhưng khi thử nghiệm đang chạy, nó sẽ chuyển đổi giữa hai cửa sổ liên tục và nó không dừng lại.

Tôi gỡ lỗi và thấy số foreach không vi phạm ngay cả khi boolean a là đúng.

Tôi làm cách nào để giải quyết vấn đề này?

+0

gì sẽ xảy ra nếu bạn chỉ phá vỡ, không switchTo() một lần thứ 2, vì bạn đã có chuyển khi giao boolean. – VolkerK

Trả lời

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

làm thế nào để bạn có được 'existingWindowHandle'? –

+0

existingWindowHandle = driver.CurrentWindowHandle; –

+0

@Michael Ayers làm thế nào tôi có thể xử lý cửa sổ hiện tại (cửa sổ hiện tại được mở bằng tay) mà không được mở bằng trình điều khiển nghĩa là tôi không thể sử dụng driver.getWindowHandle(); –

3
  1. Sử dụng mã bưu chính gốc.

    string existingWindowHandle = driver.CurrentWindowHandle;

    Cửa sổ đầu tiên.

  2. Một điều quan trọng là:

    ReadOnlyCollection<string> windowHandles = driver.WindowHandles

    Chứa các đối tượng tên chuỗi, không phải Windows Tiêu đề Tên, cho dụ Collection windowHandles có thể chứa:

    Không của Windows Tên Tiêu đề như{Menu},{PopUp}
    Nó chứa: {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

Câu trả lời chỉ có mã trên các bài đăng cũ 3 năm không giúp ích gì. Ít nhất cung cấp một lời giải thích (và thực sự, nó nên được tốt hơn so với những cái hiện có) – BradleyDotNET

+0

Câu trả lời chỉ có mã hoạt động hoàn hảo cho tôi. Mã là hùng hồn hơn lời nói cho một nhà phát triển. Và câu trả lời này tốt hơn ở chỗ nó hoạt động trong một kịch bản của nhiều cửa sổ bật lên. Câu trả lời đầu tiên chỉ hoạt động với 1 popup. –

Các vấn đề liên quan