![](/img/trans.png)
[英]How can I choose an option from a select dropdown using Selenium 2/Web Driver javascript API?
[英]How Can I Handle Alerts In Selenium's Javascript Web Driver?
对于非Java版本的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))
但这也不起作用; 解决该catch
后,似乎发生了alert
异常。
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
测试完成After
,对我而言,对alert
采取任何措施为时已晚)。
PS:我发现了一种骇人听闻的方法,可以至少After
触发After
之前确认警报:如果在警报出现后的某个步骤中调用this.driver.manage().deleteAllCookies()
,它将导致异常的发生。 但是,A)我不想删除Cookie只是为了检测alert
,而B)我仍然无法真正关闭alert
。
正如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用户有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.