自动化中遇到的问题:
=====================================
1、动态元素定位不到
解决方法:尽量使用固定元素定位,如没有固定元素,则采用绝对路径进行定位,因为元素路径是唯一且不变的
2、自动化脚本执行速度较慢
尽量使用css方法定位元素,使用等待时,少用sleep方法,尽量不用隐式等待,涉及到一些if elif条件判断时,尽量把可能发生的条件放在前面写,这样可以减少程序判断的次数,提高效率
3、弹框内有按钮点击不到
解决方法:弹框里面有设置滚动条,首先进入弹框里面,将滚动条滑动到最底部才可以点击确定或者取消按钮
4、
报错:启动后,打开谷歌浏览器,不出现内容,报浏览器不安全|data
解决方法:webdriver-chrome版本升级
5、元素没有加载出来
因为时间等待原因:显示等待(只匹配目标元素),隐式等待(等待页面加载完成),强制等待
6、定位的元素是随机变化的
解:通过元素xpath或者css来定位
7、定位动态元素?
解决:通过相对位置来定位
8、
定位Webdriver定位class属性中有空格的值
例如:定位" class="bg s_btn",一共有三种处理方式:
self.browser.find_element_by_class_name("s_btn").submit() #第一种解决办法:class值取其中之一
self.browser.find_element_by_class_name("bg").submit() #第二种解决办法:class值取其中之一
self.browser.find_element_by_css_selector(".bg.s_btn").submit() #第三种解决办法:使用css.selector,每个class值前面加.
其中,在使用前两种方法的时候,需要确认我们选取的元素不会在该页面上存在重复,因此建议使用css.selector方式进行定位,以保证元素查找的唯一性。
9、
处理页面弹出框Alert
Alert是JavaScript控件,无法通过元素定位的方式进行处理,Webdriver提供了以下方式来对控件进行处理:
driver.switch_to.alert.accept() # 通过accept,关闭弹出框
driver.switch_to.alert.dismiss() # 通过dismiss,关闭弹出框
driver.switch_to.alert.text #获取弹出框文字
10、
iframe或frame处理
在元素定位过程中,如果出现了<frame>或者<iframe>标签,说明该页面中嵌套了一个新的页面,该页面内的元素无法直接定位。因此,在定位新页面元素之前,我们需要先执行driver.switch_to.frame()方法,切换到该frame下面,再对该frame下的元素进行定位和操作;如果想操作该frame以外的元素,可以通过driver.switch_to.parent_frame()方法切换到上一级frame。
11、处理图片验证码
在进行登录注册等操作时,我们经常需要处理一些验证码;除了通过万能码进行登录之外,我们还可以调用百度提供的开放接口进行验证码处理,接口说明文档如下:
http://ai.baidu.com/docs#/OCR-API/top
12、
日历控件
日历控件是一种特殊的网页元素,由于其操作的复杂性,我们无法通过模拟手工操作来进行一步步的选择。检查页面元素可以发现,日历控件属于input类型,但是由于其readonly属性,无法使用send_keys直接输入;因此,我们可以通过调用JavaScript脚本(打开Chrome浏览器-右键点击检查-进入console,即可进行JavaScript代码调试
),先删除其readonly属性,再使用sendkeys方式进行输入,代码如下:
driver.execute_script('document.getElementById("date").removeAttribute("readonly")')
13、
处理页面弹出框Alert
Alert是JavaScript控件,无法通过元素定位的方式进行处理,Webdriver提供了以下方式来对控件进行处理:
driver.switch_to.alert.accept() # 通过accept,关闭弹出框
driver.switch_to.alert.dismiss() # 通过dismiss,关闭弹出框
driver.switch_to.alert.text #获取弹出框文字
14、
切换浏览器窗口
在进行UI自动化测试过程中,我们通过链接打开一个新的页面时,需要进行窗口切换,才能在新页面进行操作,代码如下:
15、
上传文件
Web的UI自动化测试过程中,我们不可避免要处理文件上传,最简单的方式是通过sendkeys来处理,这种方式简单、清晰、高效,是处理文件上传的首选,代码如下:
driver.find_element(By.ID,'upload').send_keys('D:/upload.txt');
但是这种方式只适用于元素标签为input类型的上传,webdriver的API无法处理上传文件时系统的对话框;此时,我们可以采用AutoIT v3进行处理,AutoIT脚本编译成可执行文件exe后,放到本地的某一个目录下供程序调用,调用方法如下:
Runtime rn=Runtime.getRuntime();
Rn.exec(“upload.exe”)
AutoIT是一个类似脚本语言的软件,利用此软件我们可以方便的实现模拟键盘、鼠标、窗口等操作,实现自动化。关于使用AutoIT实现文件上传的方法,网络上有很多解释,有需要的同学可以百度查看,此处不再展开描述。AutoIT下载地址为:https://www.autoitscript.com/site/autoit/downloads/
15、启动浏览器报错
报错信息:Exception in thread "main" org.openqa.selenium.WebDriverException: unknown error: call function result missing 'value'
出现以上报错信息,是由于浏览器版本与driver版本不匹配,各版本driver下载地址为:https://npm.taobao.org/mirrors/chromedriver;在进行UI测试之前,一定要先检查自己浏览器的版本,然后找到对应版本的driver,这样才能正常启动浏览器进行测试。
======================================
报错现象:
1、出现"object is not iterable":
首先查看脚本,测试用例出现问题
组织用例时出现错误(我开始是用for循环遍历y,加入测试集合中,返回集合,老是会出现错误,最后改成下方代码,直接返回y,解决问题)
2、出现"str object is not callable"的问题
原因是:使用定义的变量名字与内置模块名字相同,(我的原因是:在basePage.py文件中,“得到文本的函数,element.txt后面多加了一对括号”,取消就好了)。针对自己的脚本,检查变量的名字,相同的更改一下