Как получить динамический контент с помощью Selenium в JavaScript

Проблема с извлечением динамического контента

У меня есть веб-страница, которая использует библиотеку для создания древовидной структуры с множественными вложенными элементами. Каждая ветка содержит кнопку, которая загружает данные через AJAX:

<button type="button" id="load_btn" class="tree_buttons" onclick="$(this).next('div#content_789').load('data_loader.php', {item_id:789,lang:'ru',type:'dynamic'}); $(this).next('div#content_789').show(); $(this).siblings('button#close_btn').show(); $(this).hide();" style="display: block;">Показать данные</button>

И пустой контейнер для данных:

<div id="content_789" style="background: #f0f0f0; display: none; margin: 5px 0px 15px 0px; padding: 10px;"></div>

После клика контейнер заполняется следующим содержимым:

<div id="content_789" style="background: #f0f0f0; display: block; margin: 5px 0px 15px 0px; padding: 10px;">
Автор И.П.; <a href="article.php" target="_blank">Статья первая</a>; 2020, том 5, стр 15-30<br>
Автор К.С.; <a href="article.php" target="_blank">Статья вторая</a>; 2021, том 6, стр 45-60<br>
</div>

Возможно ли с помощью Selenium автоматически раскрыть все элементы дерева и получить весь динамически загруженный контент? Как правильно дождаться загрузки AJAX и извлечь данные из обновленных div элементов?

да, такое вполне реально сделать с selenium! я делал похожую задачу недавно. главное правильно ждать пока ajax загрузится через WebDriverWait и expected_conditions. находишь все кнопки с классом tree_buttons, кликаешь по каждой и ждешь когда появится контент в соответствующем div. потом просто собираешь innerHTML со всех заполненых контейнеров. только не забудь поставить достаточный timeout, потому что ajax может подгружаться медленно особенно если данных много

А у меня была проблема с такими деревьями когда элементы пропадали из DOM после клика. Попробуй через execute_script напрямую вызывать jQuery функции из onclick - так надежнее чем обычный click(). И не забывай проверять что стиль display поменялся с none на block, это хороший индикатор что контент реально подгрузился.

тут важный момент - нужно обязательно проверять что div стал видимым и заполнился контентом, а не просто ждать фиксированное время. я использую element_to_be_clickable для кнопок и visibility_of_element_located для контейнеров. еще советую сначала найти все кнопки одним запросом через find_elements, а потом уже итерировать по ним - так стабильнее работает чем искать каждую по отдельности