在Selenium,我点击一个按钮,出现一个警告框,我试图接受警告框,但它给了我一个错误。
element.click();
driver.switchTo().alert().accept();
它非常不一致......有时测试通过,有时它会给我错误......
错误如下:
NoSuchAlertError: no alert open
(Session info: chrome=34.0.1847.131)
(Driver info: chromedriver=2.9.248307,platform=Mac OS X 10.9.2 x86_64)
at new bot.Error (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/atoms/error.js:109:18)
at Object.bot.response.checkResponse (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/atoms/response.js:106:9)
at /Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/webdriver.js:276:20
at /Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/goog/base.js:1178:15
at webdriver.promise.ControlFlow.runInNewFrame_ (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:1598:20)
at notify (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:428:12)
at notifyAll (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:397:7)
at resolve (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:375:7)
at fulfill (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:493:5)
at /Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:1465:10
at /Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/goog/base.js:1178:15
at webdriver.promise.ControlFlow.runInNewFrame_ (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:1598:20)
at notify (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:428:12)
at notifyAll (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:397:7)
at resolve (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:375:7)
at fulfill (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:493:5)
at /Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/goog/base.js:1178:15
at webdriver.promise.ControlFlow.runInNewFrame_ (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:1598:20)
at notify (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:428:12)
at notifyAll (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:397:7)
at resolve (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:375:7)
at fulfill (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:493:5)
at /Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:678:49
at /Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/http/http.js:96:5
at IncomingMessage.<anonymous> (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/http/index.js:114:7)
at IncomingMessage.EventEmitter.emit (events.js:117:20)
at _stream_readable.js:920:16
at process._tickCallback (node.js:415:13)
==== async task ====
WebDriver.switchTo().alert()
at webdriver.WebDriver.schedule (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/webdriver.js:267:15)
at webdriver.WebDriver.TargetLocator.alert (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/webdriver.js:1429:27)
at /Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/test/bandbooking/form.js:87:39
at /Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/goog/base.js:1178:15
at webdriver.promise.ControlFlow.runInNewFrame_ (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:1598:20)
at notify (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:428:12)
at notifyAll (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:397:7)
at resolve (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:375:7)
at fulfill (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:493:5)
at /Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/goog/base.js:1178:15
at /Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/goog/base.js:1178:15
at webdriver.promise.ControlFlow.runInNewFrame_ (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:1598:20)
at notify (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:428:12)
at notifyAll (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:397:7)
at resolve (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:375:7)
at fulfill (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:493:5)
at /Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/goog/base.js:1178:15
at webdriver.promise.ControlFlow.runInNewFrame_ (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:1598:20)
at notify (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:428:12)
at then (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:478:7)
at Object.webdriver.promise.asap (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:723:11)
at webdriver.promise.ControlFlow.runInNewFrame_ (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:1609:25)
at notify (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:428:12)
at notifyAll (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:397:7)
at /Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/goog/base.js:1178:15
at /Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/goog/base.js:1178:15
at webdriver.promise.ControlFlow.runInNewFrame_ (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:1598:20)
at notify (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:428:12)
at then (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:478:7)
at resolve (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:369:18)
at fulfill (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:493:5)
at /Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/goog/base.js:1178:15
at webdriver.promise.ControlFlow.runInNewFrame_ (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:1598:20)
at notify (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:428:12)
at then (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:478:7)
at Object.webdriver.promise.asap (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:723:11)
at webdriver.promise.ControlFlow.runInNewFrame_ (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:1609:25)
at notify (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:428:12)
at notifyAll (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:397:7)
at /Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/goog/base.js:1178:15
at /Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/goog/base.js:1178:15
at webdriver.promise.ControlFlow.runInNewFrame_ (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:1598:20)
at notify (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:428:12)
at then (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:478:7)
at resolve (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:369:18)
at fulfill (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:493:5)
at /Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:1465:10
at /Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/goog/base.js:1178:15
at webdriver.promise.ControlFlow.runInNewFrame_ (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:1598:20)
at notify (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:428:12)
at then (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:478:7)
at Object.webdriver.promise.asap (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:723:11)
at newFrame.then.e (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:1614:25)
at /Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/goog/base.js:1178:15
at webdriver.promise.ControlFlow.runInNewFrame_ (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:1598:20)
at notify (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:428:12)
at notifyAll (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:397:7)
at resolve (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:375:7)
at fulfill (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:493:5)
at webdriver.promise.ControlFlow.resolveFrame_ (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:1519:9)
at webdriver.promise.ControlFlow.getNextTask_ (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:1488:12)
at webdriver.promise.ControlFlow.runEventLoop_ (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:1446:59)
at wrapper [as _onTimeout] (timers.js:252:14)
at Timer.listOnTimeout [as ontimeout] (timers.js:110:15)
==== async task ====
at Context.<anonymous> (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/testing/index.js:126:14)
at Test.Runnable.run (/usr/local/lib/node_modules/mocha/lib/runnable.js:196:15)
at Runner.runTest (/usr/local/lib/node_modules/mocha/lib/runner.js:374:10)
at /usr/local/lib/node_modules/mocha/lib/runner.js:452:12
at next (/usr/local/lib/node_modules/mocha/lib/runner.js:299:14)
at /usr/local/lib/node_modules/mocha/lib/runner.js:309:7
at next (/usr/local/lib/node_modules/mocha/lib/runner.js:247:23)
at /usr/local/lib/node_modules/mocha/lib/runner.js:271:7
at done (/usr/local/lib/node_modules/mocha/lib/runnable.js:185:5)
at /usr/local/lib/node_modules/mocha/lib/runnable.js:199:9
at /Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/testing/index.js:92:5
at /Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/goog/base.js:1178:15
at webdriver.promise.ControlFlow.runInNewFrame_ (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:1598:20)
at notify (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:428:12)
at notifyAll (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:397:7)
at resolve (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:375:7)
at fulfill (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:493:5)
at /Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:1465:10
at Object.webdriver.promise.asap (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:732:5)
at newFrame.then.e (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:1614:25)
at /Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/goog/base.js:1178:15
at webdriver.promise.ControlFlow.runInNewFrame_ (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:1598:20)
at notify (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:428:12)
at notifyAll (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:397:7)
at resolve (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:375:7)
at fulfill (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:493:5)
at webdriver.promise.ControlFlow.resolveFrame_ (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:1519:9)
at webdriver.promise.ControlFlow.getNextTask_ (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:1488:12)
at webdriver.promise.ControlFlow.runEventLoop_ (/Users/kstrife/Desktop/experiments/seleniumNode/selenium-webdriver/lib/webdriver/promise.js:1446:59)
at wrapper [as _onTimeout] (timers.js:252:14)
at Timer.listOnTimeout [as ontimeout] (timers.js:110:15)
答案 0 :(得分:5)
documented solution不起作用。
// this is the documented solution, which doesn't work
driver.switchTo().alert().dismiss().then(null, function(e) {
if (e.code !== webdriver.ErrorCode.NO_SUCH_ALERT) {
throw e;
}
});
无论怎样,它都会抛出NoSuchAlertError: no alert open
。然而,这种改进的方法有效:
driver.switchTo().alert().thenCatch(function (e) {
// 27 maps to bot.ErrorCode.NO_MODAL_DIALOG_OPEN: http://selenium.googlecode.com/git/docs/api/javascript/source/lib/atoms/error.js.src.html#l31
if (e.code !== 27) { throw e; }
})
.then(function (alert) {
if (alert) { return alert.dismiss(); }
});
这会尝试切换到打开的提醒。
如果未找到警报,则处理NoSuchAlertError
异常但抛出其他错误(因为我们不想吞噬每个错误)。
dismiss
将其解除。如果需要,请随时致电accept
。 注意:thenCatch
的位置至关重要。这违背了推理和反对他们记录的控制流程,但这就是今天的工作原理。
答案 1 :(得分:3)
您可以使用显式等待警报,而不是前往Thread.sleep
,如下所示:
WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement element = wait.until(ExpectedConditions.alertIsPresent());
然后接受提醒:
driver.switchTo().alert().accept();
答案 2 :(得分:1)
我接受它之前只是睡了1秒钟。
element.click();
driver.sleep(1000);
driver.switchTo().alert().accept();
答案 3 :(得分:1)
您也可以将其更改为:
element.click();
while (true)
{
try
{
driver.switchTo().alert().accept();
break;
}
catch (NoSuchAlertError error)
{
Thread.sleep(100);
}
}
这将:
如果您正在运行单线程应用程序,那么您最好完全摆脱Thread.sleep
,因为通过将系统中唯一的线程置于休眠状态没有任何好处。除此之外,您可能还需要考虑在经过一定次数的尝试后放弃和退出循环。
答案 4 :(得分:0)
我总是尽量避免Thread.sleep()
和不必要的抛出异常
以下解决方案将实现两者,您可以根据您的要求更改计数值。如果弹出没有出现,它也不会导致无限循环。
int count = 0;
do{
if (driver.getWindowHandles().size() > 1) {
// Alert is present
driver.switchTo().alert().accept();
break;
}
} while(count < 100);