首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >web抓取contat列表selenium python

问web抓取contat列表selenium python
EN

Stack Overflow用户
提问于 2018-06-04 07:59:24
回答 1查看 71关注 0票数 1

如何使用Python中的selenium遍历不一致的组中的联系人?我尝试了这段代码,出现了这样的错误: selenium.common.exceptions.StaleElementReferenceException:消息:的元素引用已过时;元素不再附加到DOM,它不在当前框架上下文中,或者文档已刷新

问题是滚动条和联系人都在不断更新...我试过这段代码:

代码语言:javascript
复制
while True:
    num=0
    try:
        users_list = driver.find_elements_by_css_selector("div.memberOnline-1CIh-0.member-3W1lQa")

        for user in users_list:
            num+=1
            user.click()
            driver.execute_script("arguments[0].scrollIntoView();",user)
            print('User number {}'.format(num))
    except StaleElementReferenceException and ElementClickInterceptedException:
            print('bad')
            driver.execute_script("arguments[0].scrollTop = arguments[0].scrollHeight",users_list)
EN

回答 1

Stack Overflow用户

发布于 2018-06-04 09:15:07

从您给定的代码中,您只需要滚动元素,所以Stale异常的原因是您没有等待页面加载完成,或者至少没有等待联系人未加载完成。

出于调试的目的,您可以简单地在循环之前添加一个长睡眠,如sleep(15),并替换为显式等待if生产代码,如

代码语言:javascript
复制
WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.ID, "myDynamicElement"))
)

here上显式等待的详细信息

如果在循环中调用click(),则需要在循环中再次查找元素:

代码语言:javascript
复制
while True:
    num=0
    try:
        time.sleep(15)
        users_list = driver
            .find_elements_by_css_selector("div.memberOnline-1CIh-0.member-3W1lQa")

        length = len(users_list)

        for num in range(0, length):
            user = users_list[num]
            user.click()
            time.sleep(15)

            driver.execute_script("arguments[0].scrollIntoView();",user)
            print('User number {}'.format(num+1))

            // because the above `click` make page happen changes
            // so selenium will treat it as a new page, 
            // those element reference found on `old` page, can not work on `new` page
            // you need to find elements belongs to `old` page again on `new` page
            // find users_list again from `new` page

            users_list = driver
                .find_elements_by_css_selector("div.memberOnline-1CIh-0.member-3W1lQa")

    except StaleElementReferenceException and ElementClickInterceptedException:
        print('bad')
        driver.execute_script("arguments[0].scrollTop = arguments[0].scrollHeight",
          users_list)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50672029

复制
相关文章

相似问题

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