Selenium概述
Selenium自动化测试框架
什么是框架
框架(framework)是一个框子——指其约束性,也是一个架子——指其支撑性
框架是整个或部分系统的可重用设计
为什么使用框架
1)自己从头实现太复杂
2)使用框架能够更专注于业务逻辑,加快开发速度
3)框架的使用能够处理更多细节问题
4)使用人数多,稳定性,扩展性好
Selenium工作原理
Selenium IDE
Selenium的IDE(集成开发环境)是一个易于使用的Firefox插件,用于开发Selenium测试案例。它提供了一个图形用户界面,用于记录使用Firefox浏览器,用来学习和使用Selenium用户操作,但它只能用于只用Firefox浏览器不支持其它浏览器
2.IDE功能简介
1.文件:创建、打开和保存测试案例和测试案例集。编辑:复制、粘贴、删除、撤销和选择测试案例中的所有命令。Options : 用于设置seleniunm IDE。
2.用来填写被测网站的地址。
3.速度控制:控制案例的运行速度。
4.运行所有:运行一个测试案例集中的所有案例。
5.运行:运行当前选定的测试案例。
6.暂停/恢复:暂停和恢复测试案例执行。
7.单步:可以运行一个案例中的一行命令。
8.录制:点击之后,开始记录你对浏览器的操作。
9.案例集列表。
10.测试脚本;table标签:用表格形式展现命令及参数。source标签:用原始方式展现,默认是HTML语言格式,也可以用其他语言展示。
11.查看脚本运行通过/失败的个数。
12.当选中前命令对应参数。
13.日志/参考/UI元素/Rollup
Selenium API基础
1.浏览器驱动对象
1)库的导入 from selenium import webdriver
2)创建浏览器对象 driver = webdriver.xxx() 使用dir(driver)查看方法 3)浏览器尺寸相关操作 maximize_window() 最大化 get_window_size() 获取浏览器尺寸 set_window_size() 设置浏览器尺寸
get_window_position() 获取浏览器位置 set_window_position(x,y) 设置浏览器位置
4)浏览器的关闭操作
close() 关闭当前标签/窗口 quit() 关闭所有标签/窗口
5)页面请求操作
driver.get(url) 请求某个url对应的响应
refresh() 刷新页面操作
back() 回退到之前的页面
forward() 前进到之后的页面
2.获取断言信息
1)获取断言信息的操作
current_url 获取当前访问页面url
title 获取当前浏览器标题
get_screenshot_as_png() 保存图片
get_screenshot_as_file(file) 直接保存
page_source 网页源
3.元素的定位
1)元素定位方法的分类(调用方式):
1.直接调用型(推荐方式) driver.find_element_by_xxx(value)
2.使用By类型(需要导入By)
from selenium.webdriver.common.by import By driver.find_element(By.xxx,value)
2)元素定位方法的分类(按定位方式):
3)八种定位方式的示例:
1. driver.find_element_by_xpath(value)
2. driver.find_element_by_css_selector(value)
3. driver.find_element_by_id(value)
4. driver.find_element_by_name(value)
5. driver.find_element_by_class_name(value)
6. driver.find_element_by_tag_name(value)
7. driver.find_element_by_link_text(value)
8. driver.find_element_by_partial_link_text(value)
4.元素的操作
对元素的相关操作,一般要先获取到元素,再调用相关方法 element = driver.find_element_by_xxx(value)
点击操作 element.click()
清空/输入操作(只能操作可以输入文本的元素)
element.clear() 清空输入框 element.send_keys(data) 输入数据
Selenium API高级
多标签之间的切换
场景:有的时候点击一个链接,新页面并非由当前页面跳转过去,而是新开一个页面打开,这种情况下,计算机需要识别多标签或窗口的情况
1)获取所有窗口的句柄 handles = driver. window_handles
2)通过窗口的句柄进入的窗口 driver.switch_to.window(handles[n])
from selenium import webdriver
import time
driver = webdriver.Chrome("D:\python\proj_selenium\Chromedriver\chromedriver.exe")
driver.get("https://bj.58.com/")
driver.maximize_window()
# 获取句柄
h1 = driver.window_handles
print(h1)
#点击租房
driver.find_element_by_xpath("//*[@id='fcNav']/em/a[1]").click()
# 获取句柄
h2 = driver.window_handles
print(h2)
#窗口的跳转
driver.switch_to.window(driver.window_handles[1])
# 点击顺义
driver.find_element_by_xpath('/html/body/div[5]/div[2]/div[2]/dl[1]/dd/a[9]').click()
# 点击新房
driver.find_element_by_link_text('新房').click()
driver.switch_to.window(driver.window_handles_handles[2]) #窗口的跳转
driver.find_element_by_link_text("1万以下").click()
多表单切换
1)什么是多表单?
实际上就是使用iframe/frame,引用了其他页面的链接,真正的页面数据并没有出现在当前源码中,但是在浏览器中我们看到,简单理解可以使页面中开了一个窗口显示另一个页面
2)处理方法
直接使用id值切换进表单 driver.switch_to.frame(value)/driver.switch_to_frame(value)
定位到表单元素,再切换进入 el = driver.find_element_by_xxx(value) driver.switch_to.frame(el) /driver.switch_to_frame(el)
from selenium import webdriver
import time
driver = webdriver.Chrome("D:\python\proj_selenium\Chromedriver\chromedriver.exe")
driver.get("https://qzone.qq.com/")
driver.maximize_window()
#定位表单
bd = driver.find_element_by_id("login_frame")
driver.switch_to.frame(bd) #表单跳转
time.sleep(2)
driver.find_element_by_id('switcher_plogin').click() #点击密码登录
time.sleep(2)
driver.find_element_by_id("u").send_keys("111111111") #输入账号
time.sleep(2)
driver.find_element_by_id("p").send_keys("11111111") #输入密码
time.sleep(2)
driver.find_element_by_id("login_button").click() #点击登录
弹出框操作
1) 进入到弹出框中 driver.switch_to.alert
2) 接收警告 accept()
3) 解散警告 dismiss()
4) 发送文本到警告框 send_keys(data)
from selenium import webdriver
import time
driver = webdriver.Chrome("D:\python\proj_selenium\Chromedriver\chromedriver.exe")
driver.get("https://www.baidu.com/")
driver.maximize_window()
#定位设置按钮
sz = driver.find_element_by_id('s-usersetting-top')
sz.click()
#定位搜索设置
sssz = driver.find_element_by_xpath('//*[@id="s-user-setting-menu"]/div/a[1]/span')
sssz.click()
time.sleep(2)
#定位20
driver.find_element_by_css_selector('#se-setting-3 > span:nth-child(2) > label').click()
#定位保存设置
bcsz = driver.find_element_by_xpath('//*[text()="保存设置"]')
bcsz.click()
driver.switch_to.alert.accept()
time.sleep(2)
滚动条操作
js = ‘window.scrollTo(0,b)‘ #b表示距离定位的距离
driver.execute_script(js) #执行js脚本
滚动条回到顶部
js = "window.scrollTo(0,0)"或者
js=“var q=document.documentElement.scrollTop=0“
滚动条回到底部
js = “window.scrollTo(0,document.body.scrollHeight)”或者
js="var q=document.documentElement.scrollTop=10000“
滚动条拉到指定位置(具体元素):--最常用 target = driver.find_element_by_id(“id_keypair”) #定位移动到的元素 driver.execute_script("arguments[0].scrollIntoView();", target)
from selenium import webdriver
import time
driver = webdriver.Chrome("D:\python\proj_selenium\Chromedriver\chromedriver.exe")
driver.maximize_window()
driver.get("https://bj.58.com/")
# 底部
# js = "window.scrollTo(0,document.body.scrollHeight)"
# driver.execute_script(js)
# time.sleep(2)
# js="var q=document.documentElement.scrollTop=0"
#顶部
# js = "window.scrollTo(0,0)"
# driver.execute_script(js)
# time.sleep(2)
hsq = driver.find_element_by_xpath('/html/body/div[3]/div[1]/div[1]/div/div[3]/div[1]/div[4]/em[1]/a')
driver.execute_script("arguments[0].scrollIntoView()",hsq)
hsq.click()
time.sleep(2)
driver.quit()
鼠标和键盘操作
手动测试时键盘的操作在selenium页有实现,关于鼠标的操作由ActionChains()类来提供,关于键盘的操作由Key()类来提供
鼠标操作
导入动作链类,动作链可以储存鼠标的动作
from selenium.webdriver import ActionChains获取元素 el = el = driver.find_element_by_xxx(value)
ActionChains(driver).context_click(el).perform() 点击鼠标右键
ActionChains(driver). click(el).perform() 点击鼠标左键 ActionChains(driver).move_to_element(el).perform() 鼠标悬停
键盘操作
键盘操作使用的是Keys类,一般配合send_keys使用
* 导入 from selenium.webdriver.common.keys import Keys
键盘操作 * 常用键盘操作
send_keys(Keys.BACK_SPACE) 删除键(BackSpace) send_keys(Keys.SPACE) 空格键(Space)
send_keys(Keys.TAB) 制表键(Tab)
send_keys(Keys.ESCAPE) 回退键(Esc)
send_keys(Keys.ENTER) 回车键(Enter)
send_keys(Keys.CONTROL,‘a’) 全选(Ctrl+A) send_keys(Keys.CONTROL,‘x’) 剪切(Ctrl+X) send_keys(Keys.CONTROL,‘v’) 粘贴(Ctrl+V)
send_keys(Keys.F1) 键盘 F1
send_keys(Keys.F12) 键盘 F12
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.keys import Keys
import time
driver = webdriver.Chrome("D:\python\proj_selenium\Chromedriver\chromedriver.exe")
driver.get("https://www.baidu.com/")
driver.maximize_window()
# # 定位--更多
# more = driver.find_element_by_link_text("更多")
# ActionChains(driver).click(more).perform() #左点击
# ActionChains(driver).move_to_element(more).perform() #悬浮操作
# ActionChains(driver).context_click(more).perform() #右点击
srk = driver.find_element_by_id("kw")
srk.send_keys(12306)
time.sleep(2)
srk.send_keys(Keys.CONTROL,"a")
srk.send_keys(Keys.CONTROL,"x")
time.sleep(2)
srk.send_keys(Keys.CONTROL,'v')
浏览器等待
1) 为什么要进行等待?
1.网速慢
2.网站内容过多
3.如果不进行等待而直接定位元素,可能会抛出异常
2) selenium中等待的分类:
强制等待 显示等待 隐式等待
导入定时等待库
from time import sleep 或者 import time
强制等待
time.sleep(10)
# 表示强行等待10s在执行下一句代码 这种等待方式时间到了就会执行下个语句,但比较死板,不能保证在等待的时间内元素真正被加载了出来。而且如果等待的元素已经被加载出来,还需要等待到时间才会执行下一句,浪费时间。
隐式等待
隐式等待的作用域是全局,所以一般设置在整局代码的头几行。
隐式等待采用全部设置,也就是说,你所有的findElement方法都会最多等待30s
driver.implicitly_wait(30) #等待30s
这个等待表示在规定的时间内页面的所有元素都加载完了就执行下一步,否则一直等到时间截止,然后再继续下一步。 这个方法的缺点是你需要的元素已经加载出来了,但页面还没有加载完,再需要继续等待页面加载完才能执行下一步操作。
显式等待
需要导入的包
from selenium.webdriver.support.wait import WebDriverWait #导入显性等待的包 from selenium.webdriver.support import expected_conditions as EC #判断所需要的元素是否已经被加载出来
from selenium.webdriver.common.by import By #定位
WebDriverWait类是由WebDirver 提供的等待方法。显示等待明确的要等到某个元素的出现,在设置时间内每隔x秒去判断一下指定的元素是否加载完,加载完了就执行下一步,否则继续每隔x秒去判断,指定时间截止。如果超时就会抛出异常。
总结:
强制等待:傻瓜式等待,不智能
隐式等待:全局通用,只需设置一次,很智能(等到了就走,不会浪费时间)
显式等待:等待元素处于特定条件的时候使用,很智能(等到了就走,不会浪费时间)