文章目录

  • 1、总览
  • 2、元素定位不到的原因之【页面元素没有及时加载】
  • 3、元素定位不到的原因之【页面元素不可见或不可点击】
  • 4、元素定位不到的原因之【页面元素是动态的】

1、总览

原因 解决方法
没有打开正确的网址 填写正确的网址
定位器选择错误 选择合适的定位器
定位表达式错误 简单粗暴:F12 copy或手写定位调试
元素嵌套在iframe中 1,切换到iframe中:driver.switch_to.frame(’ iframe的id或name值 ');2,再进行元素定位
元素在新窗口中 1,获取打开的多个窗口句柄:handles = driver.window_handles;2,切换到新窗口中: driver.switch_to.window(handles[-1])
页面元素没有及时加载 1,加等待,不要加的太少,加10s,如果10秒还找不到说明不是因为页面加载导致的元素找不到;2,确定是页面元素没有及时加载原因后,可以使用以下三种等待方式,详见1.2
页面元素不可见或不可点击 1,使用JavaScript实现元素定位和动作执行;2,使用鼠标事件ActionChains来操作;3,如果是被伪元素遮挡了原本的元素,可以直接定位到伪元素上进行点击操作 。详见1.3
页面元素是动态的 1.根据其他静态属性定位;2.根据元素属性值模糊匹配定位。 详见1.4
脚本流程与实际不符 调整脚本以符合实际业务流程

2、元素定位不到的原因之【页面元素没有及时加载】

问题定位思路:

  1. 加等待,不要加的太少,加10s,如果10秒还找不到说明不是因为页面加载导致的元素找不到
  2. 确定是页面元素没有及时加载原因后,可以使用以下三种等待方式
    (1)调试代码使用强制等待:sleep(10) ;
    (2)作用于全局使用隐式等待:driver.implicitly_wait(10)
    隐式等待一般在实例化dirver之后就设置,在服务端等待,作用于全局,也就是在driver的整个生命周期中生效。隐式等待是动态的查找所有元素,默认每隔0.5s轮询一次(也可以手动设置间隔时间),要查找的元素未加载完就继续等待,如果要查找的元素在规定的timeout时间内提前加载完,则结束等待,执行下一步操作;如果要查找的元素在规定的timeout时间内没有加载完,则会抛出异常。
    (3)提升用例执行效率使用显式等待
    显示等待在客户端等待,作用于指定元素,也就是只有在写了显示等待的语句中生效。显示等待也是动态的查找元素,要查找的元素未加载完就继续等待,如果要查找的元素在规定的timeout时间内提前加载完,则结束等待,执行下一步操作;如果要查找的元素在规定的timeout时间内没有加载完,则会抛出异常。需要用到两个类:WebDriverWait 和 expected_conditions

为什么要使用显示等待?

先来了解一下一般html页面上元素的呈现:

  • title出现 首先出现title
  • dom树出现 存在presence,但还不完整
  • css出现 可见visibility
  • js出现,js特效执行 可点击clickable

html文档是自上而下进行加载的,有些js通过异步加载的方式来完成js的加载
样式表下载完成之后会跟之前的样式表一起进行解析,会对之前的元素重新渲染

基于以上原理,我们知道,我们看到元素已经显示出来了,但是元素的某些属性可能还没有加载完全,比如元素是否是可见visibility、元素是否是可点击clickable,如果用隐式等待只能判断元素是否在dom树中出现,它无法判断元素是否可见,元素是否可点击,因此我们需要使用显示等待

显示等待可以处理隐式等待无法解决的一些问题,比如:上传文件(可以设置长一点),文件上传需要设置20s以上,但是如果设置隐式等待,它会在每个find方法都等这么长时间,一旦发现没有找到元素,就会等20s以后才抛出异常,影响case的执行效率,这时候就需要用显示等待,显示等待可以设置的长一点

设置显示等待的两种方法:

方法1:使用selenium自带的WebDriverWait 和 expected_conditions类,expected_conditions里面有很多定义好的判断条件供until使用
示例:

from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EClocator = (By.XPATH, '//*[@id=”current_price“]')
WebDriverWait(driver, 20, 0.5).until(EC.presence_of_element_located(locator))

方法2:使用lambda表达式
示例:

from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import Bylocator = (By.XPATH, '//*[@id=”current_price“]')
ele = WebDriverWait(self.driver, 20).until(lambda x: x.find_element(*locator))

3、元素定位不到的原因之【页面元素不可见或不可点击】

此处所说的【页面元素不可见或不可点击】的前提条件是:元素已经加载完全了!
如果页面元素还没加载完全,导致的不可见或不可点击,我们可以通过上面1.2的显示等待方法来处理

有一种情况是:页面元素明明已经加载完全了,也定位到了,但是就是执行无效,比如点击无效等,我们又该如何处理呢?

接下来我们就以testerhome.com (https://testerhome.com/account/sign_in)的登录页面的记住密码勾选框为例
问题:直接定位元素后用.click()方法会报错:

self.driver.find_element_by_xpath('//*[@id="user_remember_me"]').click()

报错信息如下:

分析报错信息:
定位表达式id="user_remember_me"确实是定位到了目标元素,但是报错提示:该元素:id="user_remember_me"不可点击,而其他元素:class="custom-control-label"却被接受点击了

再来看看页面源码:

既然是因为元素不可点击导致的问题,那自然也有对应的解决办法,以下列出了可行方案,可供参考

4、元素定位不到的原因之【页面元素是动态的】

怎么判断元素是否是动态?

  1. 首先应先确定时间等待没问题、且没有打开新页面、没有alert、没有frame,元素可见或可点击

  2. 此时最有可能的原因就是元素是动态的,元素动态有分两种:
    a.元素的属性是动态的
    可以尝试刷新一下网页查看该元素前后有没有变化,如果属性值改变了,即是动态属性了,较为常见的是元素的id属性,或class属性里有拼接一串数字的,就很有可能是动态元素了,如下图:

    b.元素的位置是动态的
    有些元素是因为某些框架技术自动生成的动态元素

    比如下图中【添加收货地址】按钮,

    未添加任何地址前,该元素是在最右侧://*[@id=“address-box”]/div[1]
    添加第一个地址后,该元素位置往右偏移了://*[@id=“address-box”]/div[2]
    添加第二个地址后,该元素位置再往右偏移://*[@id=“address-box”]/div[3]
    以此类推…

    又比如很多web网站的轮播图也是属于动态元素…

动态元素怎么定位?
针对 a.元素的属性是动态的的解决方法:

  1. 根据其他静态属性定位
    比如如果id属性是动态的,而class属性是静态的,则用class属性来定位
  2. 根据元素属性值模糊匹配定位
    driver.find_element_by_xpath("//标签名[contains (@属性,‘属性值’)]")
    driver.find_element_by_xpath("//标签名[starts-with (@属性,‘属性值’)]")
    driver.find_element_by_xpath("//标签名[end-with (@属性,‘属性值’)]")

针对b.元素的位置是动态的的解决方法:
可以通过遍历获取对应的下标,然后取最大下标进行定位

Selenium UI自动化测试中元素定位不到的原因和解决方法汇总相关推荐

  1. html设置margin无效,CSS中margin不起作用的原因及解决方法

    margin是一个属性,指定元素和元素之间的间距,但不能为内联元素指定边距,本篇文章将给大家介绍关于CSS中margin不起作用的原因及解决方法. margin不起作用的原因 对于初学者来说,可能会经 ...

  2. 微信小程序首页index.js获取不到app.js中动态设置的globalData的原因以及解决方法

    微信小程序首页index.js获取不到app.js中动态设置的globalData的原因以及解决方法 参考文章: (1)微信小程序首页index.js获取不到app.js中动态设置的globalDat ...

  3. 直接双击启动tomcat中的startup.bat闪退原因及解决方法

    直接双击启动tomcat中的startup.bat闪退原因及解决方法 参考文章: (1)直接双击启动tomcat中的startup.bat闪退原因及解决方法 (2)https://www.cnblog ...

  4. 投稿时html公式错误,Excel中出现公式常见显示错误原因与解决方法

    Excel2007的公式如果写错,就会在单元格中显示各种各样的错误信息.看到这些奇怪的错误代码,有的朋友可能会手忙脚乱,甚至感到烦躁.今天,学习啦小编就教大家在Excel中出现公式常见显示错误原因与解 ...

  5. php包含文件时显示空白页,php中出现空白页的原因及解决方法汇总_php技巧

    很多程序员在进行php开发的时候都遇到过出现空白页的请,综合分析来说,在php编程中出现空白页面可能是由以下几个原因造成的: 1.逻辑错误 逻辑错误是最难排除的,从表面上看,也许代码是合法的,是正规的 ...

  6. XP中CPU占用率100%原因及解决方法

    我们在使用Windows XP操作系统的时候,用着用着系统就变慢了,一看"任务管理器"才发现CPU占用达到100%.这是怎么回事情呢?遇到病毒了,硬件有问题,还是系统设置有问题,在 ...

  7. 运行selenium脚本,出现Can not connect to the Service chromedriver解决方法汇总!

    今天运行selenium脚本,出现Can not connect to the Service chromedriver 这个错误. 我大概百度一下,主要两种解决方法: 第一种.修改hosts里面的内 ...

  8. ubuntu12.04中shell脚本无法使用source的原因及解决方法

    现象: shell脚本中source aaa.sh时提示 source: not found 原因: ls -l `which sh` 提示/bin/sh -> dash 这说明是用dash来进 ...

  9. 服务器.bat文件启动闪退,直接双击启动tomcat中的startup.bat闪退原因及解决方法

    免安装的tomcat双击startup.bat后,启动窗口一闪而过,而且tomcat服务未启动. 原因是:在启动tomcat是,需要读取环境变量和配置信息,缺少了这些信息,就不能登记环境变量,导致了t ...

最新文章

  1. BUUCTF的Web真题学习整理(一)
  2. mysql创建的是拉丁_将MySQL数据库从拉丁转换为UTF-8
  3. IE的hasLayout
  4. uint8_t / uint16_t / uint32_t /uint64_t
  5. 程序员应该学会自我学习
  6. sqlserver2000分页
  7. “唵嘛呢叭咪吽”是什么意思? - 搜搜问问
  8. Amazon ES现更名为Amazon OpenSearch Service并支持OpenSearch 1.0
  9. RTI DDS 01
  10. 使用python爬取电子书_怎样用python3爬取电子书网站所有下载链接
  11. 信息系统项目管理师 论文
  12. Hadoop常见错误及解决方案、Permission denied: user=dr.who, access=WRITE, inode=“/“:summer:supergroup:drwxr-xr-x
  13. 解决Android调试微信页面,chrome的inspect弹出空白
  14. 用matplotlib.pyplot绘制线形图
  15. 切分数组--荷兰国旗问题
  16. STOTEN | 生态中心庄绪亮-群体感应在植物根际促生菌中的重要性
  17. 解决:Win10 显示无法连接到Internet,但是还能上网
  18. 无法用 CString 类型的值初始化 CWnd 类型的引用(非常量限定)
  19. 微信朋友圈公众号装B神器网站源码+可用于引流
  20. 为啥不能用比特币给贪官送礼?

热门文章

  1. 安全工具之TrueCrypt
  2. 数电实验一 逻辑门参数测试
  3. modbusTcp 从站和主站
  4. Appnium下载及安装
  5. python汉化 草蟒_草蟒首页、文档和下载 - Python 汉化版 - OSCHINA - 中文开源技术交流社区...
  6. 关于WiFi总是断网,联网会跳转MSN问题的解决方法
  7. 【四方向型】虚拟摇杆的构造及素材
  8. 计算机一级需要考哪些项目,计算机一级考什么
  9. Git之git commit --amend两种用法(五)
  10. 起底百度内部架构调整,吴恩达和王劲的离开只是一个剪影