第 11讲 python 中 UI 自动化 1、什么是UI自动化 原本用手工操作ui页面的方式,现在用代码去实现自动化操作的方式 2、UI自动化的优点 1)解决重复性功能测试和验证 2)减少回归测试的人力 时间 3)减少回归测试在回归测试时漏测的现象 3、什么样的项目适合做UI自动化 1)需要比较稳定,需求变更不频繁 2)项目周期比较长 3)UI空间和页面元素不能频繁变更 4、UI自动化的应用场景 登录==》加入购物车==》下单 手工操作 ==》可以用自动化去操作==》自动化回归测试 5、UI自动化的覆盖率 1)用例数量的覆盖率:站当前迭代用例总数的20% ==》是把主流程的用例转化为自动化 2)场景覆盖率:70-80% 6、目前市面上主流程的ui自动化工具 1)python +selenium (要学习) 2)java +selenium 3)rebot framework +selenium2library 7、UI自动化的框架 python +selenium +unittest +po 分层 8、selenium 的优点 和缺点 1)支持多平台 windows linux 2)支持多浏览器 chrome 火狐 ie 3)支持多语言 python java 缺点:只能做UI自动化 就是一个库 9、selenium 安装 1)win +R ,输入cmd 2)进入python 安装路径,cd C:\Python37\Scripts 假如在d盘 输入d: 3)输入 pip install selenium==3.141.0 如果报错运行:python -m pip --upgrade pip 运行这个 10、selenium项目了解 1)pip install python自带的安装工具 2)dos 窗口使用 pip list ==》查看当前python安装了哪些第三方库 3)pip安装好的库一般是在 C:\Python37\Lib\site-packages 里面 11、selenium原理 1)selenium 库中有一个webdriver包,webdriver包里面有一个chrome包,里面有一个webdriver模块 2)在C:\Python37\Scripts 放入 chromedriver.exe 驱动 12)selenium 中元素定位方法 webdriver 模块提供了9种定位方法 ①id 定位 如果把元素定位看成一个人的话,id就是身份证 唯一 通过id属性定位 1、谷歌浏览器 f12 2、鼠标空白处右键点击检查 ②、name定位 name属性好比一个人的名字,可以重复,也可以唯一 ③class 定位 class 和name差不多,可以重复 可以唯一 ④ xpath 定位 xpath 是通过路径定位元素(绝对路径和相对路径) from selenium import webdriver 通过selenium库导入webdriver包 from time import sleep driver = webdriver.Chrome() 创建一个driver对象或者说一个浏览器对象, 打开一个空白的浏览器 通过webdriver模块调用了Chrome() 类 driver.get(') 打开百度 driver.maximize_window() 窗口最大化 sleep(5) 等待3s 元素定位id 1)id 定位法 driver.find_element_by_id('kw').send_keys('python') 2)name定位法 driver.find_element_by_name('wd').send_keys('python') 3)class 定位法 driver.find_element_by_class_name('s_ipt').send_keys('python') 4)link_text 定位链接 driver.find_element_by_link_text('hao123').click() 点击链接 5)partial_link_text 模糊匹配 driver.find_element_by_partial_link_text('123').click() 6)JavaScript 定位,var 是JavaScript里面定义变量的 a 是变量 js = 'var a =document.getElementById("kw").value="python"' driver.execute_script(js) 执行 7)tag_name 定位 s = driver.find_element_by_tag_name('input') 这个只适合一个input标签 s = driver.find_elements_by_tag_name('input') 定位input标签放到列表中 print(type(s)) 数据类型<class 'list'> print(len(s)) 17 for i in s: if i.get_attribute('id')=='kw': i 就是一个一个input标签,当判断是百度输入框的那个input就输入python i.send_keys('python') 8)xpath 定位 driver.find_element_by_xpath('//*[@id="kw"]').send_keys('python') driver.find_element_by_xpath('//*[@name="wd"]').send_keys('python') driver.find_element_by_xpath('//*[@class="s_ipt"]') driver.find_element_by_xpath('//*[@name="wd" and @class="s_ipt"]').send_keys('python') 组合标签 driver.find_element_by_xpath('//*[@autocomplete="off"]').send_keys('python') driver.find_element_by_xpath('//*[@id="form"]/span[1]/input[1]').send_keys('python') id = form 是input的上上级,input的上级是span标签,span是form下第一个标签再 下面的第一个input 9)css定位 driver.find_element_by_css_selector('kw').send_keys('python') id选择器定位 driver.find_element_by_css_selector('.s_ipt').send_keys('python') class选择器 driver.find_element_by_css_selector('[name=wd]').send_keys('python') driver.find_element_by_css_selector('[class=s_ipt]').send_keys('python') driver.find_element_by_css_selector('[name=wd][class=s_ipt]').send_keys('python') 组合选择器 driver.find_element_by_css_selector('[autocomplete=off]').send_keys('python') driver.find_element_by_css_selector('span>input').send_keys('python') 找上级 driver.find_element_by_css_selector('form>span>input').send_keys('python') 找上上级 找上上级标签 10) 1、定位文本框和密码框 from selenium import webdriver from time import sleep driver = webdriver.Chrome() driver.get('http://cms.duoceshi.cn/cms/manage/login.do') driver.maximize_window() sleep(3) driver.find_element_by_id('userAccount').send_keys('admin') driver.find_element_by_id('loginPwd').send_keys('123456') driver.find_element_by_id('loginBtn').click() 点击登录按钮 2、通过send_keys方法上传文件 from selenium import webdriver from time import sleep driver = webdriver.Chrome() driver.get('file:///D:/lesson2/%E7%AC%AC%E4%BA%8C%E4%B8%AA%E6%9C%88%E7%9A%84%E8%AF%BE%E4%BB%B6/20.11.16%E5%8F%B7-18%E5%8F%B7%20%E7%AC%AC%E4%BA%8C%E4%B8%AA%E6%9C%88%E4%B9%8B%E7%AC%AC11%E8%AE%B2%EF%BC%9A%E5%A4%9A%E6%B5%8B%E5%B8%88ui%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E5%AE%9E%E6%88%98%E4%B9%8Bselenium/elem/upload_file.html') driver.maximize_window() sleep(3) 第一种方法 driver.find_element_by_id('file').send_keys(r'C:\Users\Administrator\Desktop\data.csv') 第二种方法 ele =driver.find_element_by_id('file') ele.send_keys(r'C:\Users\Administrator\Desktop\data.csv') 3、定位百度隐藏框 from selenium import webdriver from time import sleep from selenium.webdriver.common.action_chains import ActionChains ActionChains 类 driver = webdriver.Chrome() driver.get(') driver.maximize_window() sleep(3) 第一种方法 点击设置==》然后选择搜索设置 driver.find_element_by_id('s-usersetting-top').click() 点击设置 driver.find_element_by_link_text('搜索设置').click() 点击设置后再搜索设置哪里右键检查定位 sleep(2) 第二种方法 模拟 mouse orver 鼠标悬浮 mouse = driver.find_element_by_id('s-usersetting-top') 定位赋值给mouse ActionChains(driver).move_to_element(mouse).perform() move_to_element 就是鼠标移动到设置上面 perform() 执行这个操作 driver.find_element_by_link_text('搜索设置').click() sleep(2) driver.find_element_by_link_text('保存设置').click() 点击保存设置 sleep(2) alert = driver.switch_to.alert 进入到alert弹框 print(alert.text) 打印弹框的信息 打印文本 已经记录下您的使用偏好 alert.accept() 点击确定按钮 alert.dismiss() 点机取消按钮 4、selenium 当中的等待 ''' 1 线程等待 sleep(5) 不管有没有加载出来都会等待5s 强制等待 2 隐式等待 implicitly_wait(5) 智能等待,作用域全局,如果再5s内全部网页元素加载完成则继续 往下执行,超过5s则报错 3 显示等待 WebDriverWait 只作用于特定的元素,每个几秒去刷新和寻找页面元素,如果找不到 则往下执行,超过5s则报错 ''' from selenium import webdriver from time import sleep from selenium.webdriver.support.wait import WebDriverWait 导入显示等待的包 from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By driver = webdriver.Chrome() driver.get() driver.maximize_window() sleep(3) 线程等待 driver.implicitly_wait(5) 隐式等待 driver.find_element_by_id('kw').send_keys('python') WebDriverWait(driver,5,poll_frequency=0.5).until(EC.presence_of_all_elements_located((By.ID,'su'))) driver.find_element_by_id('su').click() 点击百度按钮 sleep(5) driver.close() 5 获取text文本信息和title from selenium import webdriver from time import sleep driver = webdriver.Chrome() driver.get() driver.maximize_window() 1)获取文本 value = driver.find_element_by_xpath('//*[@id="s-top-left"]/a[2]').text 获取页面元素 if value=='hao123': print('获取成功') else: print('获取失败') 2)获取title 断言 title = driver.title 获取标题 print(title) if title =='百度一下,你就知道': print('获取成功') else: print('获取失败') assert title=='百度一下,你就知道' 不会有打印结果 6 刷新窗口 打开一个新的窗口 返回上一步 获取窗口大小 1)获取窗口大小 size = driver.get_window_size() print(size) {'width': 1296, 'height': 696} 2)返回上一步 driver.find_element_by_id('kw').send_keys('python') sleep(5) driver.find_element_by_id('su').click() sleep(3) driver.back() 返回上一步 sleep(3) 3)刷新窗口 driver.refresh() 4)打开一个新窗口 win = 'window.open()' driver.execute_script(win) 7) 切换窗口 from selenium import webdriver from time import sleep driver = webdriver.Chrome() 打开第一个窗口 driver.get('') driver.maximize_window() 打开第二个窗口 win = 'window.open()' driver.execute_script(win) title = driver.title print(title) 百度一下,你就知道 当前主窗口是百度 handle = driver.current_window_handle 获取当前主窗口百度的句柄 句柄:是一个用来标识的对象 print(handle) CDwindow-2F4444FCA95D218C0104681A947B0BD1 all_handle = driver.window_handles 获取所有窗口的句柄 print(all_handle) ['CDwindow-39CFEA72D8404179150BE6545D76468C', 'CDwindow-6B373C86709BEC4ABF146808CAE46B97'] 1)通过索引取值去切换窗口 driver.switch_to.window(all_handle[1]) 切换窗口 title1 = driver.title print(title1) 京东(JD.COM)-正品低价、品质保障、配送及时、轻松购物! 2)通过for循环 for i in all_handle: if i !=handle: 判断如果i 不是当前百度句柄,那就切换窗口 driver.switch_to.window(i) 切换京东窗口 title2 = driver.title print(title2) 京东(JD.COM)-正品低价、品质保障、配送及时、轻松购物!
|