1.你做过自动化测试吗?
我在上一份工作中,公司去年下半年也开始规划做Web 自动化,测试框架结构是采用Python作为开发语言,通过Selenium WebDriver定位和操作页面元素,自动化框架用的是unittest。
2. 使用什么工具进行的自动化测试
● 使用的工具是Selenium(Web自动化工具),使用PO设计模式,工具是:Selenium+Unittest+Jenkins
● 在设计UI层自动化测试用例的时候,使用的是PO设计模式,也就是把每一个页面所需要操作的元素和步骤都封装在一个页面类中。然后 Selenium+Unit test搭建四层框架——实现数据、脚本、业务逻辑分离(关键字驱动)
1)基础层(BasePage):
设计一个基本的Page类,所有页面皆继承该类。提供了一个页面需要实现的基本功能及公共方法。
2)业务逻辑层(Pages):
按照PO设计模式,将每个页面抽象为一个类,放在Pages包里面,每个页面继承Basepage,可调用Data层数据,内容包括:
- 该页面所有的操作对象属性
- 实现的功能
3)数据层(Data)
该层存放相关数据,例如:用户数据和密码。在测试用例可通过调用数据层的数据来进行操作。
4)测试用例层(Testcases)
每一个测试用例testcase都对应Pages里面的一个页面,继承unnitest.TestCase类。通过调用对应页面类的方法,数据层的数据、增加断言(assert)来验证功能的正确性。
此外通过Jenkins自动执行测试、代码质量检测和部署到测试服务器、部署到生产服务器上。
3. Selenium 用的是哪个版本的的?Python用的是哪个版本的?
用的是selenium 3.11.0和Python3.7
4. Selenium的工作原理?
1)对html元素定位
2)模拟对第一步定位到的元素进行点击、输入、选择等操作一句话:定位元素,操作元素。
5. 元素定位方法有哪些?
要点:8种定位方法
1) 根据元素的属性值定位,比如 id、name、class、标签名、链接文字和部分链接文字;
2) 根据CSS选择器定位;
3) 根据 XPath 定位;
我最常用的是xpath(或CssSelector)因为很多情况下,html标签的属性不够规范,无法通过单一的属性定位,这个时候就只能使用xpath可以去重实现定位唯一element
事实上定位最快的是Id,因为id是唯一的,然而大多数开发并没有设置id。
6. 子页面里的元素怎么定位?
先切换到框架里,然后再定位,用switch_to_frame函数根据子页面id或name,切换到子页面;
定位完了如果要再定位主页面的元素,要用switch_to_default_content 函数先返回主页面。
7. 怎么定位alert弹窗?或者这样问:怎么处理JS原生窗口?
要点:主要涉及点击弹窗确认按钮、强行关闭弹窗、获取弹窗中的文字等操作。
1) 点击弹窗的确定按钮,用如下函数:
driver.switch_to_alert().accept()
2) 强行关闭,点击右上角的叉叉,用如下函数:
driver.switch_to_alert().dismiss()
3) 获取弹窗里的文字,用如下函数:
driver.switch_to_alert().text
8.怎样去选择一个下拉框中的value=xx的option?
1.select类里面提供的方法:selectByValue(“xxx”)
2.xpath的语法也可以定位到
9.如何去定位属性动态变化的元素?
属性动态变化是指该element没有固定的属性值,只能通过相对位置定位。
第一种方法:用findelements遍历。
第二种方法:通过xpath的轴 parent/following-sibling/precent-sibling
10.selenium中如何判断元素是否存在?
selenium中没有提供原生的方法判断元素是否存在,一般我们可以通过定位元素+异常捕获的方式判断。如果这个元素压根就不存在, 就会抛出NoSuchElementException
# 判断元素是否存在
try:
dr.find_element_by_id('none')
except NoSuchElementException:
print 'element does not exist'
这样就可以使用try catch,如果catch到NoSuchElementException 就返回false。通常在项目中会把这个功能封装在isElementPresent方法中。
11.如何通过子元素定位父元素?
通过父元素定位子元素,可以通过二次定位来找到。
第一种:通过子元素定位父元素,selenium提供了parent方法,但是只能定位到父元素,却不能获取元素属性,也不能操作。
第二种:通过xpath的语法直接定位。 如.//*[@name="hello"]/.. 两个点代表父级元素。
12.selenium实现文件上传方式?
首先,我们要区分出上传按钮的种类,大体上可以分为两种,一种是input框,另外一种就比较复杂,通过js、flash等实现,标签非input
第一种:input输入框。众所周知,input标签是可以直接send_keys的,这里也不例外。
第二种:非input类型,有用a标签的,有用div的,有用button的,有用object的。
大体上有以下几种解决方案:
- autoIT,借助外力,我们去调用其生成的au3或exe文件。
- Python pywin32库,过程:模拟点击上传按钮,打开Windows对话框,编辑栏输入文件路径(或网址)点击确定。
13.selenium的三种等待方式?
强制等待:
- 也叫线程等待, 通过线程休眠的方式完成的等待,如等待5秒: Thread sleep(5000),
隐式等待:
- 通过implicitly Wait完成的延时等待,注意这种是针对全局设置的等待,如设置超时时间为10秒,使用了implicitlyWait后,如果第一次没有找到元素,会在10秒之内不断循环去找元素,如果超过10秒还没有找到,则抛出异常
显式等待:
- 也称为智能等待,针对指定元素定位指定等待时间,在指定时间范围内进行元素查找,找到元素则直接返回,如果在超时还没有找到元素,则抛出TimeoutException异常
- 使用方法:WebDriverWait(driver, 超时时间, 调用频率, 要忽略的异常).until(要执行的方法, 超时时返回的错误信息)。
- WebDriverWait(driver, 20, 0.5).until(EC.presence_of_element_located(locator))
优点:等待判断准确,不会浪费多余的等待时间,在用例中使用,可以提高执行效率。
14.selenium如何定位图片中的验证码?
用tesseract OCR引擎处理图片中的验证码,步骤:
(1)对整个屏幕截屏,保存成png格式的图片;
(2)在截取的图片中定位验证码图片的位置坐标;
(3)根据坐标对验证码截图;
(4)最后在图片中提取验证码,输入到输入框。
15.selenium元素定位时,找不到元素的问题有哪些?
第一种: ElementNotVisible元素不可见
对于这种情况,这个元素display = none/hidden,通过JS更改display = block来解决
第二种: NoSuchElementException没有这种元素
1)最常见的:页面没有加载完全,我们就去定位这个元素。
2)动态ID无法定位元素——1)直接使用Xpath相对路径;2)根据部分元素定位
3)Iframe——switch_to_iframe
4) Alert——switch_to_alert
5)下拉框——Select标签下拉框、二次定位
16.在使用Selenium中遇到的最大的问题?如何解决?——测试用例的可靠性
误报通常是我们在使用selenium的最头疼的问题,这使得很难把selenium测试用例加入到自动构建中。有些构建是必须要成功的,如果失败将会阻塞整个发布流程。
解决方法——重试我们的解决方案是在测试步骤和测试集中都加入重试机制。
产生误报最大原因是selenium在页面加载完成之前就开始请求页面资源。
重试机制:利用递归封装了一个等待元素的方法。其中,设置最大等待时间为1s,轮询时间为50ms,这个方法会不断轮询,直到方法执行成功或者超过设置的最大等待时间。在我们最好的一次实践中,我们把一个测试用例的误报率从10%降低到0,并且执行时间从原先的45秒降低到33秒。
17. 怎么运行自动化用例并生成测试报告?
以unittest为例,我通常的做法是把用例加载到测试套中,做成一个脚本,在命令窗口下运行脚本,报告的生成用第三方模块HTML TestRunner来生成。
18.怎么提高selenium脚本的自动化执行效率?
1.优化测试用例,尽可不使用 sleep,减少使用隐式等待ImplicitlyWait,多使用selenium的显现等待WebDriverWait,这样可以优化等待时间.
2.针对一些不稳定的动态控件通过JS实现操作.
3.减少不必要的操作步骤,如经过三四步才能打开我们要测试的页面的话,我们就可以直接通过网址来打开,减少不必要的操作。
4.中断页面加载,如果页面加载的内容过多,我们可以查看一下加载慢的原因,如果加载的内容不影响我们测试,就设置超时时间,中断页面加载。
5.使用性能好的电脑
19.用例在运行过程中经常会出现不稳定的情况,也就是这次可以通过,下次无法通过了,如何提高用例的稳定性?
1,查找元素前先做判断:ExpectedConditions里面的各种方法;
2,显式等待:多使用WebDriverWait,加上显式等待时间,等要操作的元素出现之后再执行下面的操作;
3、多用try catch捕获异常;
4,多线程的时候,减少测试用例耦合度,因为多线程的执行顺序是不受控制的;
5,尽量使用测试专用环境,避免其他类型的测试同时进行,对数据造成干扰。
20.如何设计高质量自动化脚本
1. 使用四层结构实现业务逻辑、脚本、数据分离。
2. 使用PO设计模式,将一个页面用到的元素和操作步骤封装在一个页面类中。如果一个元素定位发生了改变,我们只用修改这个页面的元素属性。
3. 对于页面类的方法,我们尽量从客户的正向逻辑去分析,方法中是一个独立场景,例如:登录到退出,而且不要想着把所有的步骤都封装在一个方法中。
4. 测试用例设计中,减少测试用例之间的耦合度。
21.有没有封装过Selenium方法?
有,在BasePage层,我们就对实现一个页面的基本功能进行了封装。
例如:1. 设置重试机制。
2. 对webdriver各种方法进行封装。
22.自动化测试执行策略
自动化测试用例的执行主要是通过Jenkins来实现的。而执行的策略是根据测试用例的类别、目的来设计的。
在Jenkins中,我们设定了三个任务:
- tm_test:用于执行自动化测试脚本,检测代码质量
- tm_staging_deploy:用于在测试服务器上部署代码
- tm_deploy:用于在生产服务器上部署
23.基于Web端呈现的产品可以如何做自动化测试,谈谈你的思路和方向
- web端的自动化测试,基本就是模拟手工测试人员来做功能测试。
- 用机器的自动执行代替人的操作。
- web端呈现的产品有两个方向可以做自动化测试:接口层和界面操作层,且接口层自动化的比例要高于界面操作层。
- 并且主要对产品稳定的功能进行自动化测试,主要用于产品的核心功能冒烟测试、回归测试。
- 从系统最最核心的功能开始做,再根据情况慢慢铺开。
参考:基于用户登陆的自动化测试思路:
- 使用 python+selenium 框架来编写登陆的所有测试用例
- 使用unittest框架来组织测试用例。
- 使用Htmltestrunner来形成html版的测试报告,并使用邮件模块来发送测试报告给项目组相关人员。
25.在selenium中如何处理多窗口?
多窗口之间跳转处理,在实际自动化测试经常会遇到。点击一个链接,这个链接会在一个新的tab打开,然后接下来要查找元素在新tab打开的页面,需要先将driver切换至window,然后再定位,具体步骤如:
1)先获取当前的windowhandle
2)操作打开新界面后,获取所有的windowhandles
3)遍历windowhandles,判断和当前的windowhandle不一样则切换至该windowhandle
4)Window太多则可以按照title、url等其他信息进行判断切换
26.自动化验证码的几种处理方式
1)在产品没有上线前,需要找开发先给web验证码留后门,也就是将验证码先注释掉
2)让开发给一个万用验证码,只要输入给定的验证码,就可以强制登录
3)密码可以通过保存cookie跳过登录验证码
4)使用验证码识别技术
27.webdriver中关闭浏览器的quit和close有什么区别?
简单来说,这两个都可以实现退出浏览器session功能
1)close是关闭你当前聚焦的tab页面,而quit是关闭全部浏览器tab页面,并退出浏览器session
2)quit一般用在结束测试之前的操作,close用在执行用例过程中关闭某一个页面的操作。