硒元素引用:元素没有附加到页面文档中

  • 本文关键字:元素 文档 引用 python selenium
  • 更新时间 :
  • 英文 :


我导航到一个页面,然后找到剧集列表。我拿到每一集,然后点击该集的链接。但当我回到有剧集列表的页面时,会发生以下错误:

过时元素引用:元素未附加到页面文档

我的代码是:

navigator.get('https://anchor.fm/dashboard/episodes')
time.sleep(5)
#get list
list_episodes = navigator.find_element_by_xpath('//*[@id="app-content"]/div/div/div/div[2]/ul')
#get episodes in list
items =  list_episodes.find_elements_by_tag_name('li')
for item in items:
item.find_element_by_tag_name('button').click()
time.sleep(10)
navigator.find_element_by_xpath('//*[@id="app-content"]/div/div/div/div[2]/div/div[2]/div/div/div/button').click()
time.sleep(2)
navigator.find_element_by_xpath('//*[@id="app-content"]/div/div/div/div[2]/div/div[2]/div/div/div/div/div/div[1]/button[6]').click()
time.sleep(2)
navigator.find_element_by_xpath('//*[@id="app-content"]/div/div/div/div[3]/div[1]/div/div/div/button').click()
time.sleep(2)
navigator.find_element_by_xpath('//*[@id="app-content"]/div/div/div/div[3]/div[1]/div/div/div/div/div/div/button[1]').click()
time.sleep(2)
navigator.find_element_by_xpath('//*[@id="app-content"]/div/div/div/div[3]/div[3]/div/div/a').click()
time.sleep(3)
navigator.get('https://anchor.fm/dashboard/episodes')
time.sleep(5)

通过导航到另一个页面,所有由selenium web元素收集的内容(它们实际上是对物理web元素的引用(都不再有效,因为当您再次打开网页时会重新构建它
要使代码正常工作,您需要每次再次收集items列表
这应该有效:

navigator.get('https://anchor.fm/dashboard/episodes')
time.sleep(5)
#get list
list_episodes = navigator.find_element_by_xpath('//*[@id="app-content"]/div/div/div/div[2]/ul')
#get episodes in list
items =  list_episodes.find_elements_by_tag_name('li')
for i in range(len(items)):
item = items[i]
item.find_element_by_tag_name('button').click()
time.sleep(10)
navigator.find_element_by_xpath('//*[@id="app-content"]/div/div/div/div[2]/div/div[2]/div/div/div/button').click()
time.sleep(2)
navigator.find_element_by_xpath('//*[@id="app-content"]/div/div/div/div[2]/div/div[2]/div/div/div/div/div/div[1]/button[6]').click()
time.sleep(2)
navigator.find_element_by_xpath('//*[@id="app-content"]/div/div/div/div[3]/div[1]/div/div/div/button').click()
time.sleep(2)
navigator.find_element_by_xpath('//*[@id="app-content"]/div/div/div/div[3]/div[1]/div/div/div/div/div/div/button[1]').click()
time.sleep(2)
navigator.find_element_by_xpath('//*[@id="app-content"]/div/div/div/div[3]/div[3]/div/div/a').click()
time.sleep(3)
navigator.get('https://anchor.fm/dashboard/episodes')
time.sleep(5)
#get the `items` list again
items =  list_episodes.find_elements_by_tag_name('li')

在这种情况下,将页面视为类的实例是很有帮助的。它们可能有相同的名称、相同的属性、相同的值,但它们仍然是单独的对象,如果你引用了对象B,你就不能调用对象A。

以下是在这种情况下发生在你身上的事情;我强调了有趣的部分。

  1. 导航到目录页面
2. Server builds an instance of the page & displays it to you
  1. 您可以在页面上获取剧集对象
  2. 您导航到其中一集
5. Server destroys the directory page. Any objects in it you were 
holding disappear with it
6. Server builds a copy of the episode page & displays it to you
  1. 导航回目录页面
8. Server builds a new instance of the page & displays it to you
  1. 您尝试单击页面旧实例中已不存在的元素
  2. 您得到了一个过时的引用异常,因为您的引用现在已经过时了

解决此问题的方法是在每次导航到目录页面时查找剧集元素。如果你找到一次并存储它们,一旦你在其他地方导航,它们的父页就会变差。

此外,请注意您的Xpath:我鼓励您停止使用浏览器的"复制Xpath"功能,它通常不会得到好的结果。关于如何在网上编写好的Xpath,有很多教程值得一读。

最新更新