Уведомление 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();
}