如何提升WebUI自动化的稳定性
一、导致UI自动化不稳定的因素
1.web页面的多变
在自动化的实际应用场景中,经常性会碰到一类问题,UI界面经常性的变动,导致页面元素对象的维护成本大大增加。
2.页面隐藏元素
受前端影响,页面元素的定位在采用相对定位时可能会定位到隐藏元素,导致脚本的不稳定性
3.页面元素加载不稳定
受机器本身及网络状态影响,UI界面的响应时间存在不稳定
4.系统业务复杂
相比繁杂的业务场景,重复简单的业务参加肯定更适于参与自动化测试。随着业务复杂度的提升,脚本的复杂程度也随之提升,中间的业务逻辑更容易出现问题。
5.AJAX请求问题
ajax请求会导致三种情况的问题:元素没有加载出来,不在DOM结构里面;元素不可见,在DOM结构里面;元素可见,可点击,但是页面上其他位置还没完全加载出来,点击这个元素之后一点反应都没有,下一步操作就会报错。
6.环境测试数据准备问题
自动化测试其实就是将功能操作通过脚本自动执行起来,同样会涉及测试数据清理,测试数据准备的问题
二、解决问题的各种方法
1.从自动化框架解决问题
1.1 设置显示等待
重写selenium的底层接口,加入显示等待,设置等待条件及异常处理
WebDriverWait(driver,timeout,poll_frequency=0.3,ignored_exceptions=None)
driver:浏览器驱动
timeout:最长超过时间,默认以秒为单位
poll_frequency:监测的时间间隔,默认为0.3秒
ignored_exceptions:超时后的异常信息,默认情况下抛NoSuchElementException异常
1.2 等待页面加载稳定
重写selenium的底层接口,定位元素前需要先等待页面加载稳定,页面加载稳定的判断条件为"页面源码在限定时间内不在发生变化"
begin = int(time.time())
source = driver.page_source
while True:
time.sleep(0.3)
nowsource = driver.page_source
if source == nowsource:
break
else:
now = int(time.time())
if now - begin > 3:
break
source = nowsource
try:
WebDriverWait(self.driver, outtime).until(
lambda driver: driver.execute_script('return document.readyState') == 'complete')
except exceptions.TimeoutException:
pass
1.3 过滤隐藏元素
重写selenium的底层接口,在selenium判断的基础上,过滤掉页面特殊的隐藏元素,增强脚本容错性
try:
if not element.is_displayed():
return False
size = element.size
if not int(size['height']) or not int(size['width']):
return False
loc = element.location
if int(loc['x']) < -9000 or int(loc['y']) < -9000:
return False
if not element.is_enabled():
return False
except:
return False
return True