Як перевірити, чи існує попередження за допомогою WebDriver?


78

Мені потрібно перевірити наявність Alert у WebDriver.

Іноді з’являється попередження, але іноді не з’являється. Мені потрібно спочатку перевірити, чи існує попередження, тоді я можу прийняти або відхилити його, або воно скаже: жодного попередження не знайдено.

Відповіді:


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

перевірте посилання тут https://groups.google.com/forum/?fromgroups#!topic/webdriver/1GaSXFK76zY


2
За посиланням ви можете побачити, як приймати або відхиляти вікно попередження
VinnyG

3
Трохи неправильна відповідь нижче та відповідь на stackoverflow.com/questions/8244723/... - набагато кращий спосіб це зробити. Модель try / catch, незважаючи на незграбність, реєструє повідомлення про відсутність попередження.
Дон Вілліс,

4
ExpectedConditions.alertIsPresent()дає точнісінько те саме, але більш приємним чином і лише одним рядком :)
nilesh

ExpectedConditions не економить набагато більше коду, ніж проста спроба ловити.
sinisterrook

1
Однією з проблем цього підходу є те, що під час перевірки, чи існує попередження, контекст переключено на попередження. Це може бути проблематично, якщо ви цього не очікуєте.
JeffC

26

Наступне (реалізація C #, але схоже на Java) дозволяє визначити, чи є попередження без винятків та без створення WebDriverWaitоб’єкта.

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

12

Я хотів би запропонувати , щоб використовувати ExpectedConditions і alertIsPresent () . ExpectedConditions - це клас обгортки, який реалізує корисні умови, визначені в інтерфейсі ExpectedCondition .

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");

додати ".apply (драйвер)" після "alertIsPresent ()" або зробити це належним чином і використовувати чекати
Дон Вілліс

Я виявляю, що це викликає TimeoutException.
Вінс Боудрен,

Тайм-аут Виняток, коли очікувана умова не була виконана за вказаний тайм-аут. Чи був Alert взагалі присутній?
нілеш

@nilesh посилання розбиті
Dev

7

Я виявив, що виняток з лову driver.switchTo().alert();настільки повільний у Firefox(FF V20 & selenium-java-2.32.0). `

Тому я обираю інший шлях:

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

І це кращий спосіб, коли у більшості ваших тестових випадків діалогове вікно НІЯКОЕ (викидання винятків є дорогим).


Коли я викликаю реалізацію вашої функції на C #, вона видає виняток, але також закриває попередження.
RMK

1
незважаючи на те, що він також закриває попередження, поки що я виявив, що такий підхід є найшвидшим у справі виявлення попереджень, навіть швидше, ніжExpectedConditions.alertIsPresent
Тарік Нугрохотомо

Основна проблема такого підходу полягає в тому, що він їсть настороженість. Коли оповіщення немає, driver.switchTo (). Alert () у FF 62 займає близько 6-10 мс
Праной Саркар

6

Я б запропонував використовувати ExpectedConditions і alertIsPresent () . ExpectedConditions - це клас обгортки, який реалізує корисні умови, визначені в інтерфейсі ExpectedCondition .

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

Примітка: це базується на відповіді nilesh, але пристосоване для того, щоб вловити TimeoutException, який викликає метод wait.until ().


Ще одне зауваження: У C # це WebDriverTimeoutException. Припускаю, це тому, що існує клас System.TimeoutException, який міг легко змішатись із цим.
Джон Чесшир,

2

Цей код перевірить, чи є попередження чи ні.

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

}


Додайте трохи детальніший опис.
Метьюз Сонячний
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.