Selenium 请教各位大佬,如何让整个页面加载完再点击

Eric · 2022年06月08日 · 最后由 卡丁车卡丁丁 回复于 2022年06月10日 · 6860 次阅读

web 项目 ui 自动化遇到问题:使用 click() 点击元素报 ElementClickInterceptedException
分析步骤:
使用 js 脚本将所要点击元素标红高亮,能确定元素是定位存在,但是页面 loading 没加载完
所以想请教下大家如何处理能使页面加载完再定位元素进行点击,使用了显式等待和隐式等待都不行(排除强制等待)

共收到 20 条回复 时间 点赞

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 方法

Eric #3 · 2022年06月09日 Author

感谢,js 有点差,我去搜一下相关用法

Eric #4 · 2022年06月09日 Author
空空 回复

感谢大佬,我只会 python,我试着这方法 python 实现😂

selenium 不是本身就有判断是否可点击的方法?

Eric #6 · 2022年06月09日 Author
陈辉 回复

已经找出不可点击的是因为页面没加载完的原因了,就是想了解处理方法

我知道,有偿回答😎

Eric #9 · 2022年06月09日 Author
浪客剑心 回复

1.我这能定位到元素,可不可以说明 dom 树是已经加载完成的了?
2.js 判断 document,用 python 是不是这样处理?

self.driver.execute_script("document.readyState == 'complete'")

ui 自动化新手,忘大佬指教😊

Eric #10 · 2022年06月09日 Author
50how 回复

穷啊,这不是在学技术准备以后卖技术么

selenium 自带的隐式等待: implicitly_wait(),应该可以满足你的需求

Eric #13 · 2022年06月10日 Author
Dovis 回复

试过不行

window.onload=function(){
document.getElementById("id").style.color="black";
},这样试试看

Eric 回复

先确定是不是加载的问题,一般 sleep 几秒再点击能成功的话,多半都是加载的问题,还不行的话,试试用 js 方法点击 self.driver.execute_script("arguments[0].click();", ele)

WebDriver 寻找元素的三种策略了解一下,可以全局设置

WebDriver 采用默认的寻找元素的策略好像是主框架加载成功即执行 findElement 的操作,还有一种策略是等待页面全部资源加载成功才会去执行 findElement 的动作

封装一个等待 loading 消失的方法,点击前先判断 loading 是否消失

显式等待不顶用吗?

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册