2013-02-18 38 views
6

Tôi có trường hợp nhấp vào một trang web liên kết sẽ mở ra một cửa sổ bật lên. Và sau khi cửa sổ bật lên mở ra, tiêu điểm nằm trong cửa sổ bật lên và cửa sổ chính bị tắt. Và tôi không thể lấy được điều khiển được chuyển đến cửa sổ bật lên. Vui lòng xem mã sau.Xử lý cửa sổ bật lên bằng cách sử dụng selenium

driver.findElement(By.linkText("Click me")).click();// when this line of code is reached then a popup window opens. 

System.out.println("After Clicking me"); // After the popup window opens this line of code is never executed. 

Tôi không thể chuyển điều khiển từ cửa sổ mẹ sang cửa sổ bật lên. Tôi biết lệnh sau đây.

driver.switchTo().window("popup window"); 

Nhưng nó không giúp ích nhiều. làm ơn giúp tôi.

Trả lời

7

Đây là mã tôi sử dụng khi tôi cần làm việc với cửa sổ bật lên sau, đóng cửa sổ và quay lại cửa sổ chính của tôi. Tất nhiên nó đã được đơn giản hóa cho mục đích của câu trả lời này. Nó duy trì một xử lý của cửa sổ ban đầu (chính) để nó có thể tạo sự khác biệt giữa những người khác.

Nó đòi hỏi một WebDriverWait rõ ràng bởi vì tôi đã gặp khó khăn trong phát triển mã đã chạy trước khi cửa sổ thực sự đã mở, vì vậy đây có thể không phải là một điều kiện lý tưởng,

function manipulatePopUp(final WebDriver driver, final WebDriverWait wait) { 
    final String mainWindowHandle = driver.getWindowHandle(); 
    driver.findElement(By.id("linkThatOpensPopUp")).click(); 

    wait.until(new ExpectedConditions<Boolean>() { 
     @Override 
     public Boolean apply(WebDriver d) { 
      return (d.getWindowHandles().size() != 1); 
     } 
    }); 

    for (String activeHandle : driver.getWindowHandles()) { 
     if (!activeHandle.equals(mainWindowHandle)) { 
      driver.switchTo().window(activeHandle); 
     } 
    } 

    driver.close(); 
    driver.switchTo().window(mainWindowHandle); 
} 
+0

bạn có thể vui lòng giải thích thêm về phương pháp cú pháp wait.until và logic trong nó? –

+1

Nhân tiện, driver.getWindowHandles() trả về một Set không phải là List. –

+0

Sự chờ đợi về cơ bản giữ vòng lặp cho đến khi người lái xe có nhiều hơn một tay cầm, bằng cách đó cho tôi thời điểm thích hợp để chắc chắn rằng cửa sổ bật lên đã sẵn sàng để tương tác với. – aimbire

9

driver.findElement (Bằng .linkText ("Click me")). click(); // khi dòng mã này đạt được thì một cửa sổ popup sẽ mở ra.

System.out.println ("Sau khi nhấp vào tôi"); // Sau khi cửa sổ bật lên mở dòng mã này không bao giờ được thực thi.

Dòng mã không bao giờ được thực thi vì quá trình chờ xử lý bật lên.

getWindowHandles() hoạt động bình thường trong tình huống này.

Ví dụ:

//handle of the master window before clicking the link 
String master = driver.getWindowHandle(); 

driver.findElement(By.linkText("Click me")).click(); 

//logic for waiting for the popup, checking the size to become greater than 1 or breaking after sometime to avoid the infinite loop. 
int timeCount = 1; 

do 
{ 
    driver.getWindowHandles(); 
    Thread.sleep(200); 
    timeCount++; 
    if (timeCount > 50) 
    { 
     break; 
    } 
} 
while (driver.getWindowHandles().size == 1); 

//Assigning the handles to a set 
Set<String> handles = driver.getWindowHandles(); 
//Switching to the popup window. 
for (String handle : handles) 
{ 
    if(!handle.equals(master)) 
    { 
     driver.switchTo().window(handle); 
    } 
} 

Bây giờ lái xe được chuyển sang cửa sổ popup. Nếu cửa sổ bật lên có khung thì bạn cần chuyển sang khung trước khi xác định các phần tử trong đó.

0
public class socialSignOn extends masterBaseClassNewSiteStage { 

    @Test 
    public void testSocialSignOn() throws Throwable { 
     openParticularUrl("/my-lfc/join/user-details?user_type=free"); 

     driver.findElement(By.cssSelector("#socialSignOn > div.left.socialLogin.googleButton")).click(); 

     String MainWindow = driver.getWindowHandle(); 

     for (String activeHandle : driver.getWindowHandles()) { 
      if (!activeHandle.equals(MainWindow)) { 
       driver.switchTo().window(activeHandle); 
      } 
     } 
     driver.findElement(By.cssSelector("#Email")).sendKeys(""); 
     driver.findElement(By.cssSelector("#next")).click(); 
     pauseFiveSeconds(); 
     driver.findElement(By.cssSelector("#Passwd")).sendKeys(""); 
     driver.findElement(By.cssSelector("#signIn")).click(); 
     pauseOneSecond(); 
     driver.switchTo().window(MainWindow); 
     pauseTenSeconds(); 
     closeDriver(); 
    } 
} 
-1
// delay : max number of seconds 
new WebDriverWait(driver, delay * 1000).until(ExpectedConditions.alertIsPresent()); 
drive`enter code here`r.switchTo().alert().accept(); 
Các vấn đề liên quan