Поскольку ваш 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
изменяется или изменяется порядок элементов в этой боковой панели, у вас могут возникнуть проблемы.
Но, тем не менее, логика, лежащая в основе , обновляет список элементов, над которыми вы зацикливаетесь все еще остается в силе.