Почему селениум не находит определенный локатор на странице?
Более полугода неспешно боролся с нижеописанным багом в своих тестах и даже не смог прийти к какому-то рациональному обяъснению происходящему.
Итак, полностью в автоматическом режиме выполняются тесты на 2ух машинах, клиенте и селениум сервере, в котором в браузере загружается некий контент, ищутся по локаторам элементы веб интерфейса, нажимаются веб кнопки, чекбоксы и пр.
Проблема воспроизводится где-то в каждом пятом случае минимум, в определенном месте определенного тесткейса не находится элемент по локатору, а вернее кнопка delete
точное имя локатора:
//div[@class="listActionItem" and text()='delete']
Причем 3мя разными способами убеждался что такая кнопка присутствует:
1. Визуально на скриншоте эта кнопка видна
2. В отладчике добился воспроизведения и пошагово убедился, что кнопка присутствует и находится по вышеприведенному имени локатора ( с помощью плагина firebug в файерфоксе)
3. Сделал в тесте на этом шаге скидывание всего исходного html кода страницы в отдельный лог файл и убедился, что элемент с данным локатором присутствует
После неудачных попыток разобраться в чем проблема, решил сделать топорно воркэраунд, вставка пауз, повторные рефреши страниц, попытка вернуться на предыдущую страницу и зайти на проблемную заново, все это не решило проблему.
Непонятно почему именно эта кнопка оказалась проблемной, в тесте используется десятки других кнопок в том числе и delete на других страницах и нигде не было подобных проблем.
Непонятно почему проблема воспроизводится рандомно, т.е. по идее это говорит, что проблема не в имени локатора.
Кто какие новые идеи может предложить моему отчаявшемуся мозгу?
были похожие проблемы с watir-webdriver (реализация селениума на ruby).
в каждом случае вероятные причины и решения были разные, поэтому не в качестве универсального решения, а как идеи, что еще попробовать:
элемент находится в таблице или фрейме - помогает явно указать сначала таблицу/фрейм, потом уже идентификатор элемента;
таких элементов находится несколько (несколько раз перерисовывалась страница, старые кнопки скрывались - не спрашивайте меня, зачем, это не я), и находится первый, как раз невидимый - уточнить запрос так, чтоб находился активный;
просто элемент не находится по классу и непонятно, почему - попробовать найти по другим атрибутам (id, name, value, xpath и т.д).
Я имею в виду что-то вроде этого:
table= driver.findElement(By.id("table_id"));
button=table.findElement(By.id("button_id"));
Да, еще вспомнился такой вариант: кнопка срабатывала после двух событий: наведения на нее мышки+клика.
Соответственно, человек не может кликнуть, не наведя мышку, поэтому вручную все работало, а вебдрайвер не срабатывал.