问题描述
我目前正在开发 Vaadin 测试平台基础设施,我正在测试的 GUI 是用 Vaadin 7/8 编写的。有一个来自 UI (Vaadin 7/8) 的简单通知 (HUMANIZED_MESSAGE) - 正如您在附加的屏幕截图中看到的那样。
我在 Vaadin Testbench 中面临的问题是,当通知出现在 UI 上时(我不知道什么时候出现),我看不到通知后面的元素。有没有办法(在 Vaadin 7/8 或 Testbench 上)使通知不具有 UI 的所有焦点?
我唯一的解决方案是搜索 NotificationElement (VaadinTestbench),如果找到,则关闭它,但这意味着我应该更改整个现有基础架构。
谢谢, 乔治
解决方法
取决于你在做什么。您可以查询隐藏在通知后面的元素并毫无问题地访问它们的属性。但是,如果您想单击任何内容,则应该模拟最终用户体验,因此它将光标移动到给定位置并尝试单击碰巧在那里的任何元素。通知是否有焦点没有区别。
现在好消息是您可以通过单击来关闭通知。坏消息是,如果点击尝试落在错误的元素上,webElement.click()
会引发异常。因此,除了点击两次之外,还需要一些解决方法。
这里有一些可能的选项,虽然有点笨拙,但应该可以解决问题:
- 查询通知并在点击前关闭(无论有没有通知都可以安全调用):
private void closeAnyNotifications() {
for (WebElement notification : findElements(
By.className("v-Notification"))) {
notification.click();
}
}
- 用 try-catch 包围点击,如果发生错误,则关闭通知并再次尝试点击:
try {
webElement.click();
} catch (ElementClickInterceptedException e) {
closeAnyNotifications();
webElement.click();
}
- 不要直接使用点击,而是通过一个操作,如果第一个点击没有触发任何应该触发的点击,请再点击一次:
new Actions(getDriver()).moveToElement(webElement).click().perform();
- 执行 try-catch 技巧,但使用 Action 解决方法(无需移动到元素,因为失败的单击已将光标移动到正确的位置,仅当无法阻止多个通知时才有效):
try {
webElement.click();
} catch (ElementClickInterceptedException e) {
// close the notification
new Actions(getDriver()).click().perform();
webElement.click();
}