赞
踩
因为web页面经常会变化,所以UI自动化测试的维护成本很高。不如接口的适用面广,所以大部分公司会做接口自动化测试,但是未必会做UI自动化测试;
UI自动化测试要做也是覆盖冒烟测试,不会到很高的覆盖率:
接口自动化测试框架覆盖率: 90%+,能做回归测试。
UI自动化测试框架覆盖率【用例】:30%-40%,能做冒烟测试【正常用例】,覆盖核心功能的页面配置,减少重复的页面操作。
【其他框架: cypress,robotframework,playwright-- 录播课程】
Selenium是用于Web应用自动化测试的工具,开源并且免费
支持Chrome、FireFox、Edge、IE、Safari等主流浏览器 【Chrome支持的最好 最稳定 推荐】
支持Java、Python、Net、Perl等编程语言进行自动化测试脚本编写
官网地址:https://selenium.dev/
selenium ide : 录制工具。 谷歌和火狐的插件。用途:录制回放bug的过程。不推荐用,录制基本都需要再修改;30分钟就学会了。
selenium webdriver : 核心,重点学习的,,提供了各种语言环境的API来支持更多控制权和编写符合标准软件开发实践的应用程序
selenium grid : 分布式测试,通过Selenium Grid可以将自动化测试脚本分发到不同的测试机器中执行;用例分布不同的设备上运行,提高运行效率。
1、pip install selenium==4.3.0,最好指定版本安装,因为不同的版本可能会有一些兼容
性的问题。
2、下载浏览器驱动:注意 驱动程序要与浏览器的类型和版本匹配。
浏览器安装文件及对应的驱动:
浏览器 | 安装文件下载地址 | 对应驱动下载地址 |
Chrome 【稳定 推荐】 | Google Chrome 64bit Windows版_chrome浏览器,chrome插件,谷歌浏览器下载,谈笑有鸿儒 | CNPM Binaries Mirror |
Firefox | Microsoft Edge WebDriver | Microsoft Edge Developer | https://npm.taobao.org/mirrors/geckodriver/ |
Edge | https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/ | Microsoft Edge WebDriver | Microsoft Edge Developer |
IE - old,不 推荐 | 驱动版本需求与selenium保持一致,建议使用32位的 IE驱动,兼容性更好 | http://selenium-release.storage.googleapis.com/index.html |
3、装好浏览器,正确安装。最好在默认的路径下。一定要记得关闭自动更新。
4、测试:能否利用代码打开浏览器。
- from selenium import webdriver
- # 启动与浏览器的会话。打开浏览器,同时也会去启动驱动程序。chrome.driver启动后 就是一个IP+ 端
- 口,就是启动了一个服务。
- driver = webdriver.Chrome()
- # 打开谷歌浏览器,然后访问百度首页。
- driver.get("http://www.baidu.com")
- # 关闭当前正在使用的窗口。
- driver.close()
- # # 主动结束与浏览器的会话,关闭浏览器,关闭驱动程序。
- # driver.quit()
- """
- 因为页面执行速度很快,UI需要加一些等待。-- 为了就看清楚
- time.sleep(1) == 时间是秒的单位
- """
-
- from selenium import webdriver
- import time
-
- # 启动一个空的浏览器程序,建立了浏览器的会话 后续的操作都是在这个会话上面做的,存在一个变量里 driver
- driver = webdriver.Chrome() # 注意: Chrome 大写的,后面有括号; 写错了会有问题
- # 第二步: 在启动的浏览器里输入网址 打开网站
- driver.get("https://www.baidu.com/")
-
- # 页面常用操作
- # 1、最大化窗口
- driver.maximize_window()
-
- time.sleep(2)
-
- # 2、刷新页面
- driver.refresh()
- time.sleep(2)
-
- # 3、打开新的页面网址
- driver.get("https://www.lagou.com/wn/")
- time.sleep(2)
-
- # 4、回退到上一个页面
- driver.back()
- time.sleep(2)
-
- # 5、前进到下一个页面
- driver.forward()
- time.sleep(2)
-
- # 6、获取页面源码
- # print(driver.page_source)
-
- # 7、获取页面的标题
- print(driver.title)
-
- # 8、获取页面的url
- print(driver.current_url)
-
- # 9、执行完用例之后 把打开的浏览器关闭
- driver.close()
- # driver.quit()
driver.close():关闭当前正在使用的窗口。
driver.quit():真正关闭浏览器(把所有的窗口都关闭,并且退出浏览器,关闭驱动程序)
进阶的用法:
- # 6、获取页面源码
- # print(driver.page_source)
-
- # 7、获取页面的标题
- print(driver.title)
-
- # 8、获取页面的url
- print(driver.current_url)
并不是所有的页面内容都有直接对应的方法进行操作的,更多的内容操作需要使用特定方法进行元素的定位。要进行元素定位,需要先知道HTML页面的组成部分:
HTML页面的组成:HTML+CSS+javascript
1、HTML 是用来描述网页的一种语言。 指的是超文本标记语言 (Hyper Text Markup Language) ,HTML 不是一种编程语言,而是一种标记语言 (markup language)
2、CSS:Cascading style sheets控制页面该如何呈现,即布局设置;比如字体颜色,字体大小,在页面呈 现的大小等。
3、Javascript:可以让你页面依据不同的情形做不同的事情。
元素定位的目标:找到要操作的元素(唯一),然后进行操作。一定要找到唯一的元素,如果找到多个,就考虑换一个定位方法。 8大元素定位:分为2大类
代码里查找元素的方法: driver.find_element()
- import time
- from selenium import webdriver
- from selenium.webdriver.common.by import By
- browser = webdriver.Chrome()
- browser.get("https://www.baidu.com")
- browser.find_element(By.ID,'kw').clear()
- browser.find_element(By.ID,'kw').send_keys('selenium')
- browser.find_element(By.ID,'su').click()
- time.sleep(20)
- browser.quit()
- from selenium import webdriver
- from selenium.webdriver.common.by import By
- 驱动 = webdriver.Chrome()
- 驱动.get("https://www.baidu.com/")
- 驱动.find_element(By.CLASS_NAME,'s_ipt').send_keys("美女")
- 驱动.find_element(By.ID,'su').click()
- 驱动.sleep(20)
- 驱动.quit()
- from selenium import webdriver
- 驱动 = webdriver.Chrome()
- from selenium.webdriver.common.by import By
- 驱动.get("https://www.baidu.com")
- 驱动.find_element(By.NAME,"wd").send_keys('美女')
- 驱动.find_element(By.ID,'su').click()
- 驱动.sleep(20)
- 驱动.quit()
- from selenium import webdriver
- from selenium.webdriver.common.by import By
- 驱动 = webdriver.Chrome()
- 驱动.get("https://www.baidu.com")
- 驱动.find_element(By.TAG_NAME,"input")
- 驱动.find_element(By.ID,'su').click()
- from selenium import webdriver
- from selenium.webdriver.common.by import By
- 驱动 = webdriver.Chrome()
- 驱动.get("https://www.baidu.com")
- 驱动.find_element(By.LINK_TEXT,"hao123").click()
- 驱动.sleep(20)
- 驱动.quit()
- from selenium import webdriver
- from selenium.webdriver.common.by import By
- 驱动 = webdriver.Chrome()
- 驱动.get("https://www.baidu.com")
- #文本精准匹配
- 驱动.find_element(By.LINK_TEXT,"hao123").click()
- #文本模糊匹配
- 驱动.find_element(By.PARTIAL_LINK_TEXT,'帮助').click()
- 驱动.sleep(20)
- 驱动.quit()
1、根据标签名定位 :它的问题是不唯一,一般页面中会有很多相同标签的元素,所以基本不用
driver.find_element(By.CSS_SELECTOR,"input");
2、根据ID定位
- driver.find_element(By.CSS_SELECTOR,"#kw");
- driver.find_element(By.CSS_SELECTOR,"标签名#id"); //使用html标签拼上#id
3、根据className定位: 可以支持多个样式一起写
- driver.find_element(By.CSS_SELECTOR,".样式名");
- driver.find_element(By.CSS_SELECTOR,"标签名.样式名"); //标签名拼上样式
4、单属性选择定位: 需要其他的属性一起定位,可以用标签[属性名=“属性值”]
driver.find_element(By.CSS_SELECTOR,"标签名[属性名='属性值']");
5、多属性选择定位: 如果一个属性不能唯一定位,用个属性组合
driver.find_element(By.CSS_SELECTOR,"标签名[属性1='属性值'][属性2='属性值']");
绝对路径:从根节点开始,一层一层写出来,直到要找到元素。父/子 路径和位置都涵盖 了,所以特别不稳定。
相对路径: 以//开头,相对于某个节点的路径来找通过条件在html里面找。
在页面当中查看xpath表达式,可以匹配多少元素:F12 -- ctrl + F
第一种写法:
- //input[@placeholder="Say sth..."]
- //a[text()="新闻"]
第二种写法:and or 来组合多个属性和文本 //元素标签名称[@属性=值 and @属性=值 and text()=值]
- //a[@class="title fn__ellipsis" and @href="http://testingpai.com/article/1595507317340"]
- //a[@target='_blank'and@class='mnav c-font-normal c-color-t'and text()="新闻"]
第三种:*代表通配符,表示筛选所有的标签名
- //*[@id='kw']
- //*[@class="sign-num"]
第四种方法:contains(text(), 包含的内容) contains(@属性名, 包含的内容)
- //标签名[contains(@属性名,'值')]
- #案例-百度的://span[contains(@class,'s-top-right-text')]
- //a[contains(@class,'mnav') and contains(text(),'新闻')]
- //span[contains(text(),"已有") and contains(text(),"人加入")]
- //span[contains(text(),"已有") and @class="member"]
WebDriver协议(制定通讯的规则-底层基于http协议,作为一个翻译的角色):启动驱动程序,就是http 协议 监听某个端口【就是一个服务】; 由selenium代码向他发起请求。实现各种操作。
The WebDriver Wire Protocol,由Selenium基于Http设计并定义的协议,各大浏览器厂商都提供了实现 了该协议的驱动程序(ChromeDriver,Geckodriver、EdgeDriver等),通过这套协议我们可以操作浏览 器实现各种控制动作:打开、关闭、最大化、最小化、元素定位、元素操作等等。
原理:核心部分通过统一化WebDriver协议通讯,客户端(代码段端)会发送法指令给驱动程序,驱动程 序是由不同的浏览器厂商开发的,驱动程序会自己内部将指令翻译,再去将翻译之后的指令做转发,转发 给浏览器,浏览器就能去执行对应的指令并且将结果告诉给客户端。
1、按照html页面的顺序,从上到下定位。--层级定位
写法://.......//.......//.....
什么情况下用到轴定位:如果元素之间有父子关系(儿子找爸爸)、兄弟关系 (找哥哥/找弟弟)
轴名称 | 释义 |
ancestor | 选择当前节点的所有祖先节点。(包括父节点) |
parent | 选择当前节点的父节点。 |
child | 选择当前节点的所有子节点。 |
descendant | 选择当前节点的所有后代节点。 |
following-sibling | 选择当前节点之后的所有同级节点。(找弟弟) |
following | 选择当前节点之后的所有节点,不包括后代节点。 |
preceding | 选择当前节点之前的所有节点,不包括后代节点。 |
preceding-sibling | 选择当前节点之前的所有同级节点。(找哥哥) |
ancestor
//a[text()='新闻']/ancestor::div
parent
//a[text()='新闻']/parent::div
//a[text()='新闻']/parent::div//a[text()='地图']
child 与
following-sibling
//div[@class='mnav s-top-more-btn']/child::div/child::div//following-sibling::div
descendant
//div[@class='mnav s-top-more-btn']/child::div/descendant::a//div[text()='翻译']
preceding-sibling
//a[text()='网盘']/preceding-sibling::a/following-sibling::a[text()='地图']
By类中,定义了8种定位策略,可以直接导入使用:
- from selenium.webdriver.common.by import By
- driver.find_element(By.XPATH,"xpath表达式")
WebElement类当中定义常用的方法:
如果元素定位表达式对应的元素不在页面当中,则会报错 NoSuchElementException。
- from selenium import webdriver
- from selenium.webdriver.common.by import By
- from time import sleep
- driver = webdriver.Chrome()
- driver.get("http://baidu.com")
- driver.maximize_window()
- driver.find_element(By.ID, 'kw').clear()
- sleep(2)
- print(driver.find_element(By.ID, 'kw').get_attribute('class') )
-
- driver.find_element(By.ID, 'kw').send_keys("selenium")
- search_box_text = driver.find_element(By.ID, 'kw').text
- print("-----------------:"+search_box_text)
- sleep(2)
-
-
-
- driver.find_element(By.ID, 'su').click
- sleep(2)
-
- driver.close()
搜索框(<input>
元素)通常不会有可见的文本内容,因此search_box_text
将返回一个空字符串。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。