selenium工具集 Python
自动化测试工具:QTP
jmeter性能测试工具设置/录制脚本瞭接口测试
loadrunner性能测试工具UI界面录制
soupUl接口测试功能postman
appium APP自动化测试工具Macaca MOnkey
轻量级
支持多语言:ruby Python java C#等支持多平台:Windows Mac
支持多浏览器:Firefox lEChrome edge Safari 0pera支持分布式测试selenium grid
自动化适用什么测试?
兼容性测试,回归测试
(又名Selenium WebDriver)的主要新功能是集成了 WebDriver。WebDriver 曾经是 Selenium 1(又名 Selenium RC)的竞争对手。Selenium RC 在浏览器中运行 Javascript 应用,而 WebDriver 通过原生浏览 器支持或者浏览器扩展直接控制浏览器。 之所以合并,原因如下:
- WebDriver 解决了 Selenium 存在的缺点(比如,绕过 JS 沙箱
- Selenium 解决了 WebDriver 存在的问题(例如支持广泛的浏览器);
- Selenium 的主要贡献者们都觉得合并项目是为用户提供最优秀框架的最佳途径。
驱动(出租车,乘客,驱动)启动浏览器后,selenium-webdriver会将目标浏览器绑定到特定的端口,启动后的浏览器则作为webdriver的 remote server。
客户端(也就是测试脚本),借助ComandExecutor发送HTTP请求给sever端(通信协议:The WebDriver Wire Protocol,在HTTP request的body中,会以WebDriver Wire协议规定的JSON格式的字符串来告诉Selenium我 们希望浏览器接下来做什么事情)。
Sever端需要依赖原生的浏览器组件,转化Web Service的命令为浏览器native的调用来完成操作。
自动化测试 元素的定位webdriver 提供了一系列的对象定位方法,常用的有以下几种
id,xpath,css selectlor可以唯一定义到元素
id ,nameid 和name 是我们最最常用的定位方式,因为大多数控件都有这两个属性,而且在对控件的id 和name 命名时一般 使其有意义也会取不同的名字。
class name,tag name link text有时候不是一个输入框也不是一个按钮,而是一个文字链接,我们可以通过link
driver.find_element_by_link_text("hao123").click()
partial link text #部分linkdriver.find_element_by_link_text("hao").click()
xpathXPath 是一种在XML 文档中定位元素的语言。因为HTML 可以看做XML 的一种实现,所以selenium 用户可是使用 这种强大语言在web 应用中定位元素。
右击浏览器界面,copy xpath
driver.find_element_by_xpath("//*[@id='kw']").send_keys("selenium")
XPath 扩展了上面id 和name 定位方式,提供了很多种可能性。
css selectorCSS 使用选择器来为页面元素绑定属性。这些选择器可以被selenium 用作另外的定位策略。 CSS 的比较灵活可以选择控件的任意属性,上面的例子中: driver.find_element_by_css_selector("#kw")
通过find_element_by_css_selector( )函数,选择取百度输入框的id 属性来定义
操作测试对象click 点击对象
send_keys 在对象上模拟按键输入
clear 清除对象的内容,如果可以的话
submit 清除对象的内容,如果可以的话
text 用于获取元素的文本信息
等待wait() 固定等待 driver.implicity_wait() 智能等待,需要加载出的元素加载好了,无需等待,进行下一步打印信息
打印tile及url
print driver.title # 把页面title 打印出来 print driver.current_url #打印浏览器的操作 浏览器最大化
driver.maximize_window() #将浏览器最大化显示设置浏览器宽、高
driver.set_window_size(480, 800)操作浏览器的前进、后退
driver.back()#浏览器的后退 driver.forward()#前进控制浏览器滚动条
js="var q=document.documentElement.scrollTop=10000" driver.execute_script(js) #js="var q=document.docunmentElement.scrollTop=0"关闭浏览器
quit 更强大,包括清理缓存
close
键盘事件 键盘按键用法driver.maximize_window() # 浏览器全屏显示 driver.find_element_by_id("account").clear() time.sleep(3) driver.find_element_by_id("account").send_keys("demo") time.sleep(3) #tab 的定位相当于清除了密码框的默认提示信息,等同上面的clear() driver.find_element_by_id("account").send_keys(Keys.TAB) time.sleep(3)
#通过定位密码框,enter(回车)来代替登陆按钮
driver.find_element_by_name("password").send_keys(Keys.ENTER)
#也可定位登陆按钮,通过enter(回车)代替click()
driver.find_element_by_id("login").send_keys(Keys.ENTER)
键盘组合键用法
#ctrl+a 全选输入框内容 driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'a') time.sleep(3)
#ctrl+x 剪切输入框内容 driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'x')
鼠标事件
ActionChains 类
context_click() 右击
double_click() 双击
drag_and_drop() 拖动
move_to_element() 移动
ActionChains(driver).double_click(su).perform()定位一组元素
import os dr = webdriver.Chrome() file_path = 'file:///' + os.path.abspath('checkbox.html') dr.get(file_path) # 选择页面上所有的input,然后从中过滤出所有的checkbox 并勾选之 inputs = dr.find_elements_by_tag_name('input') for input in inputs: if input.get_attribute('type') == 'checkbox': input.click()
多层框架/窗口定位
#先找到到ifrome1(id = f1) driver.switch_to_frame("f1") #再找到其下面的ifrome2(id =f2) driver.switch_to_frame("f2") #下面就可以正常的操作元素了
多层窗口定位
有可能嵌套的不是框架,而是窗口,还有对窗口的方法:
switch_to_window 用法与switch_to_frame 相同: driver.switch_to_window("windowName")
层级定位
具体思路是:先点击显示出1个下拉菜单,然后再定位到该下拉菜单所在的ul,再定位这个ul 下的某个具体的link。 在这里,我们定位第1个下拉菜单中的Action 这个选项。
下拉框处理#先定位到下拉框 m=driver.find_element_by_id("ShippingMethod") #再点击下拉框下的选项 m.find_element_by_xpath("//option[@value='10.69']").click()
alert、/confirm/i、prompt 的处理
text 返回alert//confirm/i/prompt 中的文字信息
accept 点击确认按钮
dismiss 点击取消按钮,如果有的话 send_keys 输入值,这个alertconfirm 没有对话框就不能用了,不然会报错
注意:switch_to_alert()只能处理原生的alert
#先定位alert=driver.switch_to.alert#关闭弹窗alert.accpect()alert=driver.switch_to.alert#输入内容alert.send_keys("dede")alert.accept()
DIV对话框的处理
div=driver.find_element_by_class_name("model")buttons=div..find_element_by_tag_name("button")button[0].click() #数组方式
上传文件操作
#send_keys#脚本要与upload_file.html 同一目录 file_path = 'file:///' + os.path.abspath('upload.html') driver.get(file_path) #定位上传按钮,添加本地文件 driver.find_element_by_name("file").send_keys('D:\PycharmProjects\test\upload.txt')
unnitest框架
黑盒测试,UI界面
测试固件:SetUp():初始化
TearDown():UI功能测试后的清理工作
TestCase
test_开头
self代表的是类的实例,在方法的一个参数调用这个方法时可以不传参
全局变量self.变量名
def setUp(self): self.driver=webdriver.Chrome() self.url="https://baidu.com/" self.driver.maximize_window()批量执行脚本
def createsuite(): suite=unittest.TestSuite() suite.addTest(unnitestDemo.BaiDu1("test_hao")) return suiteif __name__=="__main__": suite=createsuite() runner=unittest.TextTestRunner(verbosity=1) runner.run(suite)
suite=unittest.TestSuite()suite.addTest(unittest.makeSuite(unnitestDemo.BaiDu1))#将baidu1中所有测试用例加入return suite
#TestLoadersuite1=unittest.TestLoader.loadTestsFromTestCase(unnitestDemo.BaiDu1)suite2=...suite=unittest.TestSuite([suite1, suite2])return suite
#执行文件下所有测试脚本(测试脚本太多)discover=unittest.defaultTestLoader.discover("../test1", pattern="test*.py", top_level_dir=None)return discover
忽略测试用例
@unittest.skip(“skipping”)
unittest断言判断实际结果与预期结果是否一致
verbosity 是一个选项,
表示测试结果的信息复杂度,有三个值:
0 ( 静默模式): 你只能获得总的测试用例数和总的结果比如总共100个失败,20 成功80
1 ( 默认模式): 非常类似静默模式只是在每个成功的用例前面有个“ . ” 每个失败的用例前面有个“F”
2 ( 详细模式): 测试结果会显示每个测试用例的所有相关的信息
HTML报告生成C:UsersAdministratorAppDataLocalProgramsPythonPython38LibHTMLTestRunner.py
1.解决测试报告存放的位置
2.解决测试命名问题
3.生成测试报告
异常捕捉与错误截图1.错误截图的存储位置
2.解决重复命名的问题
3.截图
# 截图函数def saveScreenShot(self, driver, file_name): # 参数:驱动,截图名字 if not os.path.exists("./image"): os.makedirs("./image") now = time.strftime("%Y%m%d-%H%M%S", time.localtime(time.time())) driver.get_screenshot_as_file("./image/"+now+"-"+file_name) time.sleep(3)if __name__ == "__main__": unittest.main #在主函数中,直接调用main() ,在main中加入verbosity=2 ,这样测试的结果就会显示的更加详细。
数据驱动
ddt使用方法: 参考文档:http://ddt.readthedocs.io/en/latest
需要多次执行一个案例,比如baidu搜索,分别输入中文、英文、数字等进行搜索
# 引入ddt@ddtclass Testddt(unittest.TestCase): def setUp(self): self.driver = webdriver.Firefox() self.driver.implicitly_wait(30) self.base_url = "http://www.baidu.com" self.verificationErrors = [] self.accept_next_alert = True # 测试用例,必须以test开头 # 增加ddt数据 # @data('selenium',u'测试中文','9999999999') # @data(2,3,4) # 单变更时不使用unpack # @data([3, 2], [4, 3], [5, 3]) @data(*getCsv('test_baidu_data.csv')) # 使用file_data需要在cmd窗口下运行,否则找不到文件 # @file_data('test_data_list.json') @unpack



