(python)stale元素参考:元素未附加到页面文档

时间:2020-03-23 12:41:11

标签: python selenium web-scraping scrapy

我正在抓取亚马逊产品,但首先,我想单击每个类别,该代码仅与循环中的第一个类别一起使用,并得到此错误,我对此进行了搜索并找到了许多答案,但他们没有不能在循环内工作,它们都可以使用xpath(一个元素而不是元素)

第一次点击(see_more)工作,点击循环出现问题

错误:

selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document
  (Session info: chrome=80.0.3987.149)

这是代码。

from selenium.common.exceptions import ElementClickInterceptedException

from csv import writer

from selenium.webdriver import ActionChains

driver = webdriver.Chrome(executable_path='C:\\Users\\Compu City\\Desktop\\chromedriver.exe')
driver.get('https://www.amazon.com/international-sales-offers/b/?ie=UTF8&node=15529609011&ref_=nav_navm_intl_deal_btn')
time.sleep(10)
res = driver.execute_script("return document.documentElement.outerHTML", 'window.scrollBy(0,2000)')
soup = BeautifulSoup(res, 'lxml')
cat=[]
filter_con = driver.find_element_by_id('widgetFilters')  # main container of products
cats=driver.find_elements_by_css_selector('.a-expander-container .a-checkbox label .a-label')
see_more =driver.find_element_by_css_selector('#widgetFilters > div:nth-child(1) > div.a-row.a-expander-container.a-expander-inline-container > a > span')
ActionChains(driver).move_to_element(filter_con).click(see_more).perform()
cat= 0
while(cat < len(cats)):
    print(cat)
    print(cats[cat].text)
    action = ActionChains(driver).move_to_element(filter_con).click(cats[cat]).perform()
    cat+=1

1 个答案:

答案 0 :(得分:0)

单击cat元素后,cats中的引用将刷新,这意味着硒将获得对每个元素的一组新引用。而且,当您仍然指向较早的参考文献时,您将获得Stale Element Exception。如下更新代码。

选项1:修复现有代码

while(cat < len(cats)):
    currentCat = driver.find_elements_by_css_selector('.a-expander-container .a-checkbox label .a-label')[cat]
    print(cat)
    print(currentCat.text)
    action = ActionChains(driver).move_to_element(filter_con).click(currentCat).perform()
    cat+=1

选项2:使用for循环(无操作链)

for catNumber in range(len(cats)):
    cat = driver.find_elements_by_css_selector('.a-expander-container .a-checkbox label .a-label')[catNumber+1]
    print(catNumber+1)
    # scroll to the elemen
    cat.location_once_scrolled_into_view
    # click
    cat.click()