web 项目 ui 自动化遇到问题:使用 click() 点击元素报 ElementClickInterceptedException
分析步骤:
使用 js 脚本将所要点击元素标红高亮,能确定元素是定位存在,但是页面 loading 没加载完
所以想请教下大家如何处理能使页面加载完再定位元素进行点击,使用了显式等待和隐式等待都不行(排除强制等待)
可以用个 js 来处理 调用原生 js 方法 类似
window.onload 方法
public void waitPageLoadComplete(long timeOutSeconds) {
new WebDriverWait(utils.driver, timeOutSeconds).until(
webDriver -> ((JavascriptExecutor) webDriver).executeScript("return document.readyState").equals("complete"));
}
selenium 不是本身就有判断是否可点击的方法?
要看你前端加载的资源多不多,网络怎么样,selenium 自带的和 js 判断 document 都不算页面真正加载完成,这些都是基于 dom 加载的,dom 加载完了还有资源加载,如果资源加载时间太长,dom 加载完了,前端有 loading 判断要等资源加载的话,加了 loading 页,一样的操作不了元素
我知道,有偿回答
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 是否消失
selenium 提供了很多显示等待方法, 合理使用基本可以解决, 建议使用下面两个方法试试
WebDriverWait(driver, timeout).until(ec.element_to_be_clickable(locator))
WebDriverWait(driver, timeout).until(ec.visibility_of_element_located(locator))
显式等待不顶用吗?