定位页面的元素属性方法有8种
ID = "id"
XPATH = "xpath"
LINK_TEXT = "link text"
PARTIAL_LINK_TEXT = "partial link text"
NAME = "name"
TAG_NAME = "tag name"
CLASS_NAME = "class name"
CSS_SELECTOR = "css selector"
以百度为例代码如下:
id
from selenium import webdriver import time as t driver=webdriver.Chrome() driver.maximize_window() driver.implicitly_wait(20) driver.get('http://www.baidu.com') driver.find_element_by_id('kw').send_keys('liulele') driver.find_element_by_id('su').click() t.sleep(3) driver.quit()
name
from selenium import webdriver import time as t driver=webdriver.Chrome() driver.maximize_window() driver.implicitly_wait(20) driver.get('http://www.baidu.com') driver.find_element_by_name('wd').send_keys('liulele') driver.find_element_by_id('su').click() t.sleep(3) driver.quit()
xpth
from selenium import webdriver import time as t driver=webdriver.Chrome() driver.maximize_window() driver.implicitly_wait(20) driver.get('http://www.baidu.com') driver.find_element_by_xpath('//*[@id="kw"]').send_keys('liulele') driver.find_element_by_id('su').click() t.sleep(3) driver.quit()
class_name
from selenium import webdriver import time as t driver=webdriver.Chrome() driver.maximize_window() driver.implicitly_wait(20) driver.get('http://www.baidu.com') driver.find_element_by_class_name('s_ipt').send_keys('liulele') driver.find_element_by_id('su').click() t.sleep(3) driver.quit()
css_selector
from selenium import webdriver import time as t driver=webdriver.Chrome() driver.maximize_window() driver.implicitly_wait(20) driver.get('http://www.baidu.com') driver.find_element_by_css_selector('#kw').send_keys('liulele') driver.find_element_by_id('su').click() t.sleep(3) driver.quit()
link_text
from selenium import webdriver import time as t driver=webdriver.Chrome() driver.maximize_window() driver.implicitly_wait(20) driver.get('http://www.baidu.com') driver.find_element_by_link_text('图片').click() t.sleep(3) driver.quit()
partial_link_text
from selenium import webdriver import time as t driver=webdriver.Chrome() driver.maximize_window() driver.implicitly_wait(20) driver.get('http://www.baidu.com') driver.find_element_by_partial_link_text('片').click() t.sleep(3) driver.quit()
tag_name
from selenium import webdriver import time as t driver=webdriver.Chrome() driver.maximize_window() driver.implicitly_wait(20) driver.get('http://www.baidu.com') inputs=driver.find_elements_by_tag_name('input') inputs[7].send_keys('liulele') t.sleep(3) driver.quit()
多元素定位获取到的是一个列表,通过列表的索引来定位
多个元素定位(元素属性都一致) A、获取到的元素属性,它是一个列表 B、按照我们需要被定位的元素属性,它在列表中是第几位,那么 就使用它的索引来定位
进入ifame框架的三种方式
1.id
2.name
3.索引
以qq邮箱为例:
driver=webdriver.Chrome() driver.get('http://mail.qq.com') driver.switch_to.frame(1) t.sleep(3) driver.find_element(By.NAME,'u').send_keys('792144759') t.sleep(3) driver.quit()
页面对象设计模式可以可以跨多个测试用例共享代码,减少代码的数量,如果用户界面发生了维护,我们只需要维护一个地方,这样修改以及维护的成本大大降低
base:基础层,主要编写的是底层元素封装
page:对象层,主要指的是把页面的的每一个交互写成一个独立的方法
test:测试层,里面主要编写测试用例
common:公共方法,把公共方法分离到这个里面
utils:工具类,主要指的是操作一些工具
data:把测试过程中的数据储存在这个目录下
report:测试报告,主要指的是生成的HTML的测试报告
隐式等待:是全局等待,设定之后全局在定位元素时只要不超出设定时间就会一直定位元素 浏览器会在自己设定的时间内不断的刷新页面去寻找我们需要的元素
显示等待:明确的等待某个元素的出现或者是某个元素的可点击等条件,等不到,就一直等,除非在规定的时间之内没找到就报错
implicitly_wait():隐式等待,是设置的全局等待。设置等待时间,是对页面中的所有元素设置加载时间,如果超出了设置时间的则抛出异常。隐式等待可以理解成在规定的时间范围内,浏览器在不停的刷新页面,直到找到相关元素或者时间结束。 WebDriverWait():显示等待,是针对于某个特定的元素设置的等待时间,在设置时间内,默认每隔一段时间检测一次当前页面某个元素是否存在,如果在规定的时间内找到了元素,则直接执行,即找到元素就执行相关操作,如果超过设置时间检测不到则抛出异常。默认检测频率为0.5s,默认抛出异常
1.先获取当前的窗口句柄
2.点击打开新的窗口
3.获取所有的窗口句柄
4.针对所有的窗口句柄循环,循环内部判断,如果不是当前窗口,那么窗口需要换到新的窗口
代码实现如下
from selenium import webdriver import time as t driver=webdriver.Chrome() driver.implicitly_wait(20) driver.maximize_window() driver.get('http://www.baidu.com') driver.find_element_by_id('kw').send_keys('liulele') driver.find_element_by_id('su').click() # nowhander=driver.current_window_handle driver.find_element_by_xpath('//*[@id="1"]/div/div/h3/a').click() allhandres=driver.window_handles driver.close() t.sleep(3) driver.switch_to.window(allhandres[1]) driver.get_screenshot_as_file('lelle.png') # for handre in allhandres: # if handre !=nowhander: # driver.switch_to.window(handre) # t.sleep(3) # driver.get_screenshot_as_file('baidu.png') # driver.close() driver.quit()
300
1.先梳理可以做自动化的场景
2.找领导核对梳理的对不对
3.编写测试用例,
4.测试用例评审(找领导核对用例有没有问题,断言是否合理)
5.修改评审后的问题然后将写好的代码整合到jenkins持续集成平台上,方便下次迭代继续使用
python语言 selenium工具 unittest单元测试框架 htmlrunner生成测试报告
发现过不过很少,我们一般都是先做回归测试后再做ui自动化测试的,
回归测试就是提交bug开发修改后的测试,所以基本没bug 做的是回归测试
unittest生成测试报告需要借助第三方的库HtmlTestRunner.py的文件 把它放在python下面的Lib目录下 在test目录下新建report的文件
再新建 报告.py 文件 里面编写代码(需要执行的测试模块,测试报告的title和描述)
运行之后测试报告就生成在report文件中了
以新浪邮箱为例编写ui自动化测试用例
assertEqual():比较的是两个对象的==关系
assertTrue(): 判断是否正确
assertFalse() :判断是否错误
assertIn():比较的是两个对象的包含关系
assertIs():比较两个字符串的内存地址
unittest:
测试类里面需要继承unittest。TestCase
参数化需要依赖第三方库、
测试报告需要借助第三方库HTMLTestRunner库
没有插件
不支持失败重试
pytest
不需要继承,可以是一个函数,也可以是类
参数化不用依赖,直接使用内部parametrize
pytest-html或者是allure
有丰富得插件
支持失败重试
测试用例 TestCase 编写测试用例
测试固件Test Fixure 初始化的清理测试用例
测试套件TestSuite 所有测试用例的集合
测试运行 TestRunner 执行测试用例
测试报告TestRunner 生成测试报告
初始化和清理,使用到的方法分别是setUp()和tearDown()
使用继承的思想,把测试固件分离,这样的好处是只需要在一个地方维护测试固件,而不是多个地方维护。 其他的测试类只只需要继承测试固件就可以使用了
1、setUp() and tearDown():在一个测试类里面,有多少个测试用例,它就会被执行多少次 例子:浏览器的多次打开与关闭
2、setUpClass() and tearDownClass():是类方法,不管测试类里面有多少测试用例,它只会执行一次 例子:浏览器只会被打开一次和关闭一次。
使用的式TestLoader()类里面的discover方法
第一个参数start_dir是测试模块的路径,
第二个参数pattern用来获取test包中所有以test开头的文件,
使用到的库是HTMLTestRunner
测试初始化 测似步骤 测试断言 测试清理
当一个测试场景它的测试步骤相同,测试的数据不一样的时候,那么就可以使用参数化的思想来解决
在Unittest测试框架中参数化要借助第三方库parameterized. 安装命令为 pip install parameterized.
相同的测试步骤,不同的测试数据,这个时候就可以使用参数换,减少重复的代码。就可以使用parameterized,在parameterized执⾏的时候,它把列表⾥⾯的值⾸先进⾏循环,然后把param元组⾥⾯的值赋值给测试⽅法⾥⾯对应的参
自己写
工具
代码
首先我们使用的是页面对象设计模式,这种模式的优点是减少代码的重复性,方便维护代码,当用户界面发生了维护,我们只需要维护一个地方,这样维护及修改的成本相对降低,
完整自动化框架有以下目录及作用
base层:主要编写的是底层元素的封装(单元素还是多元素)
page层:需要导入base层,把页面的每个交互写成一个独立的方法
test层:需要导入page层,编写测试用例
commmon:公共方法,把公共方法分离到这个里面(一般是路径的处理)
data:把测试中的数据存储到这个文件里
utils:工具类,需要导入commit包主要操作的是一些工具的类(处理的是data目录下的数据)
report:存储测试报告的
main:主函数 用来生成测试报告
具体用到的技术有python语言。selenium工具,unittest单元测试框架及HTMLTestRunner第三方库
然后把代码同步到jinkens持续继承的平台上,方便日后复用
自己搭建
都用了python语言 selenium工具 unittest单元测试框架 HTMTestRunner第三方库
base层:主要编写的是底层元素的封装(单元素还是多元素)
page层:需要导入base层,把页面的每个交互写成一个独立的方法
test层:需要导入page层,编写测试用例
commmon:公共方法,把公共方法分离到这个里面(一般是路径的处理)
data:把测试中的数据存储到这个文件里
utils:工具类,需要导入commit包主要操作的是一些工具的类(处理的是data目录下的数据)
report:存储测试报告的
main:主函数 用来生成测试报告
测试脚本没有发现对应元素就会报错NoSuchElementException
网络资源没有加载出来
页面属性发生变化
js
web自动化测试:selenium库 ubittest库
接口自动化测试: pytest库
数据操作:json库 pyYaml库 。csv库 xlrd库 pymysql库
处理文件:os库
时间:time库 datatime库
其他:random库
1.每个测试用例以test开头
2.每个测试用例的有标题
3.每个测试用例都得有断言
4.业务之间是有联系的,测试用例是单独的(容易产生垃圾数据)
xpath基于路径
css居于样式