Уведомление Vaadin блокирует доступ к элементам, находящимся за ним

В настоящее время я работаю над инфраструктурой Vaadin Testbench, и тестируемый графический интерфейс написан на Vaadin 7/8. Существует простое уведомление (HUMANIZED_MESSAGE), которое приходит из пользовательского интерфейса (Vaadin 7/8) — как вы можете видеть на прикрепленном снимке экрана.

Проблема, с которой я сталкиваюсь в Vaadin Testbench, заключается в том, что когда уведомление появляется в пользовательском интерфейсе (и я не знаю, когда оно появляется), я не вижу элементы, стоящие за уведомлением. Есть ли способ (на Vaadin 7/8 или Testbench), чтобы уведомление не было полностью сосредоточено на пользовательском интерфейсе?

Единственное решение, которое у меня есть, это искать NotificationElement (VaadinTestbench) и, если он его находит, закрывать, но это означает, что я должен изменить всю существующую инфраструктуру.

Спасибо, Джордж

1 ответ

Зависит от того, что вы делаете. Вы можете запросить элементы, скрытые за уведомлением, и без проблем получить доступ к их атрибутам. Однако, если вы хотите щелкнуть что-либо, это должно эмулировать работу конечного пользователя, поэтому он перемещает курсор в заданную позицию и пытается щелкнуть любой элемент, который там находится. Не имеет значения, имеет ли уведомление фокус или нет.

Теперь хорошая новость заключается в том, что вы можете закрыть уведомление, нажав на него. Плохая новость в том, что генерирует исключение, если щелчок пытается попасть на неправильный элемент. Поэтому необходим какой-то обходной путь, помимо простого двойного щелчка.

Вот несколько возможных вариантов, все немного неуклюжие, но должны помочь:

  • Запросите уведомления и закройте их до щелчка (можно безопасно вызывать, есть ли какие-либо уведомления или нет):
          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 {
            webElement.click();
        } catch (ElementClickInterceptedException e) {
            // close the notification
            new Actions(getDriver()).click().perform();
            webElement.click();
        }
Другие вопросы по тегам