什么是自动化?
自动化就是以人力驱动的测试行为转化为机械执行的一种过程
目的:节省人力,时间或者硬件资源,提高测试效率
哪些场景下适合做自动化?
1,任务测试明确,不会频繁变动
2,每日构建后的测试验证
3,比较频繁的回归测试
4,软件系统界面稳定,变动少
5,需要在多平台上运行的相同测试案例,组合遍历性的测试,大量的重复任务
6,软件维护周期长,
7,项目进度压力不大
8,被测软件系统开发比较规范,能够保证系统的可测试性
9,测试人员具备较强的编程能力
自动化不能完全代替手工测试
因为刚开发的功能还不稳定,可能有很多问题
常见的测试工具
monkey
selenium
jmeter
postman
八大定位元素
id ,
name,
class,(有空格隔开的部分,需要用逗号或者点好进行连接)
link__text(链接文本,文本全称),
partal_link_text(模糊文本查询)
tag_name(标签) ele_input_box =driver.find_elements_by_tag_name('input')
ele_name = ele_input_box[0]
ele_name.send_keys('三毛')
xpath
绝对路劲定位查询:html/body/div/div/div/from/span[1]/input[3]
相对路径定位查询:/从跟节点开始,,//所有的子节点,,//*任意标签
精确属性值定位://标签名【@属性名=属性值】
‘//*【@id="kw"】'
'//input[@id="kw"]'
模糊属性值定位;//标签名【contains(@属性名,属性部分值)】
’//a[contains(@wdfield,"work")]‘
精确文本定位://标签名【text()="标签的文本值"】
’//a[text()="视频"]‘
模糊文本定位://标签名【contains(text(),标签文本值)】
’//a[contains(text(),"视")]‘
起始属性值定位://标签名【starts-with(@属性名,属性开头部分值)】
’//*【starts-with(@autocomplete,"o")】‘
css选择器定位:
find_element_css_selector('#kw')
nth-child(n);选择器选择父元素中的第N个子元素,元素类型没有限制
last-child:父子节点底下的最后一个子标签,,,,firest-child
有点不懂
性名')
通过id获取name的值
name = driver.find_element_by_id('kw').get_attribute('name')
通过父级标签定位;
by类定位: find_element(BY.ID,"kw")
浏览器的基本操作:
最大化:driver.maximize_windows()
最小化:driver.minimize_windows()
获取窗口大小:print(driver.get_windows_size()
设置窗口大小:driver.set_windows_size(宽,高尺寸))
刷新窗口:driver.refresh()
对文本框清除:.clear()
键盘的基本操作:
.send_keys(Keys.CONTROL,'a')全选
.send_keys(Keys.CONTROL,'ENTER')按回车键
鼠标的基本操作:
右击搜索框 ele = driver.find_element_by_id("kw")
Actionchains(driver).context_click(ele).perform()
click()单击
double_click()右击
move_to_element()鼠标悬停在某个元素上
click_and_hold()按下鼠标左键在一个元素上
js滚动条:
js = argument[0].scrollIntiView()
然后通过驱动器对象调整:execute_scrip(js脚本,显示的元素)
定位居家优品
wntj = driver.find_element_by_id_("J_feeds")
js = "arguments[0].scrollIntoView()"
driver.execute_script(js,wntj)
元素定位不到可能出现的原因:
1,有数据加载 SLEEP
2,定位是否正确
3,是否有句柄
4,登陆前后
5,代码操作的对象和定位元素的时候所在页面是否一样
6,iframe框架
浏览器窗口切换(句柄)
获取当前窗口的句柄:current_windows_handle
获取所有窗口的句柄:driver.windows_handles
切换到新的窗口:driver.switch_to.windows[-1] or second_windows_handle
3种等待方式
sleep
隐式等待:driver.implicitly_wait(10)
显示等待: ①:from selenium. webdriver.common.by import By
②:form selenium.webdriver.support.wait import WebDriverWait
③:from selenium.webdriver.support import expected_conditions as EC
定位等待三毛,,百度百科等待
ele =WebDriverWait(driver.30).until(EC.presence_of_element_located(By.XPATH,'//*[@id="l"]/h3/a'))
ele.click()
进入iframe框架:
①退到iframe最外层:driver.switch_to.default_content()
②退出到上一层:driver.switch_to.parent_frame()
select下拉框处理:
Select(变量).select_by_visible_text("文本"),文本定位
Select(变量).select_by_value('value'),value定位
Select (变量). select_by_index('1')通过索引定位
随机对象:
list1 =["1","2","3","4","5"]
list2 = ['7','23','32','34','324']
random.choice(list1)
random.radint(1,100)
alert框处理
获取弹框的文本;driver.switch_to.alert.text()
点击弹框的取消按钮:driver.switch_to.alert.dismiss()
点击弹框上的确定按钮:driver.switch_to.alert.accept()
断言:
封装的基本思路:
1,编写线性业务流程脚本
2,业务数据转换成参数形式
3,封装到不同类的方法中;(代码分层)
4,调用不同方法合成流程脚本
5,从文件读取数据到脚本中:(数据分离)
为什么要做数据分离:
把数据写到数据配置文件中,减少代码的维护工作
(定位元素数据的分离)
代码分层:
case ——用例层
common ——公共层
data_config ——数据配置
page ——页面流程代码
result ——结果(截图,报告,日志)
runner ——运行测试套,执行报告并且打印
main ——整个项目的入口
open打开之后,中间的代码有问题,不会自动关闭
with open as 需要一个别名,中间的代码不管正确与否都会关闭
yum文件:
①打开一个文件
②return yam.safe_load(打开的文件)
excel文件
打开工作簿
openpyxl.load_workbook(文件路径)
选择sheet页
自动获取路径
os.path.dirname(__file__)
构造方法 __init__初始化数据
析构方法 __del__对类的资源进行清理
对象说明方法 __str__将实例化的对象按照自定义的字符串的形式显示出来
异常处理
try.....except
当try下面的代码正常,则不执行except的代码
try.....except.....else
当try代码正常,则不执行except,但是要执行else
当try代码不正常,则执行except,不执行else
try......finally
不管try代码正确都要执行finally
try.....except.....finally
不管try的代码是否正常,都会执行finally,但是当try异常,会执行except
数据库:
使用commit语句提交。
遇到验证码怎么处理??
pillow插件
截图并裁剪验证码