微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

遍历页面的 while 循环中的 StaleElementReferenceException

如何解决遍历页面的 while 循环中的 StaleElementReferenceException

设置

我使用 Python + Selenium 来抓取 this site 公司的信息。

由于该网站不允许我简单地加载页面 url,我计划单击列表底部下一页箭头元素并使用带有计数器的 while 循环。


代码

browser.get('https://new.abb.com/channel-partners/search#') 
wait.until(EC.visibility_of_element_located((By.CLASS_NAME,'abb-pagination')))

# start while loop and counter
c = 1
while c < 65:        
    c += 1

    # obtain list of companies element
    wait.until(EC.visibility_of_element_located((By.CLASS_NAME,'#PublicWrapper > main > section:nth-child(7) > div:nth-child(2)')))
    resultlist = el_css('#PublicWrapper > main > section:nth-child(7) > div:nth-child(2)') 

    # loop over companies in list
    for company in resultlist.find_elements_by_xpath('div'):
        
            # company name
            name = company.find_element_by_xpath('h3/a/span').text

            # code to capture more company info follows

    # next page arrow element 
    next_page_arrow = el_cn('abb-pagination__item--next')    
    next_page_arrow.click()    

问题

代码在 while 循环之外捕获了公司信息,也就是第一页。

但是,当插入 while 循环以遍历页面时,出现以下错误StaleElementReferenceException: stale element reference: element is not attached to the page document (Session info: chrome=88.0.4324.192)

如果我查看它,似乎后续页面resultlist 确实被捕获,但是 resultlist 中公司的循环产生了这个错误

怎么办?

解决方法

最简单的解决方案是使用隐式等待:

driver.get('https://new.abb.com/channel-partners/search#') 

company_name = []
while True:
    time.sleep(1)    
    company_name+=[elem.text for elem in wait.until(EC.presence_of_all_elements_located((By.XPATH,'//span[@property="name"]')))]
    # if next page arrow element still available,click,else break while
    if driver.find_elements_by_xpath('//li[@class="abb-pagination__item--next"]/a[contains(@href,"#page")]'):
        wait.until(EC.presence_of_element_located((By.XPATH,'//li[@class="abb-pagination__item--next"]/a'))).click()
    else:
        break

len(company_name)

输出:

951

您不需要计数器,您可以检查箭头 url 是否仍然可用,这样如果添加了第 65、66、[...] 页,您的逻辑仍然有效。

这里的问题是while太快,页面加载不及时。您也可以保存第一个公司名称列表,单击下一个箭头并与新列表进行比较,如果两者相同,请稍等,直到新列表与之前的列表不同。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?