Python Selenium:stale元素引用:元素未附加到页面文档

Python Selenium:stale元素引用:元素未附加到页面文档,python,python-3.x,selenium,Python,Python 3.x,Selenium,我的程序抛出错误消息Stale element reference:元素未附加到页面文档。当我查看以前的帖子时,比如,,,我发现我在调用click函数后没有更新url。我更新了网址。然而,它并没有解决这个问题。有人能指出我在哪里出错吗?这是我的密码: chrome_options = webdriver.ChromeOptions() chrome_options.add_argument("--disable-infobars") driver = webdriver.Chrome(chrom

我的程序抛出错误消息Stale element reference:元素未附加到页面文档。当我查看以前的帖子时,比如,,,我发现我在调用click函数后没有更新url。我更新了网址。然而,它并没有解决这个问题。有人能指出我在哪里出错吗?这是我的密码:

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--disable-infobars")
driver = webdriver.Chrome(chrome_options=chrome_options,executable_path="path of driver here")

driver.get("https://stackoverflow.com/users/37181/alex-gaynor?tab=topactivity")
if driver.find_elements_by_xpath("//a[@class='grid--cell fc-white js-notice-close']"):
    driver.find_element_by_xpath("//a[@class='grid--cell fc-white js-notice-close']").click()


inner_tabs = driver.find_elements_by_xpath("//div[@class='tabs']//a")

for inner_tab in inner_tabs:

    if inner_tab.text == "answers":
        inner_tab.click()
        time.sleep(3)
        driver.get(driver.current_url)
        continue

    if inner_tab.text == "questions":
        inner_tab.click()
        time.sleep(3)
        driver.get(driver.current_url)
        continue

driver.quit()

当您通过单击link或driver.get打开新URL时,它将创建新的文档元素,因此旧的元素内部选项卡将失效。要解决这个问题,首先收集所有URL,然后在循环中打开

urls_to_visit = []

for inner_tab in inner_tabs:
    if inner_tab.text in ["questions", "answers"]:
        urls_to_visit.append(inner_tab.get_attribute("href"))

for url in urls_to_visit:
    driver.get(url)
    time.sleep(3)

当您通过单击link或driver.get打开新URL时,它将创建新的文档元素,因此旧的元素内部选项卡将失效。要解决这个问题,首先收集所有URL,然后在循环中打开

urls_to_visit = []

for inner_tab in inner_tabs:
    if inner_tab.text in ["questions", "answers"]:
        urls_to_visit.append(inner_tab.get_attribute("href"))

for url in urls_to_visit:
    driver.get(url)
    time.sleep(3)

这是使用Selenium可能出现的最令人沮丧的错误之一。 我建议您这样做:

for tab in ['answers', 'questions']:
  js = "window.tab = [...document.querySelectorAll('div.tabs > a')].filter(a => a.innerText === '" + tab + "')[0]"
  driver.execute_script(js)
  driver.execute_script("if(window.tab) window.tab.click()")
  time.sleep(3)
  print(driver.current_url)

通过选择浏览器上下文内部,您可以避免过时的引用。

这是使用Selenium时可能出现的最令人沮丧的错误之一。 我建议您这样做:

for tab in ['answers', 'questions']:
  js = "window.tab = [...document.querySelectorAll('div.tabs > a')].filter(a => a.innerText === '" + tab + "')[0]"
  driver.execute_script(js)
  driver.execute_script("if(window.tab) window.tab.click()")
  time.sleep(3)
  print(driver.current_url)

通过选择浏览器上下文内部,您可以避免过时的引用。

我喜欢这个答案,但它仍然需要内部选项卡。获取属性参考以避免轰炸,这有点乐观。@pguardiario谢谢,我还是个新手,我需要了解更多关于硒的信息:我喜欢这个答案,但它仍然需要内部选项卡。让属性参考不轰炸,这有点乐观。@pguardiario谢谢,我还是个新手,我需要了解更多关于硒的信息:D