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

HtmlUnitDriver и PhantomJS как замена для FirefoxDriver (java)

htmlunitdriver
phantomjs
webdriver
Теги: #<Tag:0x00007f7b6971bbf0> #<Tag:0x00007f7b6971b9e8> #<Tag:0x00007f7b6971b880>

(Apexuser) #1

У меня есть куча кода, написанного для FirefoxDriver. Сейчас немного переписываю код, попутно решил заменить FirefoxDriver на что-нибудь другое (надо запускать код на сервере, где только командная строка).
Столкнулся с такой проблемой (у меня вообще задача нетипичная, я не тестирую, а занимаюсь парсингом форума. Для себя, от нечего делать. Форум на движке phpBB).
У меня есть куча кусков такого рода. Сначала я нахожу список одинаковых элементов:

List<WebElement> list = driver.findElements(By.cssSeelctor("css selector"));

Потом внутри каждого из этих элементов мне надо искать другие элементы:

for (WebElement e : list) {
    List<WebElement> anotherList = e.findElements(By.cssSeelctor("another css selector"));
}

Проблема в следующем: если элементов с указанным селектором нет (а их часто нет), то FirefoxDriver и HtmlUnitDriver в этом случае возвращают список нулевого размера. В PhantomJS, если вызываешь метод findElements объекта PhantomJSDriver - он тоже возвращает пустой лист (это ОК), а вот когда вызываешь метод findElements объекта WebElement - он выбрасывает NoSuchElementException, а на их обработку уходит колоссальное количество времени (потому что 90%, наверное, всей работы заключается в поиске того, чего часто нет). В итоге код работает в час по чайной ложке - примерно раз в 10 - 20 медленнее, чем FirefoxDriver.
Кто что может посоветовать? Хотелось бы ускорится.


#2

Может я не совсем понял вопрос…

Добавте проверку ожидания элемента, например так, а уже потом получайте его параметры


(Apexuser) #3

Не, у меня другое. Если какого-то элемента нет на странице - то его уже и не будет, это не вопрос ожидания. Главное просто проверить - есть или нет.
На самом деле, я хотел уточнить вопрос и подготовить минимальный работающий пример, но у меня возникли проблемы с воспроизводимостью результата. Как воспроизведу, так напишу.


#4

Вы можете проверять наличие и в зависимости от результата либо получать список элементов, либо ассерт.
Можно ловить эксепшн NoSuchElementException и обрабатывать его.


(Apexuser) #5

Это как?


#6

Для WebElement есть boolean метод isDisplayed. Вы можете проверить есть ли элемент на странице, и дальше уже строить логику работы своей программы.