selenium 为什么这段代码没有单击列表中的每个元素?

jm81lzqq  于 2022-11-24  发布在  其他
关注(0)|答案(1)|浏览(130)

我试图进入每一个城市一个接一个在这里,但程序回来后,从第一页,它没有进入下一页,并显示StaleElementReferenceException错误。
这是我的代码:

url = "https://www.agoda.com/region/punjab-province-pk.html"

s=Service(ChromeDriverManager().install())

driver = webdriver.Chrome(service=s)
driver.implicitly_wait(5)
driver.get(url)

a = ActionChains(driver)

cities = driver.find_elements(By.CSS_SELECTOR, value='dt[data-selenium="neighbor-name"]')

for city in cities:
    print(city.text)
    a.double_click(city).perform()
    print(driver.current_url)
    driver.back()

即使当我只是打印列表中的元素时,它也会显示所有元素,但当我编写这些用于向前和向后导航的代码行时,它不会打印或单击这些元素。
我做错了什么?
任何帮助都将不胜感激。

wydwbb8l

wydwbb8l1#

当您通过单击city转到另一个页面时,最初在主页上的cities列表中收集的所有web元素都将失效。在Selenium中,Web元素实际上是对物理web元素的引用。当您返回主页时,它将重新呈现,以便以前收集的对web元素的引用不再指向这些元素。
要使代码正常工作,您需要在返回主页时再次收集cities列表。
应采用以下方法:

cities = driver.find_elements(By.CSS_SELECTOR, value='dt[data-selenium="neighbor-name"]')

for idx, city in enumerate(cities):
    city = cities[idx]
    print(city.text)
    a.double_click(city).perform()
    print(driver.current_url)
    driver.back()
    cities = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, 'dt[data-selenium="neighbor-name"]')))

相关问题