网站首页 > java教程 正文
各位小伙伴肯定会发现现在的测试岗招聘中或多或少要求会自动化测试技能了,伴随着整个测试行业的内卷,也要求所有从事测试的小伙伴掌握基本的自动化测试技能。但是很多人在刚开始学自动化测试时,会经常遇到一些棘手的问题,甚至抓耳挠腮也难解决,严重影响了学习进度,今天我就和大伙分享一下常见的问题及解决方案,希望能够对你掌握自动化测试有所帮助。
一、元素定位像是玄学,时而准确时而报错,怎么精准定位呢?
相信很多小伙伴对于几种元素定位方法应该都了然于胸了,如:ID定位,name定位,class定位,tag定位,XPath定位,CSS定位,Link定位,Partial link定位。像我就比较喜欢用CSS定位,感觉简洁美观,只有在ID定位可用,或者CSS定位不好用时才用其它定位方式。说到这肯定有小伙伴会说,XPath才是王道,对,此法确实能解决很多无法定位的情况,但是此刻我正想说如果此法也无济于事,那是什么原因导致的,又该如何是好呢?
出现XPath定位不到元素的情况,原因有多种,我们要从多方面排查。可能有服务器的问题,有动态ID问题,有特殊字符和转义问题,有iframe问题,有页面操作逻辑问题,最最可能的是你自己写错了路径。
1)什么是服务器问题呢,就是你写的路径是对的,但是代码请求后端服务器返回元素是有时间等待的,如果等待超过一定的时间,你的代码没有获取到对应的元素是会报错的,但是有时候网络特别好,又能抓到该元素,这就导致了时而能捕获,时而又失败的情况出现。如果是这种情况,只需要在代码中加入等待时间即可,如等待10秒就可以加上implicitly_wait(10)。
2)什么是动态ID问题呢,就是元素的属性是动态生成的,特别是ID或Class属性,XPath定位可能会受到影响,考这种情况可以虑使用其他属性或组合条件进行定位,或者使用包含关系来定位。
3)如果XPath表达式中包含特殊字符,确保进行适当的转义。一些字符(例如空格、括号等)可能需要使用转义符\来处理。
4)Iframe的问题是你没有切换进入iframe中,这种情况比较容易发现,如果目标元素位于
示例代码(使用Selenium)
iframe=driver.find_element_by_xpath("//iframe[@id='frameId']")
driver.switch_to.frame(iframe)
5)页面操作逻辑问题也会让你定位不到元素,也就是说必须要先出现其他元素或你要先操作一些步骤,你需要定位的元素才能出现,
6)还有一种情况,你直接复制xpath,得到的是绝对路径,然后运行的过程中这个路径无效了,你也定位不到元素,这种情况可以考虑使用相对路径来解决。
二、兼容性问题
兼容性问题不仅出现在手工测试中,还经常出现在UI自动化测试中,比如你当时编写的自动化脚本在谷歌运行正常,可是一放到IE浏览器就出问题了,这就是在编写脚本时缺少浏览器兼容考量带来的问题,脚本中没有深层次的区分判断浏览器的品种问题,这个需要你仔细分析2种浏览器带来的不同地方,然后针对性的修改你的自动化测试脚本,在脚本中多写预判,多写容错机制。
三、测试用例维护困难
随着项目的发展和变更,UI自动化测试用例可能会变得难以维护和调试,(所以有些小公司对于中小型项目干脆采用接口自动化,甚至完全放弃自动化测试,其实掌握合适的方法,只要测试时间允许,都是可以采用UI自动化的。)以下是解决方法:
1.使用Page Object模式:将页面对象和操作封装成可复用的Page Object,减少测试用例中的重复代码。
2.定期更新测试用例:及时跟进需求和变更,确保测试用例与实际业务场景保持一致。
3.使用版本控制工具:使用Git等版本控制工具来管理测试代码,方便回滚、合并和团队协作。
实例:
使用Page Object模式可以有效地分离页面操作和测试逻辑,提高测试用例的可维护性和稳定性,例如:
```
class LoginPage:
def__init__(self,driver):
driver
def input_username(self,username):
#输入用户名...
def input_password(self,password):
#输入密码...
def click_login_button(self):
#点击登录按钮...
#在测试用例中使用Page Object
login_page LoginPage(driver)
login__username("username")
login__password("password")
login__login_button()
```
四、测试用例执行顺序问题
刚开始写自动化脚本的萌新可能经常苦恼于有时候测试顺序无法按照自己的意愿来,或者本来设置好的顺序也可能在执行时错乱,导致依赖关系无法正确处理,其实这个问题也简单,只需要使用测试框架提供的测试运行器或测试套件机制,确保测试用例按照期望的顺序执行。
五、封装定位函数的时候,定位不了元素了,单独拿出来可以定位,一封装到函数中,就定位不了,这种该怎么办呢?
这种情况大部分是参数输入到函数中被改变了,参数来一段字符串,然后进入到函数内,发现这个字符串变了,特别是直接把定位元素某个值,直接传入到参数中,特别容易出问题。建议定义变量储存这个字符串,然后通过变量传递到函数内,然后在函数内再次验证这个字符串,如果ok再进行元素定位,如果不ok,就要想办法处理字符串,处理成你想要的结果。
其次就是建议在封装的函数中添加适当的异常处理,捕获可能发生的捕获可能发生的NoSuchElementException或其他异常,以便定位问题。打印相关信息帮助调试。
示例代码:
from selenium.common.exceptions import NoSuchElementException
def find_element(driver,by,value,timeout=10):
try:
element=WebDriverWait(driver,timeout).until(
EC.presence_of_element_located((by,value))
)
return element
except NoSuchElementException as e:
print(f"Element not found:{e}")
return None
还有就是作用域问题,如果封装的函数在切换了iframe或frame后执行,要确保在正确的作用域中进行元素定位。可以在函数中添加切换iframe的逻辑。
示例代码:
def find_element_in_frame(driver,frame_id,by,value,timeout=10):
driver.switch_to.frame(frame_id)
element=WebDriverWait(driver,timeout).until(
EC.presence_of_element_located((by,value))
)
driver.switch_to.default_content()#切回主文档
return element
总结:
做好自动化测试除了需要细心,耐心的品质,更需要在编程方面打好基础,无论是基于Python的自动化还是基于Java或者其它的自动化都是如此,一定要深入专研这门语言,了解语言的特性,这样才能在出现问题的时候有方向有思路去解决,多看看开发们写的代码对我们自动化软件测试工程师是有非常大的帮助。同时也要掌握多个自动化框架,如Robotframework、unittest、Pytest等等,知道根据项目的体量和特点灵活采取适合的自动化框架。只有做到这些,我们才能在自动化测试中游刃有余!
文末了,我邀请你进入我们的软件测试学习交流群,大家可以一起探讨交流软件测试,共同学习软件测试技术、面试等软件测试方方面面,了解测试行业的最新趋势,助你快速进阶Python自动化测试/测试开发,稳住当前职位同时走向高薪之路。
最后:
1)关注+私信回复:“测试”,可以免费领取一份10G软件测试工程师面试宝典文档资料。以及相对应的视频学习教程免费分享!
2)关注+私信回复:"入群" 就可以邀请你进入软件测试群学习交流~~
猜你喜欢
- 2025-04-06 软件测试常规测试方法有哪些?(软件测试常规测试方法有哪些内容)
- 2025-04-06 一个Web自动化测试的简单方法(web自动化测试怎么做)
- 2025-04-06 软件测试|web自动化测试神器playwright教程(一)
- 2025-04-06 测试小白基于java的selenium自动化测试环境搭建(一)
- 2025-04-06 人工智能丨DeepSeek自动生成测试用例方法
- 2025-04-06 软件测试进阶之自动化测试——python+appium实例
- 2025-04-06 「总结」用selenium工具做软件自动化测试的面试题及答案,码住
- 2025-04-06 利器 | Java 接口自动化测试首选方案:REST Assured 实践 (一)
- 2025-04-06 自动化测试(自动化测试框架)
- 2025-04-06 Java自动化测试,必备知识梳理及面试题分享
你 发表评论:
欢迎- 最近发表
-
- 一招解决vscode报java插件版本不一致以及相关缓存引起的问题
- 关于Java 8版本的理解(java中的接口怎么理解)
- Java 9 到 Java 16 的版本演进:一次模块化革命和语言的持续进化
- 如何选择合适的Java版本(如何选择jdk版本)
- 晚会互动小游戏(晚会节目互动小游戏)
- 基于JavaSwing的象棋游戏系统java休闲游戏jsp源代码Mysql
- Java 猜字母游戏!会写会玩才是真本事!
- 基于JavaSwing的贪吃蛇大作战java休闲游戏jsp源代码mysql
- Java & Python 康威生命游戏 - 命令行版
- 高玩随机种子无损速通《我的世界》10分钟不到刷新世界纪录
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)