如何避免 python selenium 中的 StaleElementReferenceException 错误
How to avoid StaleElementReferenceException error in python selenium
关于这个错误有很多问题,但是 none 其中的问题可以帮助我解决这个问题。
首先我得到我需要的主要 url 的 ID
url = 'http://www.mosquedirectory.co.uk/browse/uk/england/london'
browser = webdriver.Chrome()
browser.get(url)
listing = browser.find_elements_by_id('directory_listingBrowse')
我将它们附加到列表中以避免错误,但它甚至没有用
hold = []
for i in listing:
hold.append(i)
然后从这些保持列表中循环 for 循环,这也是代码的其余部分
for i in hold:
try: ulclass = i.find_elements_by_css_selector('ul.c')
except StaleElementReferenceException:
pass
link = []
for i in ulclass:
a = i.find_element_by_tag_name('a')
link.append(a.get_attribute('href'))
for i in link:
browser.get(i)
browser.get(url)
time.sleep(2)
我什至尝试使用 try 方法避免错误,但没有成功。在代码的末尾,我说回到旧页面,再次避免错误。它甚至没有再次工作。我缺少哪一部分。
而不是存储 s you can store the textContents. Ideally you need to induce for visibility_of_all_elements_located()
and you can use either of the following :
使用 CSS_SELECTOR
和 text 属性:
driver.get("http://www.mosquedirectory.co.uk/browse/uk/england/london")
print([my_elem.text for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "#directory_listingBrowse h2 a")))])
使用 XPATH
和 text 属性:
driver.get("http://www.mosquedirectory.co.uk/browse/uk/england/london")
print([my_elem.text for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//div[@id='directory_listingBrowse']//h2//a")))])
注意:您必须添加以下导入:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
控制台输出:
['Barking and Dagenham (10)', 'Barnet (13)', 'Bexley (2)', 'Brent (26)', 'Bromley (4)', 'Camden (20)', 'City of London (8)', 'Croydon (17)', 'Ealing (20)', 'Enfield (10)', 'Greenwich (7)', 'Hackney (21)', 'Hammersmith and Fulham (14)', 'Haringey (12)', 'Harrow (11)', 'Havering (4)', 'Hertforshire (1)', 'Hillingdon (8)', 'Hounslow (9)', 'Islington (17)', 'Kensington and Chelsea (12)', 'Kingston upon Thames (2)', 'Lambeth (16)', 'Lewisham (3)', 'Loughton (1)', 'Merton (7)', 'Middlesex (21)', 'Newham (59)', 'Redbridge (25)', 'Richmond upon Thames (1)', 'Romford (4)', 'Southwark (13)', 'Sutton (4)', 'Tower Hamlets (76)', 'Waltham Forest (21)', 'Wandsworth (9)', 'Westminster (27)']
方法略有改变。先收集所有链接,再根据需要进行处理。
url = 'http://www.mosquedirectory.co.uk/browse/uk/england/london'
browser = webdriver.Chrome()
browser.get(url)
listings = WebDriverWait(browser, 30).until(EC.presence_of_all_elements_located((By.XPATH, "//div[@id='directory_listingBrowse']//ul//*//a[@href]")))
all_links = [listing.get_attribute('href') for listing in listings]
for link in all_links:
browser.get(link)
#do whatever else here
不要忘记添加这些导入:
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
关于这个错误有很多问题,但是 none 其中的问题可以帮助我解决这个问题。
首先我得到我需要的主要 url 的 ID
url = 'http://www.mosquedirectory.co.uk/browse/uk/england/london'
browser = webdriver.Chrome()
browser.get(url)
listing = browser.find_elements_by_id('directory_listingBrowse')
我将它们附加到列表中以避免错误,但它甚至没有用
hold = []
for i in listing:
hold.append(i)
然后从这些保持列表中循环 for 循环,这也是代码的其余部分
for i in hold:
try: ulclass = i.find_elements_by_css_selector('ul.c')
except StaleElementReferenceException:
pass
link = []
for i in ulclass:
a = i.find_element_by_tag_name('a')
link.append(a.get_attribute('href'))
for i in link:
browser.get(i)
browser.get(url)
time.sleep(2)
我什至尝试使用 try 方法避免错误,但没有成功。在代码的末尾,我说回到旧页面,再次避免错误。它甚至没有再次工作。我缺少哪一部分。
而不是存储 visibility_of_all_elements_located()
and you can use either of the following
使用
CSS_SELECTOR
和 text 属性:driver.get("http://www.mosquedirectory.co.uk/browse/uk/england/london") print([my_elem.text for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "#directory_listingBrowse h2 a")))])
使用
XPATH
和 text 属性:driver.get("http://www.mosquedirectory.co.uk/browse/uk/england/london") print([my_elem.text for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//div[@id='directory_listingBrowse']//h2//a")))])
注意:您必须添加以下导入:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC
控制台输出:
['Barking and Dagenham (10)', 'Barnet (13)', 'Bexley (2)', 'Brent (26)', 'Bromley (4)', 'Camden (20)', 'City of London (8)', 'Croydon (17)', 'Ealing (20)', 'Enfield (10)', 'Greenwich (7)', 'Hackney (21)', 'Hammersmith and Fulham (14)', 'Haringey (12)', 'Harrow (11)', 'Havering (4)', 'Hertforshire (1)', 'Hillingdon (8)', 'Hounslow (9)', 'Islington (17)', 'Kensington and Chelsea (12)', 'Kingston upon Thames (2)', 'Lambeth (16)', 'Lewisham (3)', 'Loughton (1)', 'Merton (7)', 'Middlesex (21)', 'Newham (59)', 'Redbridge (25)', 'Richmond upon Thames (1)', 'Romford (4)', 'Southwark (13)', 'Sutton (4)', 'Tower Hamlets (76)', 'Waltham Forest (21)', 'Wandsworth (9)', 'Westminster (27)']
方法略有改变。先收集所有链接,再根据需要进行处理。
url = 'http://www.mosquedirectory.co.uk/browse/uk/england/london'
browser = webdriver.Chrome()
browser.get(url)
listings = WebDriverWait(browser, 30).until(EC.presence_of_all_elements_located((By.XPATH, "//div[@id='directory_listingBrowse']//ul//*//a[@href]")))
all_links = [listing.get_attribute('href') for listing in listings]
for link in all_links:
browser.get(link)
#do whatever else here
不要忘记添加这些导入:
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait