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を受け取りました
アラートのスクリーンショットを添付しています。
私は今何をすべきか理解できません。問題は、常にこの例外を受け取っていないことです。そして、それが発生すると、テストは失敗します。
私もこの問題を抱えていました。これは、アラートが発生したときのドライバーのデフォルトの動作によるものでした。デフォルトの動作は「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();
}
}
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秒間待機します。予想されるアラートが利用できない場合は、例外をキャッチして対処できます。
あなたのスイッチは、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.
}
クリックイベントの後、これを処理するコードの下に追加します
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();
DesiredCapabilities firefox = DesiredCapabilities.firefox();
firefox.setCapability(CapabilityType.UNEXPECTED_ALERT_BEHAVIOUR, UnexpectedAlertBehaviour.IGNORE);
UnexpectedAlertBehaviour.ACCEPT
またはUnexpectedAlertBehaviour.DISMISS
を使用できます
以下のコードは、Seleniumでの予期しないアラートの処理に役立ちます
try{
} catch (Exception e) {
if(e.toString().contains("org.openqa.Selenium.UnhandledAlertException"))
{
Alert alert = getDriver().switchTo().alert();
alert.accept();
}
}
私は同じ問題に直面していたので、以下の変更を加えました。
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();
}
}
驚くほどうまくいきました。