用户界面自动化是自动化测试不可分割的一部分,是黑匣子测试的重要手段。 在UI自动化测试的过程中,我们不可避免地会遇到各种各样的问题。 现在,我想总结一下自己在测试过程中遇到的问题,对大家有帮助。
一、启动浏览器报错
3358 www.Sina.com/exceptioninthread ' main ' org.openqa.selenium.webdriverexception 3360 unknown error 3360 callfunction
出现上述错误消息是因为浏览器版本与驱动程序版本不匹配。 每个版本的驱动程序下载地址为https://NPM.Taobao.org/mirrors/chrome驱动程序; 在进行UI测试之前,请确保检查您的浏览器版本,然后找到相应版本的驱动程序,以便成功启动和测试浏览器。
报错信息:
例如,错误消息是值错误定位符' id=msgcount ' didnotmatchanyelements。
首先,确认是否设定了适当的等待时间。 在web ui测试期间,必须等待元素加载完成,然后导航到相应的元素。 然后,如果设置等待时间不能解决问题,请检查对齐方法是否正确,然后在不同的方法之间切换以对齐元素。 常见的元素对齐方法包括id、name、className、partialLinkText (、linkText、xpath、CSS选择器); 一般来说,找不到位置或找不到要素是因为没有设置合理的等待时间。
二、无匹配元素/元素不可见
为了提高测试脚本的稳定性和实用性,设置合理的等待时间是必不可少的,为了提高测试效率,必须根据场景选择适当的等待方式。常见的等待方式有强制等待、隐式等待、显式等待三种。
33558www.Sina.com/time.sleep(x )在查找元素之前强制线程停止x秒。 由于此等待方法必须等待足够长的x秒才能执行相应的操作,因此可能会影响测试效率,一般不建议使用。
三、设置等待时间隐式等待是对网页加载的等待; 在整个编写测试用例的过程中,只强调一次,然后每次发生网页加载时执行等待,自动判断等待时间; 启动浏览器后,添加driver.implicitly_wait(5)即可。 其中,参数5表示页面在0-5s内加载即可,属于时间范围;
强制等待:显式等待是对元素的等待; 每次进行元素搜索时都需要强调。
webdriverwait (驱动程序,20,0.5 ).until (expected _ conditions.alert _ is _ present ) )
这里,20s表示最大等待时间,0.5s表示轮询时间间隔; 检查元素后停止等待,执行以下操作:
隐式等待:
Web的UI自动化测试不可避免地要处理文件上传。 最简单的方法是用sendkeys处理。 该方法简单、明确、高效,非常适合处理文件上传。 代码如下。
driver.find_element(by.id,' upload ' ).send_keys ) ) d:/upload.txt );
但是,此方法仅适用于元素标签为input类型的上传,web驱动程序的API无法处理上传文件时的系统对话框; 在这种情况下,可以使用AutoIT v3进行处理。 AutoIT脚本编译为可执行文件exe后,将放置在本地目录中以供程序调用。 调用方法如下。
Runtime rn=Runtime.getRuntime (;
rn.exec(「upload.exe”)
AutoIT是一种类似脚本语言的软件,利用该软件可以轻松实现模拟键盘、鼠标、窗口等操作并实现自动化。 网上有很多关于如何使用AutoIT实现文件上传的说明,有需要的学生可以在百度上看到,这里不再赘述。 AutoIT下载地址为https://www.autoit script.com/site/autoit/downloads /
显式等待:
在UI自动化测试期间,从链接打开新页面时,需要切换窗口才能在新页面上操作。 代码如下。
其中,driver.getWindowHandle (; 获取当前窗口句柄(与身份证一样,是系统分配的唯一标识符) )。
driver.getWindowHandles (; 获取当前浏览器所有窗口的句柄集
此外,获取当前引用所有窗口的句柄集相当于列表。 您也可以使用以下代码切换到最新打开的页面:
new_handle=driver.getWindowHandles()[-1];
driver.swicth_To().window(new_handle);
六、定位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方式进行定位,以保证元素查找的唯一性。
七、处理页面弹出框Alert
Alert是JavaScript控件,无法通过元素定位的方式进行处理,Webdriver提供了以下方式来对控件进行处理:
driver.switch_to.alert.accept() # 通过accept,关闭弹出框
driver.switch_to.alert.dismiss() # 通过dismiss,关闭弹出框
driver.switch_to.alert.text #获取弹出框文字
八、日历控件
日历控件是一种特殊的网页元素,由于其操作的复杂性,我们无法通过模拟手工操作来进行一步步的选择。检查页面元素可以发现,日历控件属于input类型,但是由于其readonly属性,无法使用send_keys直接输入;因此,我们可以通过调用JavaScript脚本(打开Chrome浏览器-右键点击检查-进入console,即可进行JavaScript代码调试
),先删除其readonly属性,再使用sendkeys方式进行输入,代码如下:
driver.execute_script('document.getElementById("date").removeAttribute("readonly")')
九、处理图片验证码
在进行登录注册等操作时,我们经常需要处理一些验证码;除了通过万能码进行登录之外,我们还可以调用百度提供的开放接口进行验证码处理,接口说明文档如下:
http://ai.baidu.com/docs#/OCR-API/top
十、iframe或frame处理
在元素定位过程中,如果出现了<frame>或者<iframe>标签,说明该页面中嵌套了一个新的页面,该页面内的元素无法直接定位。因此,在定位新页面元素之前,我们需要先执行driver.switch_to.frame()方法,切换到该frame下面,再对该frame下的元素进行定位和操作;如果想操作该frame以外的元素,可以通过driver.switch_to.parent_frame()方法切换到上一级frame。