2016-09-16 83 views
1

我想下载所有关于使用Selenium用Python将Chrome作为浏览器,但每次会话与此消息结束时间网页上的PDF格式:硒的Python StaleElementReferenceException

StaleElementReferenceException: stale element reference: element is not attached to the page document 
    (Session info: chrome=52.0.2743.116) 
    (Driver info: chromedriver=2.22.397933 

这是代码:

def download_pdf(self): 
    current = self.driver.current_url   
    lista_link_temp = self.driver.find_elements_by_xpath("//*[@href]") 
    for link in lista_link_temp: 
     if "pdf+html" in str(link.get_attribute("href")): 
      tutor = link.get_attribute("href") 
      self.driver.get(str(tutor)) 
      self.driver.get(current) 

请帮助我..我只是试着拉姆达,显性和隐性等待

感谢

回答

0

只要在循环中调用self.driver.get(),元素列表中的所有其他元素将变为陈旧。尝试从内容收集href属性,然后再探访他们:

def download_pdf(self): 
    current = self.driver.current_url 
    lista_link_temp = self.driver.find_elements_by_xpath("//*[@href]") 
    pdf_hrefs = [] 

    # You could do this part with a single line list comprehension too, but would be really long... 
    for link in lista_link_temp: 
     href = str(link.get_attribute("href")) 
     if "pdf+html" in href: 
      pdf_hrefs.append(href) 
    for h in pdf_hrefs: 
     self.driver.get(h) 
     self.driver.get(current) 
+0

太棒了!有用!谢谢..我失去了希望.. – LBdoc

+0

@Lddoc很高兴听到它! – elethan

0

当您搜索元素时,在对页面进行任何操作之前页面已更改/重新加载之前,您会收到陈旧元素。

确保页面在页面中执行任何操作之前已完全加载。

所以你需要先添加一个条件来等待页面加载,也许检查所有的请求完成。

+0

Thanks..I试图用隐性和显性等待而不success..I为了即使time.sleep试图等待页面加载.. – LBdoc

+0

你是对的,元素陈旧,因为他们已被重新加载,但据我所知,这不是一个等待项目加载的问题;一旦出现问题,你必须再次找到他们。 – elethan