web自动化基础

自动化 作用:多用于回归测试,用代码执行重复的工作 工具: Python + selenium(框架) + unittest + HtmlTestRunner selenium:web测试框架,封装了各大浏览器驱动的api unittest:单元测试框架,加载所有用例,执行 HtmlTestRunner:生成Html格式测试报告 类别: 接口自动化 web自动化 app自动化 web自动化: 元素定位: id定位 id=kw name定位 name=wd class定位 class=s_ipt link_text定位 文本定位 tag_name定位 标签定位 xpath定位: // 相对路径 / 绝对路径 . 当前节点 contains:包含 "//a[contains(@id,'kw')]" starts-with 元素以什么开头 '//input[starts-with(@name,'w')]' 浏览器操作: 最大化浏览器 d.maximize_window() 关闭当前句柄所对应的窗口 d.close() 退出 浏览器并结束cheomedriver进程 d.quit() 打开url d.get() 获取当前页面title d.title 浏览器前进 d.forward() 浏览器后退 d.back() 浏览器刷新 d.refresh() 获取当前页面的url d.current_url 获取浏览器名称 d.name 截屏 d.get_screenshot_as_file("") 页面元素对象操作: click() 点击 send_keys(str) 输入 tag_name 获取标签名 text 获取标签文本 clear 清空对象内容 get_attribute(属性) 获取元素对象的属性 is_displayed() 判断页面元素是否可见,返回布尔值 框架切换: d.switch_to.frame("") d.switch_to.default_content() 句柄切换: a.switch_to.window(a.window_handles) 等待时间: 强制等待 time.sleep(秒数) 隐性等待 implicitly_wait(秒数) 在规定时间内等待页面所有元素加载完成,超过所设定的秒数则报错 显性等待 b=WebDriverWait(webdriver,timeout,频率) b.unti(函数,message="") until内部会执行传入的函数,会在所设定的时间内按设定的频率进行检测元素是否被加载,若加载,则定位,否则报错 键盘事件: 导入from selenium.webdriver.config.keys import Keys 通过selenium模拟键盘操作 模拟全选: c=wait.until(lambda x:x.find_element_by_id('kw')) c.send_keys("游戏人生") c.send_keys(Keys.CONTROL,"a") 模拟回车: c=wait.until(lambda x:x.find_element_by_id('su')) c.send_keys("游戏人生") c.send_keys(Keys.ENTER) 鼠标事件: 导入 from selenium.webdrive.config.action_chains import ActionChains 鼠标双击: b=a.find_element_by_id("kw") b.send_keys("游戏人生") ActionChains(a).double_click(b).perform() 鼠标移动: b=a.find_element_by_xpath('//*[@id="u1"]/a[8]') time.sleep(1) ActionChains(a).move_to_element(b).perform() 鼠标右键: b=a.find_element_by_id("kw") b.send_keys("游戏人生") ActionChains(a).context_click(b).perform() 下拉框定位: b.find_element_by_xpath('//*[@id="nr"]/option[2]').click() 弹窗: 定位弹窗:a.find_element_by_xpath('//*[@id="gxszButton"]/a[1]').click() 接收弹窗:c=a.switch_to.alert 接收警告信息:c.accept() 对弹窗内的对话框输入内容:c.send_keys() 取消弹窗:c.dismiss() 滚动条滑动: 坐标滑动: js="document.documentElement.scrollTop=800" a.execute_script(js) 元素定位滑动: b=a.find_element_by_xpath('//*[@id="6"]/h3/a') c="arguments[0].scrollIntoView();" a.execute_script(c,b) 文件上传: 定位、上传 a.find_element_by_xpath('//*[@id="form"]/span[1]/span').click() time.sleep(1) a.find_element_by_xpath('//*[@id="form"]/div/div[2]/div[2]/input')\ .send_keys(r'C:\Users\Administrator\Pictures\2014121211164481.jpg') 获取一组元素: 通过elements,先定位,再循环 a.find_element_by_xpath('//*[@id="show-answer-hide"]').click() time.sleep(2) li=a.find_elements_by_xpath('//i[@class="ikonw-qb-new-icon icon-evaluate "]') for i in li: i.click() ec模块(expected_conditions): * ec.visibility_of_element_located(()): 元素可见,再执行定位,接收元祖,和显性等待结合使用 b=wait.until(ec.visibility_of_element_located(("id","kw"))) b.send_keys("游戏人生") * ec.presence_of_element_located(()): 判断元素是否加载到DOM树,和显性等待结合使用 b=wait.until(ec.presence_of_element_located(("id","su"))) b.click() ec.text_to_be_present_in_element(()): 判断标签的文本信息是否与传入的文本一致,返回布尔值 b=wait.until(ec.text_to_be_present_in_element(("link text","地图"),"地图")) print(b) ec.text_to_be_present_in_element_value(()): 判断标签的value属性是否与传入的文本相等,返回布尔值 b=wait.until(ec.text_to_be_present_in_element_value(("id","kw"),"游戏人生")) print(b) * ec.alert_is_present()(a): 判断页面是否存在弹窗,如果存在,直接切入弹窗,不存在,返回False b=ec.alert_is_present()(a) print(b) ec.title_is(): 获取页面标题,判断与传入的标题是否相等,返回布尔值 b=wait.until(ec.title_is("百度一下,你就知道")) print(b) * ec.frame_to_be_available_and_switch_to_it(()): 判断框架是否可以切入,能则切入框架,否则返回False b=ec.frame_to_be_available_and_switch_to_it(("xpath","pa"))(a) print(b) 类的装饰器: 装饰器=高阶函数 + 函数闭包+语法糖 作用:在不修改函数的调用方式的前提下,给函数怎加新功能,不修改函数的源码 @classmethod: 将类的函数属性声明为类属性,不能直接访问实例属性 @staticmethod: 将类的函数属性声明为静态属性,不能直接访问类的静态属性和函数属性以及实例属性 @property: 将类的函数属性声明为property后,调用不加括号 unittest(单元测试)框架: 继承测试类后,用例必须以test开头 导入from unittest import TestCase class MyTest(TestCase): @classmethod #整个测试类启动时,先执行setUpClass,只执行一次 def setUpClass(cls): pass # 每个用例执行前,先执行setUp def setUp(self): pass # 每个用例执行后,执行tearDown def tearDown(self): pass @classmethod # 整个测试类结束时,先执行tearDownClass,只执行一次 def tearDownClass(cls): pass def test_01(self): # 判断预期结果与实际结果是否相等,不相等则抛出错误,用例执行失败 self.assertEqual("预期结果","实际结果") #判断预期结果与实际结果是否不相等,相等则抛出错误,用例执行失败 self.assertNotEqual("预期结果","实际结果") # 判断左边参数是否小于右边参数 self.assertLess(1,2) # 判断实际结果是不是False self.assertFalse(False) PO模式: 对象层: BasePage类封装了所有的selenium的操作(初始化、定义页面函数) 元素层: 封装页面元素 一个页面封装一个类 业务层: 业务层定义所有的类都要继承BasePage 业务层封装 项目所有业务流程 一个流程一个类 用例层: 用例层和数据、元素、业务分离 调用业务层函数,执行测试用例

猜你喜欢

转载自www.cnblogs.com/szwlycw/p/11544501.html