第一章Web自动化
9.1、web自动化具体怎么做的
自动化这块,我们当时用的python+selenium+unittest框架来做到的。对于做web自动化,我觉得最关键的几个点就是:a、元素的定位b、断言例外还有就是一定要做好,a、数据与脚本的分离b、页面元素的定位操作与业务的分离c、做好参数化,模块化,就是把一些公共的功能模块做好封装,比如数据库的操作,测试数据的提取操作,发送邮件等,还有就是一些配置信息比如像数据库的配置信息,报告的路径,日志的路径,邮件的配置信息等都要进行分离,放到config配置文件中。这个主要就是为了方便后期自动化工程的管理与维护。
具体做的话,首先需要搭建测试环境,把需要用的一些库安装好,像python,pycharm,selenium,ddt,xrld,pymysql等测试库;然后构建好自动化工程,自动化工程我们当时用的是POM模型来管理的,也就是把各个部分分模块独立开来,这里需要建立好各个目录,像config目录用来存放配置文件信息。
data目录用来存放测试数据,log目录用来存放运行的日志文件,report目录存放报告的,common录存放公共模块,比如:数据库的操作,excel表格操作,工具类(对某些特殊数据的处理)等,page目录
主要就是页面元素的操作(元素定位),test_case目录存放用例的,还有就是main目录这个是程序的总入口。
自动化用例编写主要采用的是unittest框架来实现的,编写用例之前,首先需要准备测试数据,测试数据我们当时用的是Excel表格来管理的,并且会封装读取Excel表格数据的类,
用例脚本编写,首先就是把相关的包导入到,之后调用封装好的读取Excel表格数据的函数提取测试数据,并返回一个list列表,然后定义一个类继承TestCase,并需要实现其中的Setup方法,TearDown 方法,SetUp方法主要就是做一些初始化的工作,比如像打开浏览器,初始化数据库等,TearDown方法中主要就是回收工作,像删除一些测试数据等,然后就是实现用例方法,用例方法必须要以test开头。然后导入ddt库,利用ddt模块中的装饰器把数据引用到用例脚本中。用例方法的实现是最关键的,主要就是根据业务功能操作流程实现页面元素的定位操作,及断言等。
对于编写用例我觉得最关键的主要还是界面元素的定位,断言这块吧。
像元素定位,selenium中给我们提供了8种定位方式,元素定位我一般是用的id定位和xpath定位,css selector样式定位和link test定位,偶尔也会用到,基础定位很简单。元素定位一般我有一个原则:有ID尽量用id定位,尽量避免用name,class name定位,因为这两个可能在页面会有重复名字。如果没有id,优先选择使用xpath,css_selector,link_text进行定位。不过元素定位这块,有时候会定位不成功,比如,像页面加载延迟的问题,导致元素定位失败,这里可能需要进行延迟处理,延迟处理的方式,一般有3种,一种就是强制等待,一种就是隐性等待,一种就是显性等待。除了这个之外,我们一
定要注意iframe 内嵌网页的问题,还是有就是多窗口的问题,有时候最老火的可能就是动态id的问题,对于动态id的处理,一定要保证定位方式中尽量出现与id有关的东西。可以使用先定位父元素再定位子元素的方式,也可以通过定位周边元素的方式来进行处理。
例外断言这块,其实unittest框架中提供了丰富的断言方法,主要是通过调用unittest框架中提供的各种断言方法来实现的,主要用得比较多的就是,assertEqual(a,b),assertIn(a,b),assertIsInstance(a, b)等,对于Web UI自动化的断言我们主要关注的是:页面的跳转是否正确,页面上的核心信息是否正确,从这两个方面去检查实际结果与预期结果是否一致。
脚本这块差不多就是这么写的,最后我们需要引入一个htmlreport库去自动生成自动化报告,然后就是对报告进行分析,报告这一块的话,主要有通过,异常,失败几种请情况,
如果如果错误的话,基本一般都是脚本问题,这个时候我们需要去重新调试我们的脚本,如果是失败的话,一般来说,我都会先检查自己的脚本是否有问题,如果没有问题基本就可以提Bug了。接口自动化我们当时就这么做的。
Web UI自动化差不多就这些吧.....
9.2、自动化测试流程是什么?
a、前期项目组会评估项目是否合适做自动化测试
确定下测试范围,就是看下哪些模块,哪些用例是可以实现自动化,适合做。
b、人员安排,分工
C、确定测试框架
d、各自领取自己负责模块(根据功能来进行划分,功能测试的模块)
整理功能模块的用例,把能做自动化的用例提炼出,规整成自动化用例文档,
准备数据,整理数据,管理
资源,环境的准备
e、搭建测试环境
f、脚本开发
9.3、你们自动化覆盖率有多少?
2年以内,把原来手工做的事情30%用自动化脚本去替代
2年以上,实现40-70%
当时覆盖的确实也不是很多,差不多40-50%的样式吧。
9.4、web自动化与接口自动化的区别?
1、web自动化主要是替代人工对界面进行操作,他的核心重点就是元素的定位这块,并对页面数据进行
查断言,接口自动化是没有界面的,不需要对界面元素定位操作,它的核心重点主要就是向后端发请求,并对响应数据进行检查断言。
2、web自动化应为要对界面进行操作,所以相对执行效率上比接口自动化要低。
3、它们使用的测试框架也不同,接口自动化主要用的是requests测试库,Web自动化用的selenium
测试库,requests库中主要提供的就是发请求,处理响应数据的API函数,而selenium库中提供的主要是对浏览器操作,界面元素操作的API函数。
4、web自动化维护成本相对比较高点,因为主要是对于一个项目,一般前端变化比后端变化要频繁点,
前端页面的变化导致元素定位可能会失败,需要重新调整。
5、接口自动化的覆盖率可以达到100%(绝大部分的接口都可以实现自动化)
6、对于某些负责的项目,像界面比较复杂,业务比较复杂,相对来讲实现web自动化的难度要大一点,一次从覆盖率角度来讲,web自动化的覆盖率难以达到保证。而接口自动化相对就容易一点。
9.5、web自动化的局限性
1、因为涉及到界面元素的定位,对于某些界面变化频繁的项目,维护成本比较高。
2、对测试人员的技术要求比较高,尤其是编程能力这块,多人一起负责开发自动化脚本,一定要确定好测试平台,管理好工程框架,否则很容易导致整合不了的情况,后期的工程维护管理难度比较大,最终就会夭折
3、用例的覆盖率相对比较低,很多异常用例,或者界面比较负责的用例,难以覆盖
4、对于界面比较复杂,项目业务流程涉及比较多的系统相关的项目,实现难度比较大。
9.6、元素定位的方式有哪些?你常用的元素定位方式?
元素定位主要有8种定位方式,id,xpath,css,link_text,tag,name,class_name,partial_link_text 我一般常用就是:id,xpath,css,link_text。像xpath可以通过路径来定位,也可以通属性来实现,还有父子元素定位,兄弟节点定位等等,css可以通过样式来实现,也可以通过属性来实现,我个人比较习惯用css定位的方式。有时候是在定位不到元素的时候,也会用到部分js定位或者jQuery的定位的方式。
9.7、定位不到元素,你碰到过哪些,怎么解决?
1、像页面加载延迟的问题,这个需要通过等待延迟的方式来处理。一般等待延迟selenium有提供3种方式,一个就是强制等待,还有就是隐式等待,显式等待。比如有的时候,页面加载完成,但是元素暂时还不可见,导致定位不成功,这个可以选择使用显示等待来处理,这里需要用到WebDriverWait类来实现
2、还有就是像内嵌网页的问题,这个需要关注到页面的结构,使用driver.switch_to.frame(name/index)这个函数来跳转到处理。
3、还有要注意多窗口问题,动态id问题等的问题,对于多窗口处理,可以使用driver.switch_to.window()的方式来进行处理,而对于动态id的问题,需要注意的是有些id跟数字有关,
可能会动态变化,可以使用xpath,也可以使用css_select,属性定位或者样式定位,或者可以通过父元素来元素,或者通过兄弟节点来对应的元素。等等
4、还有要特别注意滚动条的问题,这里通过调用js代码来实现的,ute_script(js)
5、再这就是有时候会碰到某些元素的是不可见的,比如display属性为none,这就需要通过javaScript 修改display的值。
js='document.querySelectorAll("select")[1].style.display="block";'
9.8、xpath定位的方法?xpath怎么写?
Xpath写法://*div[@id='u1']/a[7]#相对路径
Xpath写法:/html/body/div[1]/div/div/div[3]/a[7]#绝对路径
#先父元素,结合属性
find_element_by_xpath(//div[@id='u1']/a[@name='tj_login'])
#根据属性来的
Xpath写法1://div[@id=’hd’or@name=’q’]
Xpath写法2://a[@name='tj_trxueshu'and@class='mnav']
Xpath写法3://a[@name='tj_trxueshu'][@class='mnav']
9.9、如何去定位内嵌界面?
1、定位元素的时候看到frame的需要进入内嵌
2、如果有内嵌有id或name值时直接进入内嵌driver.switch_to.frame('id值或name值')
3、如果内嵌没有id或name值,先定义一个内嵌再进入:
a=driver.find_element_by_class_name('')
driver.switch_to.frame(a)
4、如果有多层内嵌,要一层一层进入
5、记得退出内嵌:driver.switch_to.default_content()
driver.switch_to.parent_frame()--进入父级内嵌,调至上一级内嵌
9.10、如何在不同的网页之间切换?如何处理定位问题?
(窗口句柄的列表)
先获取所有窗口的句柄:handles=driver.window_handles
然后跳转到指定的窗口上:driver.switch_to.window(handles[1])
9.11、如何去定位滚动条?滚动条怎么处理?
一般当我们页面上的元素超过一屏后,想操作屏幕下方的元素,是不能直接操作的,会报元素不可见异常的。这时候需要借助滚动条来拖动屏幕,使被操作的元素显示在当前的屏幕上,selenium提供了一个操作js的方法:execute_script(),可以直接执行js的脚本。
滚动到底部:
js="var ElementById('id').scrollTop=10000"
滚动到顶部:
js="var q=document.documentElement.scrollTop=0"
#把滚动条拉到指定位置
虽然用上面的方法可以解决拖动滚动条的位置问题,但是有时候无法确定我需要操作的元素在什么位置,有可能每次打开的页面不一样,元素所在的位置也不一样,这个时候我们可以先让页面直接跳到元素出现的位置,然后就可以操作了。
target_element=driver.find_element_by_xpath('//*[@id="4"]/h3/a')
9.12、如何去模拟键盘与鼠标的操作?
1、这里需要用到ActionChains类,首先需要导入一个包ActionChains包
from selenium.webdriver import ActionChains
2、实例化ActionChains()对象
ActionChains(浏览器驱动对象)
actions=ActionChains(browser)
3、先需要定位到对应的元素,然后调用actions对象里面的API函数,将操作加入到actions对象中
element=browser.find_element_by_css_selector('ul.main_nav>li:nth-child(3)>a')
对于鼠标键盘操作的API函数也比较多,比如:
action.double_click()#双击
action.click()
action.send_keys()
action.drag_and_drop()
4、执行action对象里面的动作
action.perform()
9.13、元素定位有时候定位得到有时候定位不到,可能是什么原因?
1、可能是网络问题,导致页面加载延迟,这个可以做延迟等待,一般选择隐式等待,在脚本前面加上driver.implicitly_wait(20)。
2、也有可能是页面结构发生变化导致的,这个时候最好选择通过xpath,或css结合属性进行或者样式定位可能会好点,或者采用JQuery定位的方式来进行定位元素。
python怎么读取py文件9.14、对于不可见的元素,你如何定位,如何处理?
我们可以通过javaScript修改display的值,来实现
#修改元素的属性
#我们需要通过javaScript修改display的值。
js='document.querySelectorAll("select")[1].style.display="block";'
9.15、你们自动化用例是怎么管理的?
1.所有用例都是放在test_case的目录下的统一管理的。
2.每个某块一个.py文件,数据独立放在excel表格中
3.所有的具体用例脚本都是依据unittest来编写的,
利用ddt模型的装饰器来引用数据
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论