Нестабильные тесты -- это едва ли не самое ужасное, что может случиться с автотестами. Поэтому надо с этим обязательно бороться.
Описанные ошибки относятся к совершенно разным типам.
- org.openqa.selenium.WebDriverException: Unable to bind to locking port 7055 within 45000 ms
- org.openqa.selenium.WebDriverException: Failed to connect to binary FirefoxBinary(/home/dmitriy/bin/firefox) on port 7063; process output follows:
На старт браузера Firefox отводится 45 секунд. И обе эти ошибки означают, что за это время браузер не смог запуститься.
Чтобы понять причину, нужно знать, как происходит запуск. Selenium запускает экземпляры браузер Firefox последовательно, даже если тесты выполняются параллельно. Перед началом запуска браузера поток выставляет блокировку на порт 7055, и пока эта блокировка стоит -- другие потоки ждут. После того, как браузер запустился -- блокировка снимается и какой-то другой поток получает возможность начать запускать свой браузер. После того, как браузеры запущены, они уже работают независимо, команды в них выполняются параллельно, но операция запуска устроена именно так, с блокировкой.
В результате, если вы собираетесь запустить, например, 10 браузеров одновременно в 10 потоках, и при этом время старта составляет, скажем, 10 секунд, произойдёт следующее. Один самый удачливый поток поставит блокировку и начнёт запускать браузер. А остальные 9 потоков ждут. Через 10 секунд порт освободится, следующий по удачливости поток захватит его и начнёт запускать браузер. А остальные 8 по прежнему ждут. После того, как это повторится 5 раз, то есть пройдёт 50 секунд, результат будет такой: 4 или 5 потоков успешно запустят браузер, а остальные 5 или 6 упадут с ошибкой.
Резюме:
1) Не пытайтесь запустить сразу много браузеров, растягивайте этот процесс по времени. Например, в Java для простоты можно сделать метод, который стартует браузеры, и пометить его модификатором synchronized. Это даст возможность ожидать не 45 секунд, а бесконечно долго, пока стартуют другие браузеры.
2) Если при запуске используется не пустой профиль, а начинённый разными дополнениями -- это значительно увеличивает время старта, постарайтесь это оптимизировать.
3) Используйте машину помощнее :)
- org.openqa.selenium.TimeoutException: Timed out after 30 seconds waiting for presence of any elements located by By.selector:
Это означает, что элемент не найден. Если он "иногда находится, а иногда не находится", это скорее всего следствие того, что какое-то предыдущее действие "иногда выполняется, а иногда не выполняется". Например, элемент должен появиться после нажатия какой-то кнопки, но если нажать на кнопку слишком рано (когда она disabled) -- то элемент не появляется. То есть на предыдущем шаге нужно добавить ожидание, и тогда действие будет правильно выполняться и элемент будет всегда успешно находиться.
Впрочем, возможна и более простая ситуация -- 30 секунд просто не хватило, и увеличение времени ожидания решит проблему.
- org.openqa.selenium.StaleElementReferenceException: Element not found in the cache - perhaps the page has changed since it was looked up
А это означает, что элемент был, но исчез. То есть вы его нашли, сохранили ссылку в какой-то переменной. А когда собрались с этим элементом выполнить какое-то действие -- элемент уже отсутствует в DOM.
Как с этим бороться?
1) Не искать элементы "заранее", выполнять поиск непосредственно перед тем, как совершать с ним действия.
2) Не работать с "короткоживущими элементами" (типа всяких сообщений, которые появляются на пару секунд, или индикаторов загрузки)
3) После StaleElementReferenceException делать повторную попытку -- снова нашли элемент и попытались выполнить действие ещё раз.