在抓取数据时,Selenium错误"元素不再附加到DOM"

the*_*est 7 python selenium dom exception-handling selenium-webdriver

        for i in driver.find_elements_by_class_name("endorse-count"):
            try:
                i.click()
            except:
                continue

            elem = WebDriverWait(driver, 100).until(EC.presence_of_element_located((By.CLASS_NAME, "dialog-window")))
            src = elem.get_attribute("innerHTML")

            add_skill(name, src)

            WebDriverWait(driver, timeout=10)
Run Code Online (Sandbox Code Playgroud)

运行上面的代码时出现以下错误 -

selenium.common.exceptions.StaleElementReferenceException: Message: u'Element is no longer attached to the DOM' ; Stacktrace: 
    at fxdriver.cache.getElementAt (resource://fxdriver/modules/web_element_cache.js:7646)
Run Code Online (Sandbox Code Playgroud)

换行 -

src = elem.get_attribute("innerHTML")
Run Code Online (Sandbox Code Playgroud)

登录后,我在LinkedIn用户个人资料页面上运行此代码.

我尝试在"i.click()"之后添加以下代码行 -

driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
Run Code Online (Sandbox Code Playgroud)

但后来我看到函数"add_skill(name,src)"没有被调用,并且没有调用driver.manage()之后的代码,尽管for循环和i.click()工作正常.

Eve*_*ers 1

Selenium 尝试在验证目标元素是否已呈现在页面上之前完成操作(例如单击按钮或链接)。Selenium 可以更有耐心,但你必须明确要求他这样做。

例如,如果您正在测试发出 AJAX 请求的内容,您可以尝试如下操作(在 Ruby 中):

# timeout is in seconds
def wait_for_ajax(timeout=x)
 time_limit, interval = (Time.now + timeout), 0.5
 loop do
   break if @driver.execute_script "return jQuery.active == 0"
   sleep interval
   raise "Wait for AJAX timed out after waiting for #{timeout} seconds" if Time.now > time_limit
 end
end
Run Code Online (Sandbox Code Playgroud)

为了确保您的测试完全全面,请始终让 Selenium 在运行任务之前等待元素加载。