Селен Явное ожидание пагинации - PullRequest
0 голосов
/ 21 февраля 2020

Я использую Selenium для навигации по страницам в очищающем проекте. Это HTML:

<input type="hidden" id="day_nr" value="2"/>
<div id="js-table" class="js-table table">
Day 2 of 2                
<div class="js-pager">
<input id="myCustomUrl" name="myCustomUrl" type="hidden" value="/Ranking/Rankings"/>
<div class="pagination-container">
<ul class="pagination">
   <li class=""><a class="days" id="day_1">Day 1</a></li>
   <li class="active"><a class="days" id="day_2">Day 2</a></li>
</ul>

Когда я нажимаю go для перехода на следующую страницу, мне нужно подождать несколько секунд, прежде чем вызвать функцию очистки, в противном случае таблица не будет загружена, и я Буду просто скрести данные с предыдущей страницы. Мне кажется, я должен быть в состоянии сделать это 3 способами:

1) Используя элемент ввода <input type="hidden" id="day_nr" value="2"/>:

element = wait.until(EC.text_to_be_present_in_element_value((By.ID, 'day_nr'), '2'))

2) Используя элемент div чуть ниже этого <div id="js-table" class="js-table table"> Day 2 of 2:

element = wait.until(EC.text_to_be_present_in_element((By.ID, 'js-table'), 'Day 2 of 2'))

3) Использование элемента списка с «активным» классом <li class="active"><a class="days" id="day_2">Day 2</a></li>:

element = wait.until(EC.text_to_be_present_in_element((By.CLASS_NAME, 'active'), 'Day 2'))

Все они запускаются без каких-либо ошибок, но программа все еще копирует данные с первой страницы, а не со второй. Кроме того, я создал некоторое время l oop, чтобы программа спала до тех пор, пока элемент с «активным» классом не совпадет с днем, который я собираюсь очистить; это работает просто отлично, но было бы намного чище, если бы я мог заставить явное ожидание работать.

Есть идеи, что я делаю неправильно?

1 Ответ

1 голос
/ 21 февраля 2020

Лучший способ, который я нашел для этого, это использовать wait для устаревших. Устаревший элемент - это элемент, который больше не привязан к DOM страницы. Например, вы получите исключение устаревшего элемента, если найдете элемент на странице и сохраните его в переменной, щелкните что-то, что переместится на новую страницу или перезагрузит текущую страницу, а затем попытаетесь взаимодействовать с объявленной вами переменной. ранее.

Вы можете использовать это, чтобы сообщить, когда страница была перезагружена, найдя и сохранив элемент на странице, перейдите на следующую страницу, подождите, пока элемент не устареет go, и затем продолжите. сценарий. Это будет выглядеть примерно так:

e = driver.find_element((By.ID, 'day_nr')); # grab an element from the current page
something.click() # navigate to new page
wait.until(EC.staleness_of(e)); # once e is stale, you know you are loading the new page
# now you are ready to scrape the next page
...do stuff

Для получения дополнительной информации см. документы или API

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...