Python,Selenium:'元素不再附加到DOM'

Vip*_*pul 4 python selenium web-crawler selenium-webdriver

我正在抓一个网站www.lipperleaders.com.我想提取新加坡的资金细节.我已成功实施下拉选择,并提取了提交选项后出现的第一页的内容.但是当我尝试转到下一页(通过使代码单击下一个按钮)时,我收到错误'Element is no longer attached to the DOM'.

我的代码大约有100行,但我可以大致了解代码的执行流程:

...                    # creating driver object and all the imports
def main():
    ...
    result = find_elements_by_tag_name('span')  
    ...
    driver.find_element_by_id("ctl00_ContentPlaceHolder1_ucDataPager_btnNext").click()
    main()
main()
Run Code Online (Sandbox Code Playgroud)

此代码适用于第1页,但main()在单击下一个按钮后再次调用时.在这个递归方法之前,我也试过把它放在一个循环中,然后也是同样的错误.

如果我写相同的代码,如:

# some code
result = find_elements_by_tag_name('span')  
driver.find_element_by_id("ctl00_ContentPlaceHolder1_ucDataPager_btnNext").click()
# some code
driver.find_element_by_id("ctl00_ContentPlaceHolder1_ucDataPager_btnNext").click()
.
.
Run Code Online (Sandbox Code Playgroud)

这段代码可以很好地处理下一页加载的任何错误,并执行之后编写的代码.但是我不能driver.find_element_by_id().click()为500页写相同的内容,即使我必须重复与每个页面相关的其余代码.这就是为什么我尝试循环或递归,但它不适合我.

请让我知道我的方法有什么问题.

Pro*_*e85 7

问题是该元素被某些javascript分离.所以你应该让驱动程序等待元素:这是通过设置完成的implicitly_wait,参见:

from selenium import webdriver

ff = webdriver.Firefox()
ff.implicitly_wait(10) # seconds
...
myDynamicElement = ff.find_element_by_id("myDynamicElement")
Run Code Online (Sandbox Code Playgroud)

来自 http://docs.seleniumhq.org/docs/04_webdriver_advanced.jsp#implicit-waits