我是Selenium自动化的新手。请记住这一点,请回答下面的问题,即使对那些技术人员来说听起来也很荒谬。
我试图获取页面中的所有ID: (我使用的是Python,也是使用Python的新手)
这是我使用的代码:
for b1 in driver.find_elements_by_xpath('//*[@id]'):
print b1.get_attribute('id')
虽然这会按预期显示ID,但在某一时刻脚本最终会出现' StaleElementReferenceException'。
我抓住了这个例外:
try:
for b1 in driver.find_elements_by_xpath('//*[@id]'):
print b1.get_attribute('id')
except StaleElementReferenceException:
print 'Exception'
现在,虽然捕获了异常,但我的脚本在那里停止而不显示所有ID。
它会显示所有ID,直到此异常点,然后停在那里。
如何让它继续执行它的操作并跳过此异常?
答案 0 :(得分:0)
忽略该异常可能会导致id
属性值丢失。
异常本身很可能是在您找到id
的所有元素时页面未完全加载的结果。给页面加载更多时间,然后找到元素。
您可以先尝试使用.set_page_load_timeout()
增加页面加载超时。或者,更可靠的方法可能是您的网页特定 - 使用WebDriverWait
等待页面上某个元素的存在/可见性,这可能表示该页面已被加载。例如,如果页面异步加载产品列表,则可以等待页面的第一个产品元素/块/部分的可见性。
如果页面不断加载和更新导致陈旧元素异常的DOM树,您可以force stop the page load。
作为旁注,如果您只需要获得id
属性和性能非常重要,那么使用selenium
执行此操作只会产生大量开销 - 每个get_attribute()
命令在循环中是JSON over HTTP command这是昂贵的(related topic,如果感兴趣)。相反,您可以等待页面加载,抓取driver.page_source
并使用HTML解析器,例如lxml
或BeautifulSoup
来提取id
属性值。
答案 1 :(得分:0)
您必须在异常处理中使用传递关键字:
except StaleElementReferenceException:
pass