Vaadin 通知阻止访问其背后的元素

问题描述

我目前正在开发 Vaadin 测试平台基础设施,我正在测试的 GUI 是用 Vaadin 7/8 编写的。有一个来自 UI (Vaadin 7/8) 的简单通知 (HUMANIZED_MESSAGE) - 正如您在附加的屏幕截图中看到的那样。

我在 Vaadin Testbench 中面临的问题是,当通知出现在 UI 上时(我不知道什么时候出现),我看不到通知后面的元素。有没有办法(在 Vaadin 7/8 或 Testbench 上)使通知不具有 UI 的所有焦点?

我唯一的解决方案是搜索 NotificationElement (VaadinTestbench),如果找到,则关闭它,但这意味着我应该更改整个现有基础架构。

谢谢, 乔治

Notification

解决方法

取决于你在做什么。您可以查询隐藏在通知后面的元素并毫无问题地访问它们的属性。但是,如果您想单击任何内容,则应该模拟最终用户体验,因此它将光标移动到给定位置并尝试单击碰巧在那里的任何元素。通知是否有焦点没有区别。

现在好消息是您可以通过单击来关闭通知。坏消息是,如果点击尝试落在错误的元素上,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();
        }