Làm cách nào để kiểm tra xem có cảnh báo hay không bằng cách sử dụng WebDriver?


78

Tôi cần kiểm tra sự tồn tại của Cảnh báo trong WebDriver.

Đôi khi nó bật lên một cảnh báo nhưng đôi khi nó sẽ không bật lên. Trước tiên, tôi cần kiểm tra xem cảnh báo có tồn tại hay không, sau đó tôi có thể chấp nhận hoặc loại bỏ thông báo đó hoặc nó sẽ thông báo: không tìm thấy cảnh báo.

Câu trả lời:


85
public boolean isAlertPresent() 
{ 
    try 
    { 
        driver.switchTo().alert(); 
        return true; 
    }   // try 
    catch (NoAlertPresentException Ex) 
    { 
        return false; 
    }   // catch 
}   // isAlertPresent()

kiểm tra liên kết tại đây https://groups.google.com/forum/?fromgroups#!topic/webdriver/1GaSXFK76zY


2
Trong liên kết, bạn có thể thấy
thù địch

3
Câu trả lời hơi sai bên dưới và câu trả lời trên stackoverflow.com/questions/8244723/… là cách tốt hơn nhiều để làm điều đó. Mô hình thử / bắt, cũng như không ổn định, ghi lại một thông báo về việc không có cảnh báo.
Don Willis

4
ExpectedConditions.alertIsPresent()cung cấp cho bạn chính xác điều tương tự, nhưng theo cách đẹp hơn và chỉ trong một dòng :)
nilesh

Mong đợiConditions không tiết kiệm nhiều mã hơn thì hãy thử bắt đơn giản.
sinisterrook

1
Một vấn đề với cách tiếp cận này là trong khi kiểm tra xem cảnh báo có tồn tại hay không, ngữ cảnh đã được chuyển sang cảnh báo. Điều này có thể có vấn đề nếu bạn không mong đợi.
JeffC

26

Phần sau (triển khai C #, nhưng tương tự trong Java) cho phép bạn xác định xem có một cảnh báo không có ngoại lệ và không cần tạo WebDriverWaitđối tượng hay không.

boolean isDialogPresent(WebDriver driver) {
    IAlert alert = ExpectedConditions.AlertIsPresent().Invoke(driver);
    return (alert != null);
}

12

Tôi sẽ đề nghị sử dụng Mong đợi điều kiệnalertIsPresent () . Mong đợiConditions là một lớp trình bao bọc thực hiện các điều kiện hữu ích được xác định trong giao diện Điều kiện mong đợi .

WebDriverWait wait = new WebDriverWait(driver, 300 /*timeout in seconds*/);
if(wait.until(ExpectedConditions.alertIsPresent())==null)
    System.out.println("alert was not present");
else
    System.out.println("alert was present");

thêm một ".apply (trình điều khiển)" sau khi 'alertIsPresent ()' hoặc làm điều đó đúng và sử dụng chờ đợi
Don Willis

Tôi thấy rằng điều này ném ra một TimeoutException.
Vince Bowdren

TimeoutException khi điều kiện mong đợi không được đáp ứng trong thời gian chờ nhất định. Cảnh báo có ở tất cả không?
nilesh

Liên kết @nilesh bị hỏng
Dev

7

Tôi thấy việc bắt ngoại lệ driver.switchTo().alert();quá chậm trong Firefox(FF V20 & selenium-java-2.32.0). '

Vì vậy, tôi chọn một cách khác:

    private static boolean isDialogPresent(WebDriver driver) {
        try {
            driver.getTitle();
            return false;
        } catch (UnhandledAlertException e) {
            // Modal dialog showed
            return true;
        }
    }

Và đó là một cách tốt hơn khi hầu hết các trường hợp thử nghiệm của bạn KHÔNG có hộp thoại (việc ném ngoại lệ rất tốn kém).


Khi tôi gọi một C # triển khai chức năng của bạn, nó ném ra ngoại lệ, nhưng nó cũng đóng cảnh báo.
RMK

1
mặc dù trước đó nó cũng đóng cảnh báo, cho đến nay tôi thấy rằng phương pháp này là nhanh nhất khi giao dịch với phát hiện cảnh báo, thậm chí nhanh hơnExpectedConditions.alertIsPresent
Thariq Nugrohotomo

Vấn đề chính của cách tiếp cận này là nó ăn cắp cảnh báo. Khi cảnh báo là không có driver.switchTo () alert () nó mất khoảng 6-10 ms trong FF 62.
Pranoy Sarkar

6

Tôi sẽ đề nghị sử dụng Mong đợi điều kiệnalertIsPresent () . Mong đợiConditions là một lớp trình bao bọc thực hiện các điều kiện hữu ích được xác định trong giao diện Điều kiện mong đợi .

public boolean isAlertPresent(){
    boolean foundAlert = false;
    WebDriverWait wait = new WebDriverWait(driver, 0 /*timeout in seconds*/);
    try {
        wait.until(ExpectedConditions.alertIsPresent());
        foundAlert = true;
    } catch (TimeoutException eTO) {
        foundAlert = false;
    }
    return foundAlert;
}

Lưu ý: điều này dựa trên câu trả lời của nilesh, nhưng được điều chỉnh để bắt TimeoutException được ném bởi phương thức wait.until ().


Một lưu ý khác: Trong C #, đây là WebDriverTimeoutException. Tôi cho rằng đó là bởi vì có một lớp System.TimeoutException có thể dễ dàng bị trộn lẫn với lớp đó.
John Chesshir

2

Mã này sẽ kiểm tra xem cảnh báo có hiện diện hay không.

public static void isAlertPresent(){
    try{
    Alert alert = driver.switchTo().alert();
    System.out.println(alert.getText()+" Alert is Displayed"); 
    }
    catch(NoAlertPresentException ex){
    System.out.println("Alert is NOT Displayed");
    }
    }


2
public static void handleAlert(){
    if(isAlertPresent()){
        Alert alert = driver.switchTo().alert();
        System.out.println(alert.getText());
        alert.accept();
    }
}
public static boolean isAlertPresent(){
      try{
          driver.switchTo().alert();
          return true;
      }catch(NoAlertPresentException ex){
          return false;
      }
}

1

public boolean isAlertPresent () {

try 
{ 
    driver.switchTo().alert(); 
    system.out.println(" Alert Present");
}  
catch (NoAlertPresentException e) 
{ 
    system.out.println("No Alert Present");
}    

}


Thêm một số mô tả chi tiết hơn.
Mathews Sunny
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.