web-dev-qa-db-ja.com

org.openqa.Selenium.UnhandledAlertException:予期しないアラートが開きます

Chromeドライバーを使用して、Webページをテストしようとしています。

通常は正常に実行されますが、例外が発生する場合があります-

 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

その後、アラートを処理しようとしました-

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

しかし、今回はorg.openqa.Selenium.NoAlertPresentExceptionを受け取りました

アラートのスクリーンショットを添付しています。 First Alert and by using esc or enter i gets the second alertSecond Alert

私は今何をすべきか理解できません。問題は、常にこの例外を受け取っていないことです。そして、それが発生すると、テストは失敗します。

17
Shantanu Nandan

私もこの問題を抱えていました。これは、アラートが発生したときのドライバーのデフォルトの動作によるものでした。デフォルトの動作は「ACCEPT」に設定されていたため、アラートは自動的に閉じられ、switchTo()。alert()はそれを見つけることができませんでした。

解決策は、ドライバーのデフォルトの動作(「IGNORE」)を変更して、アラートを閉じないようにすることです。

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

その後、あなたはそれを扱うことができます:

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();
    }
}
25
RotS

Selenium WebDriverのWait機能を使用して、アラートを待機し、使用可能になったらアラートを受け入れることができます。

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 */ }
}

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 */ }
}

アラートが発生するまで5秒間待機します。予想されるアラートが利用できない場合は、例外をキャッチして対処できます。

2
Sudara

あなたのスイッチは、try/catchブロック内で警告しますか?待機タイムアウトを追加して、一定の遅延の後にアラートが表示されるかどうかを確認することもできます

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

クリックイベントの後、これを処理するコードの下に追加します

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

...他のことを行うdriver.close();

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

UnexpectedAlertBehaviour.ACCEPTまたはUnexpectedAlertBehaviour.DISMISSを使用できます

0
user5495209

以下のコードは、Seleniumでの予期しないアラートの処理に役立ちます

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

私は同じ問題に直面していたので、以下の変更を加えました。

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

驚くほどうまくいきました。

0
Sobhit Sharma