web-dev-qa-db-de.com

org.openqa.Selenium.UnhandledAlertException: unerwarteter Alarm geöffnet

Ich verwende einen Chrome-Treiber und versuche, eine Webseite zu testen. 

Normalerweise läuft es gut, aber einige Zeit bekomme ich Ausnahmen--

 org.openqa.Selenium.UnhandledAlertException: unexpected alert open
 (Session info: chrome=38.0.2125.111)
 (Driver info: chromedriver=2.9.248315,platform=Windows NT 6.1 x86) (WARNING: The server did not  provide any stacktrace information)
 Command duration or timeout: 16 milliseconds: null
 Build info: version: '2.42.2', revision: '6a6995d', time: '2014-06-03 17:42:30'
 System info: Host: 'Casper-PC', ip: '10.0.0.4', os.name: 'Windows 7', os.Arch: 'x86', os.version:  '6.1', Java.version: '1.8.0_25'
 Driver info: org.openqa.Selenium.chrome.ChromeDriver

Dann habe ich versucht, die Warnung zu behandeln -

  Alert alt = driver.switchTo().alert();
  alt.accept();

Aber dieses Mal erhielt ich -- org.openqa.Selenium.NoAlertPresentException 

Ich füge die Screenshots der Warnung -.__ hinzu.First Alert and by using esc or enter i gets the second alertSecond Alert

Ich kann nicht herausfinden, was ich jetzt tun soll. Das Problem ist, dass ich diese Ausnahme nicht immer bekomme. Und wenn dies der Fall ist, schlägt der Test fehl.

12
Shantanu Nandan

Ich hatte auch dieses Problem. Dies liegt an dem Standardverhalten des Treibers, wenn er auf eine Warnung stößt. Das Standardverhalten wurde auf "ACCEPT" gesetzt, daher wurde der Alarm automatisch geschlossen und der switchTo (). Alert () konnte ihn nicht finden.

Die Lösung besteht darin, das Standardverhalten des Treibers ("IGNORE") so zu ändern, dass die Warnung nicht geschlossen wird: 

DesiredCapabilities dc = new DesiredCapabilities();
dc.setCapability(CapabilityType.UNEXPECTED_ALERT_BEHAVIOUR, UnexpectedAlertBehaviour.IGNORE);
d = new FirefoxDriver(dc);

Dann kannst du damit umgehen:

try {
    click(myButton);
} catch (UnhandledAlertException f) {
    try {
        Alert alert = driver.switchTo().alert();
        String alertText = alert.getText();
        System.out.println("Alert data: " + alertText);
        alert.accept();
    } catch (NoAlertPresentException e) {
        e.printStackTrace();
    }
}
21
RotS

Sie können die Funktion Wait in Selenium WebDriver verwenden, um auf eine Warnung zu warten und sie zu akzeptieren, sobald sie verfügbar ist.

In c # - 

public static void HandleAlert(IWebDriver driver, WebDriverWait wait)
{
    if (wait == null)
    {
        wait = new WebDriverWait(driver, TimeSpan.FromSeconds(5));
    }

    try
    {
        IAlert alert = wait.Until(drv => {
            try
            {
                return drv.SwitchTo().Alert();
            }
            catch (NoAlertPresentException)
            {
                return null;
            }
        });
        alert.Accept();
    }
    catch (WebDriverTimeoutException) { /* Ignore */ }
}

Sein Äquivalent in Java -

public static void HandleAlert(WebDriver driver, WebDriverWait wait) {
    if (wait == null) {
        wait = new WebDriverWait(driver, 5);
    }

    try {
        Alert alert = wait.Until(new ExpectedCondition<Alert>{
            return new ExpectedCondition<Alert>() {
              @Override
              public Alert apply(WebDriver driver) {
                try {
                  return driver.switchTo().alert();
                } catch (NoAlertPresentException e) {
                  return null;
                }
              }
            }
        });
        alert.Accept();
    } catch (WebDriverTimeoutException) { /* Ignore */ }
}

Es wird 5 Sekunden warten, bis eine Warnung vorliegt. Sie können die Ausnahme abfangen und damit umgehen, wenn die erwartete Warnung nicht verfügbar ist.

2
Sudara

Befindet sich Ihr Wechsel zur Alarmierung innerhalb eines Try/Catch-Blocks? Sie können auch eine Wartezeit hinzufügen, um zu sehen, ob der Alarm nach einer bestimmten Verzögerung angezeigt wird

try {
    // Add a wait timeout before this statement to make 
    // sure you are not checking for the alert too soon.
    Alert alt = driver.switchTo().alert();
    alt.accept();
} catch(NoAlertPresentException noe) {
    // No alert found on page, proceed with test.
}
1
shri046

Fügen Sie nach dem Klickereignis den folgenden Code hinzu, um sie zu bearbeiten

    try{
         driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
       }
 catch (org.openqa.Selenium.UnhandledAlertException e) {                
         Alert alert = driver.switchTo().alert(); 
         String alertText = alert.getText().trim();
         System.out.println("Alert data: "+ alertText);
         alert.dismiss();}

... andere Dinge tun driver.close ();

0
DesiredCapabilities firefox = DesiredCapabilities.firefox();
firefox.setCapability(CapabilityType.UNEXPECTED_ALERT_BEHAVIOUR, UnexpectedAlertBehaviour.IGNORE);

Sie können UnexpectedAlertBehaviour.ACCEPT oder UnexpectedAlertBehaviour.DISMISS verwenden.

0
user5495209

Der folgende Code hilft bei der Behandlung unerwarteter Warnungen in Selen

try{
} catch (Exception e) {
if(e.toString().contains("org.openqa.Selenium.UnhandledAlertException"))
 {
    Alert alert = getDriver().switchTo().alert();
    alert.accept();
 }
}
0
khaleefa shaik

Ich war mit demselben Problem konfrontiert und habe diese Änderungen vorgenommen.

try {
    click(myButton);
} catch (UnhandledAlertException f) {
    try {
        Alert alert = driver.switchTo().alert();
        String alertText = alert.getText();
        System.out.println("Alert data: " + alertText);
        alert.accept();
    } catch (NoAlertPresentException e) {
        e.printStackTrace();
    }
}

Es hat erstaunlich gut funktioniert.

0
Sobhit Sharma