NoSuchElementException: Timed out after 30 seconds для некоторых тестов

Исходные данные:
Jenkins ver. 1.544
OS X 10.9
Thucydides сгенереный с архетипа thucydides-simple-archetype версии 0.9.205 использующий selenium server 2.37.1
Firefox 26

Есть несколько классов с тестами. При запуске билда все тесты одного и того же класа всегда фейлятся с такой ошибкой:

org.openqa.selenium.NoSuchElementException: Timed out after 30 seconds. Unable to locate the element: Element is not usable [[FirefoxDriver: firefox on MAC (4203e378-8c75-7049-9256-1b9ba242fc61)] -> id: cmm2lifetime_link] For documentation on this error, please visit: http://seleniumhq.org/exceptions/no_such_element.html Build info: version: '2.37.1', revision: 'Тут мой идентификар комин', time: '2013-10-21 09:08:07' System info: host: 'HeartwilltelliMac.local', ip: '10.20.10.103', os.name: 'Mac OS X', os.arch: 'x86_64', os.version: '10.9.1', java.version: '1.7.0_45' Driver info: driver.version: unknown For documentation on this error, please visit: http://seleniumhq.org/exceptions/no_such_element.html Build info: version: '2.37.1', revision: 'a7c61cbd68657e133ae96672cf995890bad2ee42', time: '2013-10-21 09:08:07' System info: host: 'HeartwilltelliMac.local', ip: '10.20.10.103', os.name: 'Mac OS X', os.arch: 'x86_64', os.version: '10.9.1', java.version: '1.7.0_45' Driver info: driver.version: unknown

При этом все тесты успешно проходят при запуске из IDE и просто при запуске мейвеном

Как понять почему браузер запущеный дженкинсом не находит этот элемент. Менял локаторы, определял по айди нейму css xpath, без толку, результат тот же.

Из стектрейса ошибки понятно только то, что WebDriver почему-то не нашел элемента…

Для поиска проблемы, попробуйте следующее:

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

Возможно, сайт использует адаптивную верстку (responsible layout). В таком случае, элемента может и не быть. Для проверки, растените обычный бразурер до маленького размера, например 500 x 300 пикселей, и посмотрите ли элемент существует.

1 лайк

Неа - это так же может значить, что элемент не видим. Два балла thucydides за подмену понятий.

                @Override
                protected void isLoaded() throws Error {
                        try {
                                element = SmartAjaxElementLocator.super.findElement();
                                if (!isElementUsable(element)) {
                                        throw new NoSuchElementException("Element is not usable " + element.toString());
                                }
                        } catch (NoSuchElementException e) {
                                lastException = e;
                                // Should use JUnit's AssertionError, but it may not be present
                                throw new NoSuchElementError("Unable to locate the element: " + e.getMessage(), e);
                        }
                }

где

        protected boolean isElementUsable(WebElement element) {
                return (element != null) && (element.isDisplayed());
        }
1 лайк

Тесты запускаете используя виртуальный xvfb-экран?

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

Как вариант, это и может быть вашей проблемой. На искуственном экране, элементы иногда не отрисовываются, сталкивался с таким пару раз. Попробуйте запустить их, без виртуального экрана(уберите галочку в настройках job’a), если отработает удачно, проблема будет выявлена ; -)

У меня не стоит плагин в дженкинсе для Xvfb, тесты запускаются на моем маке не от имени моего пользователя а от имени пользователя jenkins. Что клацать в такой ситуации?

Самая банальная проверка. Напишите простой тест, типа “Hello Google”, и попробуйте запустить его. Если тест падает, ошибка в неправильных настройки Job’а. Затем просто по-гуглите на корректные настройких джобов, обратите внимание, что в зависимости от репозитория, будь-то svn, git, или локальная машина - есть свои нюансы настройки Job’ов. Раз создалась, учётка - jenkins, вы видимо устанавливали .dmg файл или из портов, верно? Я обходился обычным .war файлом и ручным запуска сервера.

Да, устанавливал из .pkg файла. Ситуация такая - есть тесты которые заходят на определенные страницы и делают скриншоты, и мониторят наличие JS ошибок, они проходят норм, а фейлятся те, которые используют какие либо локаторы, при этом смотрел скриншот страницы прежде чем обратится к какому либо элементу - все отображается правильно.
Запускал тесты в TeamCity - но там они запускаются по обычному - открывая браузеры, которые я вижу, и все ок

Так тесты и нужно запускать : -) Если напрягает, открытие браузера и выполнение сценария “перед носом” - установите виртуальную машину и прогоняйте их там.

Повторюсь, но “Тесты нужно запускать в открытом браузере, а не на фоне”. Так ваши приложения, будут полноценно отрисовываться, а селениум будет видеть всю необходимую DOM-структуру.

Что касательно вашего поведения в Jenkins. Скорее всего, последние билды Jenkins, по умолчанию уже содержат демона, который запускает тесты на фоне, что-то не отрисовывает на фоне и валится, - это нормально )

1 лайк

Спасибо. Наверное пришло время перебираться на нормальные сервера.