selenium UI自动化基础知识
元素定位:
1.怎么判断元素是否存在?
判断元素是否存在和是否出现不同, 判断是否存在意味着如果这个元素压根就不存在, 就会抛出NoSuchElementException
这样就可以使用try catch,如果catch到NoSuchElementException 就返回false。通常在项目中会把这个功能封装在isElementPresent方法中。
2.如何判断元素是否出现?
判断元素是否出现,存在两种情况,一种是该元素压根就没有,自然不会出现;另外一种是有这样的元素,但是是hidden状态
可以通过先判断是否存在,如果不存在返回false;如果存在再去判断是否displayed。
3.selenium中hidden或者是display = none的元素是否可以定位到?
不能,想点击的话,可以用js去掉dispalay=none的属性。
4. selenium中如何保证操作元素的成功率?也就是说如何保证我点击的元素一定是可以点击的?
1.通过封装find方法实现waitforEmelentPresent,这样在对元素进行操作之前保证元素被找到,进而提高成功率
2.在对元素操作之前,比如click,如果该元素未display(非hidden),就需要先滚动到该元素,然后进行click操作;为啥使用滚动? 因为如果页面没有完全显示,element如果是在下拉之后才能显示出来,只能先滚动到该元素才能进行click,否则是不能click操作
1
2
3
|
JavascriptExecutor js=(JavascriptExecutor)driver; // roll down and keep the element to the center of browser js.executeScript( "arguments[0].scrollIntoViewIfNeeded(true);" , download); |
3.不同方式进行定位,与expectedConditions判断方法封装,循环判断页面元素出现后再操作;
4.开发人员规范开发习惯,如给页面元素加上唯一的name,id等。
5. 如何去定位页面上动态加载的元素?
触发动态事件,然后findElemnt
如果是动态菜单,需要一级一级find(JS实现)
6.如何去定位属性动态变化的元素?
属性动态变化是指该element没有固定的属性值,所以只能通过相对位置定位
比如通过xpath的轴, parent/following-sibling/precent-sibling等
另外也可以尝试findbyelements遍历
7.点击链接以后,selenium是否会自动等待该页面加载完毕?
不会的。所以有的时候,当selenium并未加载完一个页面时再请求页面资源,则会误报不存在此元素。所以首先我们应该考虑判断,selenium是否加载完此页面。其次再通过函数查找该元素。
8.自动化测试的时候是否需要连接数据库做数据校验?
一般来说1、 UI自动化不需要(很少需要);2、接口测试会需要:从数据库层面来进行数据校验可以更方便验证系统的数据处理方面是否正确;
9.有几种元素常用定位方式,分别是?你最偏爱哪一种,为什么?
8种:id、name、class name、tag name、link text、partial link text、xpath、css selector 偏爱哪一种?答:
我最常用的是xpath(或CssSelector)因为很多情况下,html标签的属性不够规范,无法通过单一的属性定位,这个时候就只能使用xpath可以去重实现定位唯一element
事实上定位最快的是Id,因为id是唯一的,然而大多数开发并没有设置id。
10.怎么提高selenium脚本的自动化执行效率?
1.优化测试用例,尽可不使用 sleep,减少使用ImplicitlyWait
2.多使用selenium的WebDriverWait/FluentWait,这样可以优化等待时间
3.减少不必要的操作步骤,如经过三四步才能打开我们要测试的页面的话,我们就可以直接通过网址来打开,减少不必要的操作。
4.中断页面加载,如果页面加载的内容过多,我们可以查看一下加载慢的原因,如果加载的内容不影响我们测试,就设置超时时间,中断页面加载。
5.使用性能好的电脑
11.用例在运行过程中经常会出现不稳定的情况,也就是这次可以通过,下次无法通过了,如何提高用例的稳定性?
5,尽量使用测试专用环境,避免其他类型的测试同时进行,对数据造成干扰。
12.你的自动化用例的执行策略是什么?
1.自动化测试用例是用来监控的。集成到jenkins,创建定时任务定时执行;
2.有些用例在产品上线前必须回归。jenkins上将任务绑定到开发的build任务上,触发执行;
3.有些用例不需要经常执行。jenkins创建一个任务,需要执行的时候人工构建即可。
13.什么是持续集成?
频繁的将代码集成到主干,持续性的进行项目的构架,以便能能够快速发现错误,防止分支大幅度偏离主干
14.webdriver client的原理是什么?
在selenium启动以后,driver充当了服务器的角色,跟client和浏览器通信,client根据webdriver协议发送请求给driver。driver解析请求,并在浏览器上执行相应的操作,并把执行结果返回给client.
15.webdriver的协议是什么?
The Wire Protocol
16.启动浏览器的时候用到的是哪个webdriver协议?
http
17. 什么PO模式,什么是page factory?
PO模式是page object model的缩写,顾名思义, 是一种设计模式,把每个页面当成一个页面对象,页面层写定位元素方法和页面操作方法,实现脚本的page和真实的网站页面Map起来,一一对应起来。这样能测试框架更容易维护。 比如一个登陆页面,使用PO模式后,会创建一个LoginPage的class,该class会定义用户名输入框,密码输入框,登陆按钮的webElenent;用例层从页面层调用操作方法,写成用例,这种模式可以做到定位元素与脚本分离。所以这样的设计理念就是PO模式。 而PageFactory隶属PO模式,是用来初始化每个PO模式实现的Page Class,初始化对象库。
18.怎样去选择一个下拉框中的value=xx的option?
1.select类里面提供的方法:selectByValue(“xxx”)
2.xpath的语法也可以定位到
19.如何在定位元素后高亮元素?
重置元素属性,给定位的元素加背景、边框
20. 如何设计高质量自动化脚本
1. 使用四层结构实现业务逻辑、脚本、数据分离。
2. 使用PO设计模式,将一个页面用到的元素和操作步骤封装在一个页面类中。如果一个元素定位发生了改变,我们只用修改这个页面的元素属性。
3. 对于页面类的方法,我们尽量从客户的正向逻辑去分析,方法中是一个独立场景,例如:登录到退出,而且不要想着把所有的步骤都封装在一个方法中。
4. 测试用例设计中,减少测试用例之间的耦合度。
21.get和post 的区别?
1、GET请求:请求的数据会附加在URL之后,以?分割URL和传输数据,多个参数用&连接。
POST请求:POST请求会把请求的数据放置在HTTP请求包的包体中。
2、传输数据的大小
使用GET请求时,传输数据会受到URL长度的限制。
对于POST,理论上是不会受限制的
3、安全性。POST的安全性比GET的高
def tearDown(self): try: self.driver.refresh()#将退出浏览器的操作变成刷新浏览器,用于不同用例之间的接洽操作 except ConnectionRefusedError as e: print(e) finally: self.assertEqual([], self.verificationErrors)