【web自动化】-1- 前端基础及selenium原理和环境安装
1. 什么是 web 自动化测试?
web 自动化测试是指使用自动化测试的工具或者框架,通过编写脚本模拟用户在 web 页面上进行任意操作
特点: web 自动化测试是一种比较高效,准确,可重复性的测试方法,降低成本,提高效率,并且缩短测试周期,包括后期的维护。
2.web 自动化测试的基本流程
- 需求分析:明确需求测试的目标及范围
- 技术选型:根据需求和项目的特点,选择合适的工具或者自动化测试框架确定技术内容
- 搭建自动化测试的环境:
- 测试环境,测试服务器,测试的数据,以及测试的工具等等....
- 编写自动化测试用例的脚本:
- 第一轮冒烟测试的线性脚本完成之后,再采取设计模式进行封装
- 一般情况会采取 2 种类型的设计模式
- pom 设计模式
- kdt 设计模式
- 核心要素:可重复,可扩展,可维护
- 自动化执行用例脚本:需要让测试用例自动化执行,并且记录测试结果及日志信息收集
- 分析测试结果:对自动化测试结果进行全面分析,发现测试的缺陷以及瓶颈
- 自动化的结果进行缺陷报告输出: allure 可以记录测试的所有缺陷详细内容
- 完善持续集成:将自动化测试集成到持续系统中,实现自动化测试的持续化和自动化的部署
3.web 自动化测试场景
具体使用的场景:
- 冒烟测试
- 回归测试
- 用于线上巡查
4.web 页面的构造
web (页面) =html+css+JavaScript (前端三剑客)
html: 是一门标记语言,又标记 (标签) 组成,核心的决定了页面的内容
css: 决定了内容进行修饰:颜色,大小,字体,位置等等
JavaScript: 决定了页面的交互和执行,可以改变 html 和 css
HTML 就像一个房子的布局 毛坯房。css 就是这个房子的装修和风格。javascript 就是人和这个房子的交互,比如开开关,改变房子的布局。
标签有开始和结束
- 标签有固定的属性值:标签的里面: type,value,name
<!--<input type="radio" value="C" name="天秋"> <cbr>-->
- 标签可以有文本信息内容:开始 C 结束标签中间的内容
HTML就像一个房子的布局 毛坯房。 css就是这个房子的装修和风格。javascrip就是人和这个房子的交互,比如开开关,改变房子的布局。
5. 元素的基本属性和方法
- 获取元素的大小(宽高): size
- 获取元素的文本内容: text(如果该元素没有文本内容那么返回值是空值)
- 获取元素的具体某个属性: get_attribute(指定获取元素的属性值)
- 查看元素是否可见: is_display () 返回值是布尔值
- 查看元素是否可用: is_enable () 返回值是布尔值
el1 = driver.find_element(By.XPATH, '//*[@id="hotsearch-content-wrapper"]/li[1]/a/span[2]')
# - 获取元素的大小(宽高): size
print(el1.size) # {'height': 18, 'width': 187}
# - 获取元素的文本内容: text(如果该元素没有文本内容那么返回值是**空值**)
print(el1.text)
# - 获取元素的具体某个属性: get_attribute(指定获取元素的属性值)
print(el1.get_attribute("class")) # title-content-title
# 当获取元素的属性值没有的时候,返回空值
# - 查看元素是否可见: is_display ()返回值是布尔值
print(el1.is_displayed()) # True
# - 查看元素是否可用: is_enable ()返回值是布尔值
print(el1.is_enabled()) # True
6.对浏览器的操作
# driver.set_window_position(100,600)driver.find_element(By.XPATH, '//*[@id="kw"]').send_keys("高启强")
driver.find_element(By.XPATH, '//*[@id="su"]').click()
time.sleep(2)
# - 浏览器的刷新
driver.refresh()
time.sleep(2)
# - 浏览器的回退
driver.back()
time.sleep(2)
# - 浏览器的前进
driver.forward()
time.sleep(2)
# - 浏览器的刷新
driver.refresh()
time.sleep(2)
# - 关闭浏览器的**当前页面**
driver.close()# 强制等待
time.sleep(5)
# - 关闭**整个浏览器页面**
# 关闭驱动对象
driver.quit()
7. 获取浏览器的相关信息
- 获取页面的标题
- title
print(driver.title)
- 获取当前页面的 url (网址)
- current_url
print(driver.current_url)
8. 等待
为什么要给页面设置等待时间?
因为在做 web 自动化测试的过程中,当需要对页面进行元素定位的时候,有些元素并不是在还 html 中,有可能是通过 JavaScript 脚本代码执行操作之后得到的元素结果,很可能要去定位该元素的时候,脚本并没有执行完成,JavaScript 对元素的操作还未进行得到最终结果,所以此时去定位元素的时候,程序就会报错。
元素未加载完成,就去定位元素,那么程序会报错
强制等待
- time.sleep (秒钟)
driver.find_element(By.XPATH, '//*[@id="kw"]').send_keys("美女")
driver.find_element(By.XPATH, '//*[@id="su"]').click()
# 第一种等待方式: 强制等待
time.sleep(2)
driver.find_element(By.XPATH, '//*[@id="1"]/div/h3/a').click()
显式等待
# 导入显示等待的模块及包
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC# 第二种等待方式: 显示等待
el1 = WebDriverWait(driver, 3).until(EC.presence_of_element_located((By.XPATH, '//*[@id="1"]/div/h3/a')))
# driver.find_element(By.XPATH, '//*[@id="1"]/div/h3/a').click()
el1.click()
- 在设定的时间内,不间断的时间点去定位该元素
- 一旦元素被加载出来,就会被定位到该元素,然后执行操作
- 如果在有效时间内没有定位到该元素,那么程序会报错:超时错误 TimeoutException
- 目前使用默认的显示等待方法,后期会进行独立封装和优化
隐式等待
# 第三种等待方式: 隐式等待
driver.implicitly_wait(3)
driver.find_element(By.XPATH, '//*[@id="1"]/div/h3/a').click()
- 元素第一次被定位的时候如果能够定位到,那么不会触发隐式等待,如果定位不到才会触发隐式等待的有效时间
- 可以设置隐式等待的有效时长,如果在有效时长里面定位到该元素,那么不会报错,反之会报错提示:没有找到该元素的异常: NoSuchElementException
9. 键盘的操作
通过 send_keys () 方法进行输入内容
输入的方法可以使用键盘所有按键包括快捷键
键盘的所有按键可以结合 Keys 类进行使用
from selenium.webdriver import Keys
el1 = driver.find_element(By.XPATH, '//*[@id="kw"]')
el1.send_keys("美女")
# ctrl+a全选按键操作
time.sleep(2)
el1.send_keys(Keys.CONTROL, "a")
time.sleep(2)
el1.send_keys(Keys.CONTROL, "c")
time.sleep(2)
el1.send_keys(Keys.BACKSPACE)
time.sleep(2)
el1.send_keys("帅哥")
time.sleep(2)
el1.send_keys(Keys.CONTROL, "a")
time.sleep(2)
el1.send_keys(Keys.CONTROL, "v")
time.sleep(2)
el1.clear()
10. 鼠标的操作
使用前需要创建事件链对象,所有事务的提交都要perform
# 创建事件链对象
ac_chains = ActionChains(driver)
el1 = driver.find_element(By.XPATH, '//*[@id="passwordA"]')
el2 = driver.find_element(By.XPATH, '//*[@id="userA"]')
el3 = driver.find_element(By.XPATH, '//*[@id="zc"]/fieldset/button')# 右击操作
ac_chains.context_click(el1)# 所有的事件链操作必须进行提交事务: perform
ac_chains.perform()
time.sleep(2)
# - 双击: double_click()
ac_chains.double_click(el2)
ac_chains.perform()
# - 拖拽: drag_and_drop()
el1 = driver.find_element(By.XPATH, '//*[@id="div1"]')
el2 = driver.find_element(By.XPATH, '//*[@id="div2"]')
# - 悬停: move_to_element()
ac_chains.drag_and_drop(el2, el1)
ac_chains.perform()
ac_chains.move_to_element(el3)
ac_chains.perform()
11. 下拉框
需要对下拉选择框的元素进行定位的时候必须先创建一个选择框对象
使用步骤:
- 首先需要通过 Select 类创建一个 select 对象
- 通过 select 对象使用不同的方式去定位下拉框具体元素
- 通过索引选择定位
- 通过文本内容选择定位
- 通过属性 value 选择定位
driver.get("file:///D:/%E6%96%87%E4%BB%B6%E5%A4%B9/5.27/work/327/python%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E4%BB%A3%E7%A0%81/python%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E5%A0%82%E8%B5%84%E6%96%99%E5%92%8C%E4%BB%A3%E7%A0%81/web%E8%87%AA%E5%8A%A8%E5%8C%96day01/%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E4%BB%A3%E7%A0%81/%E6%B3%A8%E5%86%8CA.html")
# 页面最大化
driver.maximize_window()select = Select(driver.find_element(By.XPATH, '//*[@id="selectA"]'))
time.sleep(2)
# - 通过索引选择定位
select.select_by_index(2)
time.sleep(2)
# - 通过文本内容选择定位
select.select_by_visible_text("A上海")
# - 通过属性value选择定位
time.sleep(2)
select.select_by_value("bj")
12. 页面滚动操作
selenium 当中默认没有提供具体滚动的操作方法
可以通过 javaScript 脚本去执行滚动操作
使用步骤:
- 首先定义一个滚动的 js 脚本
- 然后执行脚本内容即可
说明: scrollTo (0,10000000) 方法:
- 可以使用 2 个实参
- 第一个代表 X 坐标,页面左右滚动
- 第二个代表 Y 坐标,页面上下滚动
- 默认最大值或者超过最大值滚到页面最下端
- 如果想要页面执行 javaScript 脚本都可以调用 driver.execute_script () 执行具体脚本内容
# 定义js脚本
time.sleep(2)
js_str = "window.scrollTo(0,10000000)"
# 执行脚本
driver.execute_script(js_str)
13. 页面截图
selenium 提供了截图方法,但是目前只支持 png 的格式
# 截图
driver.get_screenshot_as_file("百度首页.png")