如何在Selenium的Javascript Web驱动程序中处理警报?

时间:2016-09-17 00:23:24

标签: javascript selenium selenium-webdriver

对于非Javascript版本的WebDriver,还有其他几个问题(例如,关于Selenium中alert的问题)。在这些问题的答案中,建议的一般模式是:

try {
    doSomethingWhichCausesAnAlert();
} catch(UnexpectedAlertOpenError e) {
    doSomethingAboutException(e);
}

但是,我无法在Javascript版本中复制该模式,因为一切都是异步的:

try {
    doSomethingWhichCausesAnAlert();
} catch(e) {
    // this will never get reached
}
// 1ms or more later the alert appears, causing an exception

我想也许我可以使用.catch

el.sendKeys('invalid keystrokes that cause an alert')
  .catch((e) => doSomethingWithException(e))

但这也不起作用;似乎在alert已解决后发生catch异常。

TLDR

如果它们似乎都发生在我的代码上下文之外,我怎样才能捕获alert个异常(然后对警报做些什么)?

顺便说一下,这是警报例外的示例堆栈跟踪:

UnexpectedAlertOpenError: unexpected alert open: {Alert text : Please enter a valid number ("not a number" is not a number).}
   (Session info: chrome=53.0.2785.116)
   (Driver info: chromedriver=2.23.409687 (c46e862757edc04c06b1bd88724d15a5807b84d1),platform=Linux 4.4.0-21-generic x86_64)
     at WebDriverError (/home/me/project/node_modules/selenium-webdriver/lib/error.js:27:5)
     at UnexpectedAlertOpenError (/home/me/project/node_modules/selenium-webdriver/lib/error.js:274:5)
     at Object.checkLegacyResponse (/home/me/project/node_modules/selenium-webdriver/lib/error.js:512:13)
     at parseHttpResponse (/home/me/project/node_modules/selenium-webdriver/lib/http.js:396:13)
     at doSend.then.response (/home/me/project/node_modules/selenium-webdriver/lib/http.js:328:11)
     at process._tickCallback (internal/process/next_tick.js:103:7)
From: Task: WebDriver.manage().deleteAllCookies()
     at Driver.schedule (/home/me/project/node_modules/selenium-webdriver/lib/webdriver.js:414:17)
     at Options.deleteAllCookies (/home/me/project/node_modules/selenium-webdriver/lib/webdriver.js:1178:25)
     at World.<anonymous> (/home/me/project/test/cucumber/features/support/Hooks.js:23:37)
     at _combinedTickCallback (internal/process/next_tick.js:67:7)

正如您所看到的,我的代码中唯一涉及的部分是我的Hooks.js文件,它在尝试调用时会导致错误:

this.driver.manage().deleteAllCookies();

this.After清理Cookie(显然After测试结束,我对alert}采取任何措施都为时已晚。

P.S。我发现了一种至少确认在触发After之前存在警报的hacky方式:如果我在警报出现后的一个步骤中调用this.driver.manage().deleteAllCookies(),则会导致异常发生。但是,A)我不想删除Cookie只是为了检测alert,而B)我仍然无法真正关闭alert

1 个答案:

答案 0 :(得分:1)

正如Stack Overflow的创始人喜欢说的那样,我应该只是“读源Luke!”当我这样做时,我能够向后工作并最终找出JS模式,即:

// in a step or logic that goes off after the alert appears

this.driver.switchTo().alert().then((alert) => alert.dismiss());

希望这有助于其他JS / Selenium用户。