Python 陈旧元素引用:元素未使用chrome web驱动程序附加到页面文档

Python 陈旧元素引用:元素未使用chrome web驱动程序附加到页面文档,python,selenium,staleelementreferenceexception,Python,Selenium,Staleelementreferenceexception,下午我已经读了很多关于这个问题的文章,但我目前缺少解决方案,很遗憾:( 我尝试浏览此网站: 我使用这段代码来存储不同存储区的每个url。为此,我必须在下一页迭代到最后一页 以下是我使用的代码: def get_urls(url) -> list: # Get all URLs to the store pages options = Options() # options.add_argument('--headless') path_chromedrive

下午我已经读了很多关于这个问题的文章,但我目前缺少解决方案,很遗憾:(

我尝试浏览此网站:

我使用这段代码来存储不同存储区的每个url。为此,我必须在下一页迭代到最后一页

以下是我使用的代码:

def get_urls(url) -> list:
    # Get all URLs to the store pages
    options = Options()
    # options.add_argument('--headless')
    path_chromedriver = Path(__file__).parent.parent.joinpath('externals/chromedriver')
    browser = webdriver.Chrome(str(path_chromedriver), chrome_options=options)
    browser.get(url)
    inputElement = browser.find_element_by_id("centre_search")
    inputElement.send_keys('london')
    inputElement.send_keys(Keys.ENTER)
    store_url = []
    links = browser.find_elements_by_link_text('Choose Centre')
    for link in links:
        href = link.get_attribute('href')
        store_url.append(href)
    while browser.find_element_by_xpath("//ul[@class='pagination']//li[last()]/a/small"):
            WebDriverWait(browser, 20).until(
                    EC.element_to_be_clickable((By.XPATH, "//ul[@class='pagination']//li[last()]/a/small"))).click()
            links = browser.find_elements_by_link_text('Choose Centre')
            for link in links:
                href = link.get_attribute('href')
                store_url.append(href)
    return store_url
不幸的是,我得到了一份工作

selenium.common.exceptions.StaleElementReferenceException:消息:stale元素引用:元素未附加到页面文档

使用Try…除了不是一个好的解决方案外,我正在寻找一个健壮的解决方案。 我应该从Chrome切换到Firefox吗

先谢谢你,
Nicolas。

不确定为什么您认为
尝试
/
,除了
不是好的解决方案,但这正是您需要的:

from selenium.common.exceptions import WebDriverException

def get_urls(url) -> list:
    # Get all URLs to the store pages
    options = Options()
    # options.add_argument('--headless')
    path_chromedriver = Path(__file__).parent.parent.joinpath('externals/chromedriver')
    browser = webdriver.Chrome(str(path_chromedriver), chrome_options=options)
    browser.get(url)
    inputElement = browser.find_element_by_id("centre_search")
    inputElement.send_keys('london')
    inputElement.send_keys(Keys.ENTER)

    links = browser.find_elements_by_link_text('Choose Centre')
    store_url = [link.get_attribute("href") for link in links]

    while True:
        try:
            WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.XPATH, "//li[last()][not(normalize-space(@class))]/a[@data-page]"))).click()
            WebDriverWait(browser, 10).until(EC.staleness_of(links[-1]))
        except WebDriverException:
            break
        links = WebDriverWait(browser, 10).until(EC.visibility_of_all_elements_located((By.LINK_TEXT, 'Choose Centre')))
        store_url.extend([link.get_attribute("href") for link in links])
    return store_url

如果没有
请尝试
/
除了
之外,您的脚本执行无论如何都会被异常中断。另外,请让我们知道为什么对
循环使用相同的
两次?哪一个for循环失败?因为我们有两个用例:1)没有迭代的情况下到达的第一页2)通过迭代每隔一页到达一页非常好的解决方案,但有时它会停留在我这边的最后一页。。。无限地试图到达下一页(这是不存在的)。嗯。。。从我这方面来说,效果很好。它实际上应该停止,因为在最后一页上“下一步”按钮不可单击,因此
click()
应该引发异常并中断循环。。。好啊尝试更新答案。我已将
[not(normalize space(@class))]
谓词添加到
li
节点,因此它与最后一页上的“下一步”按钮不匹配(因为它包含
class=“disabled”