一、自动化基础概念
1、自动化工具(相当于手机的CPU)
主流的测试工具:
以上工具只是提供了一套操作浏览器的API,如:打开页面、输入、点击、截图、上传等
2、自动化框架(相当于具体的手机)
自动化框架提供一整套测试方案,如:
- 用例的概念
- 执行规则
- 执行的结果,生成报告
- 设计模式
主流的测试框架:
- Robot framework(集成了SeleniumLibrary)
- SeleniumBase(基于Selenium)
- Seldom(基于Selenium)
3、 selenium的工作原理
1. selenium1.0=selenium RC+selenium IDE+selenium Grid
-
selenium IDE:集成在Firefox浏览器的插件,实现简单的浏览器操作的录制与回放功能
-
selenium Grid:用来做分布式的,如一套代码在不同的环境上运行
-
selenium RC(Remote Control):被集成在一个selenium service -XXX.jar,支持多种不同语言编写的自动化测试脚本,通过
Selenium RC 的服务器作为代理服务器去访问应用,从而达到测试的目的。
selenium RC工作方式:python(selenium)—>selenium server(监听4444端口)—>浏览器执行
2. selenium2.0=selenium1.0+webdriver
webdriver工作方式:python(selenium)—>Chromedriver驱动器—>浏览器执行
python(selenium默认自带Firefox驱动)—>浏览器执行
3. selenium3.0=selenium2.0-selenium RC
webdriver工作方式:python(selenium)—>Chromedriver驱动器—>浏览器执行
python(selenium-Firefox驱动被剥离了)—>浏览器执行
4. 各个浏览器驱动对应名称:
- geckodriver(Firefox)
- Chromedriver(Chrome)
- IEDriverServer(IE)
- operadriver(Opera)
- phantomjs(PhantomJS)
- MicrosoftWebDriver(Edge)
下载浏览器驱动器后,解压放入文件夹中,将文件夹地址配置到系统的环境变量下,然后重启IDE
4、自动化测试核心是学三个技术
- 编程语言:Python、Java…
- selenium、Appium、request的使用
- 单元测试框架:UnitTest、Pytest
- 扩展:集成报告,自动发送邮件、po设计模式、数据驱动
环境安装
selenium安装
安装 python(推荐3.8)
pip install Selenium
pip show Selenium
python目录
D:\software\Python39:项目的根目录
D:\software\Python39\Scripts:可执行文件
D:\software\Python39\Lib\site-packages:存放所有安装的第三方库和框架
编辑器和IDE
- 通用的编写文本的工具:记事本
- 代码编辑器:sublime text、vscode
- IDE:集成开发工具:eclipse、pycharm(不要用虚拟环境)
5、 自动化基本概念
-
库:是由代码集合成的一个产品,供程序员调用。面向对象的代码组织形成的库叫类库,面向过程的代码组织形成的库叫函数库。解决的是一个问题点,如:time、selenium、requests等
-
框架:是为解决一个或一类问题而开发的产品,用户一般只需要使用框架提供的类或函数,即可实现全部功能。解决一个问题面,如:django、unittest等
-
工具:跟框架类似,但是它屏蔽了底层的代码,一般提供单独的操作界面供用户操作。解决一个问题面,如:selenium IDE等
6、自动化测试模型
-
线性测试:一系列的顺序操作,每个测试脚本相对独立,且不产生其他依赖与调用。简单来说就是单纯的来模拟用户完整的操作场景。
-
模块化与类库:把重复的操作独立成封装成公共模块,当用例执行过程中需要用到这一模块操作时则被调用,这样就最大限度地消除了重复,从而提高测试用例的可维护性。
-
数据驱动测试:数据的改变影响结果的改变。例如登录不同的用户,登录操作一致,但是用户不一致,则可以使用数据驱动,如ddt,parameterized库
-
关键字驱动测试:把操作封装成关键字,调用关键字实现操作。如robotframework
二、WebDriver API
1、定位元素的方法
** WebDriver 提供了八种元素定位方法(elements定位一组元素):**
- 使用导包By(4.0)
from selenium.webdriver.common.by import By
- id
driver.find_element(By.ID,"kw")
- name
driver.find_element(By.NAME,"wd")
- class_name
driver.find_element(By.CLASS_NAME,"s_ipt")
- tag_name
driver.find_element(By.TAG_NAME,"input")
- link_text
driver.find_element(By.LINK_TEXT,"新闻")
- partial_link_text
driver.find_element(By.PARTIAL_LINK_TEXT,"新")
- xpath
driver.find_element(By.XPATH,"//*[@class='bg s_btn']/input[2]") #'//' 在某一层级下面,'/'在html下面,*任意标签
- css
find_element(By.CSS_SELECTOR,"span.bg s_btn_wr>input:nth-child(2)#su") # 定位第二个标签的子元素
- 使用
find_element_by_*
- id
driver.find_element_by_id("kw")
- name
driver.find_element_by_name("wd")
- class_name
driver.find_element_by_class_name("s_ipt")
- tag_name
driver.find_element_by_tag_name("input")
- link_text
driver.find_element_by_link_text("新闻")
- partial_link_text
driver.find_element_by_link_text("新")
driver.find_element_by_xpath('//input[contains(@class="s_ipt")]') #contains包含文本
driver.find_element_by_css_selector('[name="wd"]') #注:#代表id .代表class
2、UI自动化元素的定位技巧:
- 在当前页面是唯一的元素名称:可以在浏览器的console确定元素是否是唯一的(
document.querySelectorAll("div#kw")
) - 标签无元素属性时,可以通过父级查找
- 可以使用逻辑符号连接元素and,增加唯一性
- 4.0增加了相对定位(near/above/below/to_left_of/to_right_of)
3、常用API
- 设置浏览器窗口尺寸
driver.set_window_size(wide, high)
- 浏览器前进、后退
driver.forward() #前进
driver.back() #后退
- 模拟浏览器刷新
driver.refresh()
- 鼠标事件
- ActionChains提供鼠标操作的常用方法:
- perform(): 执行所有 ActionChains 中存储的行为
- context_click(): 右击
- double_click(): 双击
- drag_and_drop(): 拖动
- move_to_element(): 鼠标悬停
from selenium.webdriver.common.action_chains import ActionChains #导包
# 定位到要悬停的元素
above = driver.find_element_by_link_text("设置")
# 对定位到的元素执行鼠标悬停操作
ActionChains(driver).click_and_hold(above).perform()
- 键盘事件
from selenium.webdriver.common.keys import Keys #导包
#常用键盘操作:
#删除一个字符(BackSpace)
driver.find_element_by_id("kw").send_keys(Keys.BACK_SPACE)
#空格键 (Space)
send_keys(Keys.SPACE)
#制表键 (Tab)
send_keys(Keys.TAB)
#回退键(Esc)
send_keys(Keys.ESCAPE)
#回车键(Enter)
send_keys(Keys.ENTER)
#全选(Ctrl+A)
send_keys(Keys.CONTROL,'a')
#复制(Ctrl+C)
send_keys