首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何获取刷新div的数据(Selenium)

如何获取刷新div的数据(Selenium)
EN

Stack Overflow用户
提问于 2018-06-29 05:48:41
回答 2查看 87关注 0票数 2

我试图报废一个网站,其中有内容(Div),刷新每2秒。

我当前的代码运行得很好,而且我一直在获取StaleElementReferenceException,因为元素会持续刷新2秒。

下面是我到目前为止所得到的

代码语言:javascript
复制
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在后台刷新

,也能获得确切的目标内容

任何帮助或建议都将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-29 08:53:43

由于您的click()正在刷新元素,因此您必须收集DOM中的当前元素,因为您在开始循环之前收集的元素列表已经成为陈旧的

下面是一个如何循环并不断更新循环元素的列表对象的示例:

代码语言:javascript
复制
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中的项目长度发生了变化,或者侧边栏中的项目顺序发生了变化,您可能会遇到问题。

但是,背后的逻辑刷新您在上循环的元素列表仍然有效。

票数 1
EN

Stack Overflow用户

发布于 2018-06-29 06:06:21

我不知道如何在Python API中做到这一点,但在NodeJS WebDriver API中,您可以waitForVisible一个特定的XPath选择器,然后单击它。在您的示例中,选择器可以是:

代码语言:javascript
复制
//div[contains(@class, 'sidebar-wrapper')][text() = 'FOOTBALL']
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51091644

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档