进行web自动化时频繁在某个元素上遇到报错异常:元素过期
原因
- 页面仍在进行JS加载或者仍在进行刷新
- 诸如下拉菜单,展开二级菜单之类的元件在点击展开后,到完全展开二级菜单时,对二级菜单的选项进行定位大概率会出现元素过期
解决
- 使用显式等待并且往
wait
对象的参数ignore_expected 中添加过期异常。 - 使用显式等待,自定义method,将条件设置为等待js脚本加载完毕
示例
添加忽略的异常
# 自定义忽略异常列表
ignored_exceptions = (NoSuchElementException, StaleElementReferenceException, TimeoutException)
# 使用 WebDriverWait 并忽略自定义异常
WebDriverWait(self.driver, 10, ignored_exceptions=ignored_exceptions).until(
EC.element_to_be_clickable((By.CSS_SELECTOR, ".el-menu>div:nth-child(3)>li>.el-submenu__title"))
).click()
自定义条件,以JS脚本加载完毕为分界点
wait.until(lambda driver : driver.execute_script('return document.readyState')=='complete')