本文重点: selenium特点、webdriver工作原理、脚本录制和一些简单api的使用
什么是自动化测试?
自动化测试是指软件测试的自动化,在预设条件下运行系统或应用程序,评估运行结果,预先条件应包括正常条件和异常条件。
自动化测试工具有哪些?
QTP
- selenium
- jmeter(性能测试工具,主要测试接口,可以自己设置,也可以录制脚本,也可以进行接口测试)
- Loadrunner (性能测试工具,UI界面录制)
- soupUI(接口测试工具,postman也可以进行接口测试)
- appium(APP自动化测试工具)
- macaca 阿里巴巴开发的
自动化测试金字塔(自上而下):
UI自动化 页面用例维护量比较大,适合界面稳定的时候做自动化测试
接口自动化 适合接口稳定的项目,和UI界面比效率比较高,用例维护量适中
单元测试 使用java语言中Junit去做
越往上,效率越低,测试用例维护越来越麻烦
自动化适用于什么测试?
兼容性测试、回归测试(脚本重复利用率越高,自动化的价值越大)
如何实施自动化测试:先分析,然后编写测试用例,实现脚本,执行脚本,进行对脚本维护
selenium有哪些特点?
- 轻量级,安装起来非常方便
- 支持多语言,ruby,Python,java,C#等,受用人群就更加广泛
- 支持多平台,Windows,Mac,Linux
- 支持多浏览器,Firefox,IE,Chrome,edge,Safari,Opera
- 支持分布式测试,自动化测试脚本太多时,可以把测试用例分布到不同的测试机器上执行,实现测试的快速实施
- 而且还是免费的
自动化测试selenium是一个工具集。 selenium 1.0 包括 selenium RC、selenium IDE、selenium GRID 存在环境沙箱问题 selenium 2.0 是selenium 1.0 + webdriver,解决了环境沙箱问题 selenium 3.0 增加了一些新特性,增加了edge、Safari的原生内核
webdriver工作原理:
webdriver 浏览器的驱动,控制浏览器
乘客向出租车司机说明去哪里,出租车司机相当于webdriver,驱动汽车去那,乘客相当于脚本。
selenium IDE 录制脚本,打开IDE,新建一个项目,然后REC录制脚本,输入URL,可以回放录制的脚本,也可以选择语言导出。
简单API的使用
如何写一个简单脚本?
#要想使用selenium 的webdriver 里的函数,首先把包导进来
from selenium import webdriver
#导入time
import time
#需要操控的浏览器,首字母必须大写
driver = webdriver.Chrome()
#打开网页-百度的的网址
driver.get("https://www.baidu.com")
time.sleep(8)
#关掉软件
driver.close()
#关掉软件,并清除浏览器的一些缓存
driver.quit()
不管是用哪种方法,定位时,元素必须是唯一的,才可以定位到。
定位元素的方式有哪些?
- id
- name
- class name
- link text 链接
- partial link text 部分链接内容
- tag name
- xpath
先定位到那个元素,右击检查,找到那个元素,右击copy xpath找到这个元素
- css selector
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
driver.find_element_by_css_selector("#kw").send_keys("叛逆者")
driver.find_element_by_css_selector("#su").click()
time.sleep(8)
driver.quit()
操作测试对象的方法?
- click 点击对象
- send_keys
send_keys("xx") 用于在一个输入框里输入xx 内容。
- clear 清除对象的内容
- submit 提交表单
- text 获取元素的文本信息
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
text = driver.find_element_by_id("bottom_layer").text
print(text)
time.sleep(3)
driver.quit()
添加等待
- 固定等待:只能选择一个固定的时间的等待
time.sleep(10)
//time.sleep(10) 必须等待10s
- 智能等待:可以在一个时间范围内智能的等待。
driver.implicitly_wait(10)
//implicitly_wait(10) 需要等待的匀速加载出来了,就立即停止等待,超过10s报异常
面试题:固定等待和只能等待的区别?
打印title
time.sleep(10)
title = driver.title
print(title)
打印url
url = driver.current_url
print(url)
浏览器的最大化
driver.maximize_window()
设置浏览器的宽和高
driver.set_window_size(600,1000)
浏览器的前进和后退 后退:
driver.back()
前进:
driver.forward()
拖动滚动条
time.sleep(3)
js1 = "var q=document.documentElement.scrollTop=10000"
driver.execute_script(js1)
time.sleep(3)
js2 = "var q=document.documentElement.scrollTop=0"
driver.execute_script(js2)
键盘事件
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
driver = webdriver.Chrome()
driver.get("http://127.0.0.1:88/zentao/user-login.html")
driver.find_element_by_id("account").send_keys("admin")
driver.find_element_by_id("account").send_keys(Keys.TAB)
driver.find_element_by_name("password").send_keys("chandao1023k")
time.sleep(3)
driver.find_element_by_name("password").send_keys(Keys.ENTER)
time.sleep(5)
driver.quit()
- 键盘组合键用法
password.send_keys(Keys.CONTROL,‘a’) password.send_keys(Keys.CONTROL,‘x’)
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
driver = webdriver.Chrome()
driver.get("http://127.0.0.1:88/zentao/user-login.html")
driver.find_element_by_id("account").send_keys("admin")
driver.find_element_by_id("account").send_keys(Keys.TAB)
password = driver.find_element_by_name("password")
password.send_keys("chandao1023")
time.sleep(3)
password.send_keys(Keys.CONTROL,'a')
time.sleep(3)
password.send_keys(Keys.CONTROL,'x')
time.sleep(6)
password.send_keys("chandao1023k")
time.sleep(3)
driver.find_element_by_name("password").send_keys(Keys.ENTER)
time.sleep(5)
driver.quit()
鼠标事件
需要导入ActionChains包
from selenium.webdriver.common.action_chains import ActionChains
context_click() 右击 double_click() 双击 drag_and_drop() 拖动 move_to_element() 移动
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import time
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
driver.find_element_by_id("kw").send_keys("少年的你")
su = driver.find_element_by_id("su")
ActionChains(driver).context_click(su).perform()
time.sleep(5)
driver.quit()
定位一组元素 比如,批量操作对象,比如将页面上所有的checkbox 都勾上
from selenium import webdriver
import time
import os
driver = webdriver.Chrome()
file = "file:///"+os.path.abspath("D:/SeleniumHtml/selenium/checkbox.html")
driver.get(file)
time.sleep(2)
inputs = driver.find_elements_by_tag_name('input')
for input in inputs:
if input.get_attribute('type') == 'checkbox':
input.click()
time.sleep(5)
driver.quit()
get_attribute:获得属性值。
多层框架/窗口定位 switch_to.frame() 跳转到默认页面:switch_to.default_content() switch_to.window()
层级定位 先点击显示出1个下拉菜单,然后再定位到该下拉菜单所在的ul,再定位这个ul 下的某个具体的link。
driver.find_element_by_link_text('Link1').click()
WebDriverWait(dr,10).until(lambda the_driver:
the_driver.find_element_by_id('dropdown1').is_displayed())
menu = driver.find_element_by_id('dropdown1').find_element_by_link_text('Action')
webdriver.ActionChains(driver).move_to_element(menu).perform()
下拉框处理
options = driver.find_element_by_tag_name("option")
for option in options
if option.get_arrtribute('value') == '9.03':
option.click()
options[3].click()
alert错误弹出框的处理 关闭错误弹出框: alert = driver.switch_to.alert() text = alert.text print(text) ‘#关闭弹窗 alert.accept()
DIV对话框处理
driver.find_element_by_id('show_modal').click()
time.sleep(3)
driver.find_element_by_id('click').click()
link)
time.sleep(4)
div = driver.find_element_by_class_name('modal-footer')
buttons = div.find_elements_by_tag_name('button')
buttons[0].click()
上传文件操作 ’#定位上传按钮,添加本地文件 driver.find_element_by_tag_name(“input”).send_keys(“存放的位置”)
|