Ссылка на устаревший элемент: элемент не прикреплен к документу страницы с помощью веб-драйвера chrome

Я уже прочитал много тем, посвященных этой проблеме, но в настоящее время, к сожалению, мне не хватает решений:(

Я пытаюсь почистить этот сайт: https://www.kumon.co.uk/find-a-tutor/

Я использую этот код для хранения каждого 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: Сообщение: устаревшая ссылка на элемент: элемент не прикреплен к документу страницы

Чтобы использовать Try... Кроме того, это не хорошее решение, я ищу надежное решение. Должен ли я перейти с Chrome на Firefox?

Спасибо заранее, Николас.

1 ответ

Решение

Не уверен, почему ты так думаешь try/except Это не хорошее решение, но это именно то, что вам нужно:

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
Другие вопросы по тегам