web 项目 ui 自动化遇到问题:使用 click() 点击元素报 ElementClickInterceptedException
分析步骤:
使用 js 脚本将所要点击元素标红高亮,能确定元素是定位存在,但是页面 loading 没加载完
所以想请教下大家如何处理能使页面加载完再定位元素进行点击,使用了显式等待和隐式等待都不行(排除强制等待)
马克
selenium 提供了很多显示等待方法, 合理使用基本可以解决, 建议使用下面两个方法试试
WebDriverWait(driver, timeout).until(ec.element_to_be_clickable(locator))
WebDriverWait(driver, timeout).until(ec.visibility_of_element_located(locator))
public void waitPageLoadComplete(long timeOutSeconds) {
new WebDriverWait(utils.driver, timeOutSeconds).until(
webDriver -> ((JavascriptExecutor) webDriver).executeScript("return document.readyState").equals("complete"));
}
要看你前端加载的资源多不多,网络怎么样,selenium 自带的和 js 判断 document 都不算页面真正加载完成,这些都是基于 dom 加载的,dom 加载完了还有资源加载,如果资源加载时间太长,dom 加载完了,前端有 loading 判断要等资源加载的话,加了 loading 页,一样的操作不了元素
可以用个 js 来处理 调用原生 js 方法 类似
window.onload 方法
selenium 不是本身就有判断是否可点击的方法?
我知道,有偿回答
1.我这能定位到元素,可不可以说明 dom 树是已经加载完成的了?
2.js 判断 document,用 python 是不是这样处理?
self.driver.execute_script("document.readyState == 'complete'")
ui 自动化新手,忘大佬指教
selenium 自带的隐式等待: implicitly_wait(),应该可以满足你的需求
window.onload=function(){
document.getElementById("id").style.color="black";
},这样试试看
先确定是不是加载的问题,一般 sleep 几秒再点击能成功的话,多半都是加载的问题,还不行的话,试试用 js 方法点击 self.driver.execute_script("arguments[0].click();", ele)
WebDriver 寻找元素的三种策略了解一下,可以全局设置
WebDriver 采用默认的寻找元素的策略好像是主框架加载成功即执行 findElement 的操作,还有一种策略是等待页面全部资源加载成功才会去执行 findElement 的动作
封装一个等待 loading 消失的方法,点击前先判断 loading 是否消失
显式等待不顶用吗?