Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何避免python selenium中的StaleElementReferenceException错误_Python_Selenium Webdriver_Xpath_Css Selectors_Webdriverwait - Fatal编程技术网

如何避免python selenium中的StaleElementReferenceException错误

如何避免python selenium中的StaleElementReferenceException错误,python,selenium-webdriver,xpath,css-selectors,webdriverwait,Python,Selenium Webdriver,Xpath,Css Selectors,Webdriverwait,关于这个错误有很多问题,但是没有一个能够帮助我解决这个问题 首先,我得到我需要的主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') 我将它们添加到列表中以避免出现错误,但它甚至

关于这个错误有很多问题,但是没有一个能够帮助我解决这个问题

首先,我得到我需要的主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。理想情况下,您需要引导所有元素的可见性(),您可以使用以下任一项:

  • 使用
    CSS\u选择器
    和文本属性:

    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")))])
    
    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")))])
    
  • 使用
    XPATH
    和文本属性:

    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")))])
    
    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