web抓取selenium python的过时异常

2024-09-30 10:38:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我想从tripadvisor获取信息。我有时会

消息:过时的元素引用:元素未附加到页面文档 (会话信息:chrome=47.0.2526.73) (驱动程序信息:chromedriver=2.20.353124(035346203162d32c80f1dce587c8154a1efa0c3b),平台=Mac OS X 10.10.4 x86_64)

然后元素就是我分配给它的任何东西。如何修复代码以处理该问题,然后找出解决方案,而不是重新运行代码?在

  def getElements(driver):
        elements = []
        for dd in driver.find_elements_by_xpath("//*[contains(@class, 'ui_button original')]"):
            try:
                if dd.text == "Book Now":
                    elements.append(dd)
            except Exception as ee:
                print ee
        return elements 

def getBookingPartner(driver, ibInfo):
    data = []
    i = 0 
    elements = []
    time.sleep(2)
    elements = getElements(driver)
    elementCounter = 0
    while(elements == [] or elementCounter >5):
        elements = getElements(driver)
        elementCounter+=1

    print "Length of elements should be > 0 : " + str(len(elements))
    for ii in ibInfo:
        if ii[0] == "Yes":
            driver.implicitly_wait(3)
            bookingPartner = "Error"    
            print ii    
            driver.implicitly_wait(3)
            try:
                elements[i].click()
                driver.implicitly_wait(3)
                driver.switch_to_window(driver.window_handles[-1])
            except Exception as ee:
                try:
                    driver.refresh()
                    getElements(driver)[i].click()
                    time.sleep(1)
                    driver.switch_to_window(driver.window_handles[-1])
                except Exception as ee:
                    print "Stale Exception...."
                    print ee    
            try:
                driver.implicitly_wait(3)
                driver.find_elements_by_xpath("//*[contains(@class, 'book_now')]")[1].click()
                driver.implicitly_wait(1)
                page = etree.HTML(driver.page_source)
                bookingPartner = page.xpath("//div[contains(@class, 'custServiceMsg')]//text()")[0].split("will")[0].strip()                    
            except:
                try:
                    time.sleep(3)
                    driver.find_elements_by_xpath("//*[contains(@class, 'book_now')]")[1].click()
                    time.sleep(2)
                    page = etree.HTML(driver.page_source)
                    bookingPartner = page.xpath("//div[contains(@class, 'custServiceMsg')]//text()")[0].split("will")[0].strip()                    
                except:
                    try:
                        bookingPartner = page.xpath("//div[contains(@class, 'custServiceMsg')]//text()")[1].split("will")[0].strip()
                    except Exception as ee:
                        bookingPartner = "Error"
                        print "error"
            i+=1

            if bookingPartner == "The remainder":
                bookingPartner = page.xpath("//div[contains(@class, 'custServiceMsg')]//text()")[1].split("will")[0].strip()

            if len(driver.window_handles) > 1:
                driver.close()
                driver.switch_to_window(driver.window_handles[0])

            print bookingPartner

            data.append([ii[0], ii[1], bookingPartner])
        else:
            data.append([ii[0], ii[1], "N/A"])
            ii.extend(["N/A"])

        print data
    return data

Tags: textdriverpageexceptionelementswindowxpathee
1条回答
网友
1楼 · 发布于 2024-09-30 10:38:20

当元素:

  1. 已被删除
  2. 不再附加到DOM(如您的情况)
  3. 已经改变了

从文件中:

You should discard the current reference you hold and replace it, possibly by locating the element again once it is attached to the DOM.

即:再次“找到”元素。在

您需要修改代码,以便在适当的步骤中捕获此错误。在

from selenium.common.exceptions import StaleElementReferenceException

elem = driver.find_element_by_xpath('something leaves dom')
# ... do other actions which change the page and then later...
try:
    elem.click()
except StaleElementReferenceException:
    elem = driver.find_element_by_xpath('something leaves dom')
    elem.click()

如果您需要一个可重用的版本来处理多个元素。在

顺便说一句,您不应该在代码中捕捉Exception。明确你想处理哪些问题。在

相关问题 更多 >

    热门问题