Как получить данные освежающего div (Selenium) - PullRequest
0 голосов
/ 29 июня 2018

Я пытаюсь удалить веб-сайт с контентом (div), который обновляется каждые 2 секунды.

Мои текущие коды работают нормально, кроме того, я продолжаю получать StaleElementReferenceException, потому что элементы продолжают обновлять все 2 секунды.

Вот то, что я имею до сих пор

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.chrome.options import Options


import time, sys

option = webdriver.ChromeOptions()
browser = webdriver.Chrome(executable_path='chromedriver', chrome_options=option)
browser.get("example.com")

sports_categories = browser.find_elements_by_css_selector('div.sidebar-wrapper')

for sport in sports_categories:
   if sport.text == 'FOOTBALL':
        sport.click()
        time.sleep(2)

        sub_menus_html = browser.find_element_by_css_selector('div.category.lvl1.open  div.dropdown')

        print(sub_menus_html)

Мой вопрос,

  • Как мне справиться с этим сценарием, чтобы у меня был точный целевой контент, даже если div обновляются в фоновом режиме

Любая помощь или предложение будет высоко ценится.

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Поскольку ваш click() обновляет элементы, вы должны собрать текущие элементы в DOM , поскольку список элементов, собранных до начала цикла, стал STALE .

Вот пример того, как вы будете выполнять цикл и постоянно обновлять объект списка элементов, по которым вы делаете цикл:

option = webdriver.ChromeOptions()
browser = webdriver.Chrome(executable_path='chromedriver', chrome_options=option)
browser.get("example.com")

sports_categories = browser.find_elements_by_css_selector('div.sidebar-wrapper')

# add counter to keep track
counter = 0
for sport in sports_categories:
    #add category refresh here
    current_categories= browser.find_elements_by_css_selector('div.sidebar-wrapper')
    if current_categories[counter].text == 'FOOTBALL':    
        current_categories[counter].click()
        # I would recommend using something other than sleep to wait for load
        # like webdriverwait conditions combined with Expected Conditions
        time.sleep(2)
        sub_menus_html = browser.find_element_by_css_selector('div.category.lvl1.open  div.dropdown')
        print(sub_menus_html)
    counter += 1

Поскольку у меня нет доступа к веб-сайту, над которым вы работаете, я не уверен, будет ли работать этот точный блок кода , как .

Если длина элементов в div.sidebar-wrapper изменяется или изменяется порядок элементов в этой боковой панели, у вас могут возникнуть проблемы.

Но, тем не менее, логика, лежащая в основе , обновляет список элементов, над которыми вы зацикливаетесь все еще остается в силе.

0 голосов
/ 29 июня 2018

Я не уверен, как это сделать в Python API, но в NodeJS WebDriver API вы можете waitForVisible конкретный XPath селектор и затем щелкнуть по нему. в вашем случае селектор может быть:

//div[contains(@class, 'sidebar-wrapper')][text() = 'FOOTBALL']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...