Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

При ожидании появления элемента получаем ElementNotVisibleExeption

selenium
webdriver
Теги: #<Tag:0x00007f7b64eb7508> #<Tag:0x00007f7b64eb73a0>

(Артём Кузьменко) #1

Здравствуйте. Необходимо обработать выпадающие списки. Они реализованы через select, но элементы списка сделаны через ul/li, при чем элементы ul/li уже есть в DOM, только они невидимые.
Я так понимаю, что при выпадении элементов списка есть какая-то анимация или что-то подобное и периодически выскакивает исключение ElementNotVisibleExeption, но не для всех списков. Если прогонять в дебагере или со слипами, то все работает прекрасно. Вот хотел узнать что тут такого может быть в списках, можно ли их обработать обычной ждалкой wait как для всех элементов или для них нужно что-то свое наваять с задержками?

Вот моя стандратная ждалка появления элемента:

public void WaitForVisibilityOfElement(By locator)
        {
            WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(GLOBAL_WAIT));
            wait.Until(ExpectedConditions.ElementIsVisible(locator));
        }

Вот такие выпадающие списки: http://take.ms/JfDV3T
Вот так это дело представлено в html: http://take.ms/U3TiY
Списки 1 и 2 отрабатывают, видимо из-за малого количества элементов, а 3 падает все время.

Метод выглядит примерно так:

            helper.wait.WaitForVisibilityOfElement(precedentTypeComboBox);
            helper.element.Click(precedentTypeComboBox);
            helper.wait.WaitForVisibilityOfElement(comboBoxItems);
            precItems = helper.element.FindElements(liItem);
            precItems[0].Click();

            helper.wait.WaitForVisibilityOfElement(precedentFormatComboBox);
            helper.element.Click(precedentFormatComboBox);
            helper.wait.WaitForVisibilityOfElement(comboBoxItems);
            precItems = helper.element.FindElements(liItem);
            precItems[1].Click();

            helper.wait.WaitForVisibilityOfElement(precedentCategoryComboBox);
            helper.element.Click(precedentCategoryComboBox);
            helper.wait.WaitForVisibilityOfElement(comboBoxItems);
            precItems = helper.element.FindElements(liItem);
            precItems[2].Click();

(Oleksii Ihnatiuk) #2

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


#3

Попробуй перед кликом

ждать появления этого самого элемента:

wait = new WebDriverWait(...);
wait.Until(ExpectedConditions.visibilityOf(precItems[2]));```

или, если не поможет, то как ответили в предыдущем посте - ```ExpectedConditions.elementToBeClickable```

Тут дело в том, что ты делаешь[quote="arkuz, post:1, topic:13957"]
WaitForVisibilityOfElement(comboBoxItems);
[/quote]
то есть, как я понимаю, по локатору `comboBoxItems` у тебя находится не один элемент, а лист элементов, и, в таком случае, метод `ExpectedConditions.ElementIsVisible` будет ждать появления только самого первого элемента из списка. Таким образом, если опции из дропдауна появляются недостаточно быстро, то, опция, по которой ты пытаешься в последствии кликать, не успевает подгрузиться.

(Alexander) #4

Работа с кендушными контролами - не самое приятное занятие. Советую вам посмотреть в сторону написания хелпера, который бы обеспечивал работу с кендушными контролами через джаваскрипт:

  • инициализировать контрол via js
  • вытащить опшнс via js
  • положить опшнсы в промежуточную коллекцию, десериализовать или как вам удобно
  • найти в коллекции нужную опцию
  • бомбануть control.select(’{requiredOption}’); control.trigger(‘change’); via js

Можно погуглить эту тему, она достаточно популярная, вот например урл: https://automatetheplanet.com/automate-telerik-kendo-grid-webdriver/


(Vatslau) #5

не вижу хтмл
но скрее всего элемент скрыт скролом в этом скписке
если есть поиск по списку(в инпуте) и есть подсветка - css-sleect-higlighted работает 100%
и клик на него