随着自动化测试在招聘市场的热度越来越高,越来越多的小伙伴都开始主动或被动地开始接触自动化测试,但是不可避免在自动化过程中碰到各种各样的报错。
大家看到报错的时候是不是又在百度出来的一大堆答案中尝试却又没有结果?为什么其它大佬们感觉写起自动化脚本起来轻轻松松,自己碰壁了之后却抓耳挠腮除了薅掉一大把头发没有任何进展?是不是甚至产生了报错恐惧症,看到报错就开始手心出汗,觉得总有报错想害朕?
那如果我说,报错其实是来给大家帮忙的,是不是觉得有点诧异?
实际上,报错还真是方法的作者们考虑到了大家可能出现的错误,为大家排错给出的提示,掌握好阅读和处理报错的方式,很多问题其实都能迎刃而解。
这里首先放出我整理好的报错原因和处理方案,我们再一步步来看,为什么会出现这些报错,从报错里面我们又应该学到些什么:
阅读报错的方法
异常报错只有两部分:
第一行:异常的提示信息(最重要)
at开头的,表示异常是由哪里的代码引起的。
例如下面看到的异常:
给出的信息其实很好理解:第一行提示chromedriver版本不支持98版本的chrome浏览器,后面报错提示代码出错的位置在对应文件中的某一行,可以直接点击跳转到相应代码位置查看。
所以一条异常报错信息,给我们带来的是帮助排查问题的一系列内容:报错的原因是什么,报错的位置在哪里,从而方便完成问题的定位。清楚了异常怎么看,那么接下来我们看看怎么处理自动化过程中常见的各种异常信息。
网易云音乐网页自动化测试实战错误处理
以网易系列的产品来作为例子体验,网易云的网页对大家做自动化测试设下了重重难关,短短一个登录流程,就有无数的坑可以让代码翻车,我们逐个来看代码流程:
这段代码实现的流程非常简单,完成通过QQ登录的流程,但是过程中有无数翻车点:
1.启动浏览器
浏览器的启动只有一句,但也是报错高发区域。
出现报错为:
Exception in thread "main" org.openqa.selenium.SessionNotCreatedException: Could not start a new session. Response code 500. Message: session not created: This version of ChromeDriver only supports Chrome version 98。
报错指向原因为浏览器版本与使用的chromedriver版本不匹配。
解决方案:因此设置版本对应的chromedriver的路径,代码修改如下:
2.访问网易云首页
访问网页时容易出现的错误是地址忘了带上协议,因此尽量从浏览器地址栏复制,报错代码:
出现异常为:
Exception in thread "main" org.openqa.selenium.InvalidArgumentException: invalid argument
解决方案:url地址中加上https://的协议信息。
3.点击登录
自动化报错大boss来了,出现的异常为:
Exception in thread "main" org.openqa.selenium.NoSuchElementException: no such element: Unable to locate element: {"method":"xpath","selector":"//*[@id="auto-id-8KcEMnoNXNmTWx8M"]/a"}
针对no such element元素定位不到的问题,可能原因有多种,需要熟悉问题原因逐一排查,这里的问题是元素中使用了随机生成的id。
因此改写xpath,避免使用变化的id值。
改完之后,又出现了新的报错:
Exception in thread "main" org.openqa.selenium.ElementNotInteractableException: element not interactable
报错为元素无法操作,通过分析页面,发现自动化打开的浏览器中登录按钮没有在页面上出现,而导致无法操作。
解决方案:在浏览器启动时将浏览器最大化,让按钮能够出现。
4.点击QQ登录
No such Element报错再次出现:
Exception in thread "main" org.openqa.selenium.NoSuchElementException: no such element: Unable to locate element: {"method":"xpath","selector":"//span[@id='nick_578225840']"}
这次并没有使用随机的id属性,报错的原因是由于出现了新页面需要切换,并且同时元素还在iframe中,因此需要进行两层处理:
切换窗口句柄
selenium为每个窗口都指定了唯一的一个句柄,通过句柄切换可以将浏览器切换到新打开的窗口中操作
同时在操作时,由于浏览器的响应时间可能跟不上,因此可以添加一个合适的等待时间。
切换Iframe
由于需要点击的QQ头像元素在iframe中,所以进行iframe的切换后再进行定位。
调试完成之后,最后的代码已经变成了这个样子:
吃一堑长一智
在短短几行代码中见了这么多异常,我们要清楚的是,在编写代码过程中怎么尽可能避免出现这些异常,这几条是最终对于web自动化编写过程中的总结
1.检查webdriver和浏览器的配套。
2.网址尽可能从浏览器复制,别自己写。
3.复制xpath表达式的时候,留个心,看看有没有可能会变化的id属性。 尽可能手写xpath或者css表达式。
4.将浏览器最大化之后再进行后续的脚本操作,并且加上隐式等待设置。
5.遇到新窗口进行切换,如果要切回旧窗口,也记得要切换。
6.如果以上操作都注意了,那么确认一下元素是不是在iframe中:
1、平时可以看一下console中,当前层级是不是top,如果不是,那就是在iframe里面。
2、看html文档,待定位元素是不是在一个iframe元素里面。
7.可以通过适当添加等待,让脚本等待浏览器响应后执行。
8.如果某些元素点击操作不可用,分析异常信息以及网页html文档,找到可以操作的元素再操作。
最后,祝大家在编写自动化过程中代码永不报错~
END
免费领取软件测试课程笔记+超多学习资料+学习完整视频,微信关注官方公众号:特斯汀软件测试
网友评论