我试图报废一个网站,其中有内容(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)
我的问题是,
,也能获得确切的目标内容
任何帮助或建议都将不胜感激。
发布于 2018-06-29 08:53:43
由于您的click()
正在刷新元素,因此您必须收集DOM中的当前元素,因为您在开始循环之前收集的元素列表已经成为陈旧的。
下面是一个如何循环并不断更新循环元素的列表对象的示例:
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
中的项目长度发生了变化,或者侧边栏中的项目顺序发生了变化,您可能会遇到问题。
但是,背后的逻辑刷新您在上循环的元素列表仍然有效。
发布于 2018-06-29 06:06:21
我不知道如何在Python API中做到这一点,但在NodeJS WebDriver API中,您可以waitForVisible
一个特定的XPath
选择器,然后单击它。在您的示例中,选择器可以是:
//div[contains(@class, 'sidebar-wrapper')][text() = 'FOOTBALL']
https://stackoverflow.com/questions/51091644
复制相似问题