不少伙伴接触软件测试都会或多或少接触到自动化测试,自动化测试是工作中常用的测试方法,它可以减少测试人员的重复工作,本篇博客就从环境搭建开始讲起,并对元素定位做一个简单的总结,欢迎各位大佬参与讨论,不足之处,也希望各位大佬提出!
一、环境搭建
准备以下工具:
- python环境
- IDE
- 浏览器及对应浏览器驱动
- selenium框架
前面两点没太多讲的,有疑问的伙伴可以查看我得第一篇博客,第三点,下载浏览器和对应浏览器驱动,selenium支持主流的火狐、谷歌浏览器,也支持windows的钉子户IE浏览器,按照自己意愿下载即可,然后selenium需要驱动浏览器得安装对应浏览器驱动,安装也非常简单,下载,然后解压压缩包将exe可执行文件放入python安装的目录下就可以了,注意下载的驱动程序要和浏览器内核版本对应。
火狐浏览器驱动下载链接
谷歌浏览器驱动下载链接
IE浏览器驱动下载链接
驱动程序放置位置可参照下图,我是有时候都在用,所以三个我都有。
以上都完成后,还差一个selenium框架,selenium框架可在命令提示符用pip命令安装,安装好后会提示版本信息,关于安装这块还是有必要提醒一下,很多人安装了无法使用,90%都是python路径问题,第一篇文章也有提及,可参考。
文章链接:
Python应用之发送邮件
至此,所有工具都准备完毕,可以开始使用selenium框架驱动浏览器应用执行一些web自动化测试,简单写两条python程序打开谷歌浏览器并打开链接吧!
二、元素定位
先看一段代码
from selenium import webdriver # 从selenium导入webdriver
driver=webdriver.Chrome() # 打开谷歌浏览器(火狐:Firefox(),IE:Ie())
driver.maximize_window() # 窗口最大化
driver.get('http://www.baidu.com/') # 打开百度一下
这三行代码实现的功能很简单,就是打开谷歌浏览器进入百度一下,实现效果如下:
接下来可以在网页做一些操作了,常用到的一些方法/属性如下:
- 获取网页title:driver.title
- 获取网页url:drive.current_url
- 获取网页当前句柄:driver.current_window_handle
- 获取网页所有句柄:driver.window_handles,返回结果存在一个列表中
- 网页前进:driver.forward()
- 网页后退:driver.back()
- 窗口最大化:driver.maximize_window()
- 窗口最小化:driver.minimize_window()
- 窗口切换:driver.switch_to.window(句柄)
- iframe切换:driver.switch_to.frame()——进入iframe
driver.switch_to.default_content()——跳出iframe - 定位弹框:driver.switch_to.alert
- 弹框确认:driver.switch_to.alert.accept()
- 弹框取消:driver.switch_to.alert.dismiss()
- 在弹框内输入文本值:driver.switch_to.alert.send_keys()
- 获取弹框文本:driver.switch_to.alert.text
- 关闭当前窗口:driver.close()
- 关闭浏览器:driver.quit()
常用到的比如点击、输入、滑动等,就涉及到元素定位,元素定位方式有八大种:
- 以元素的id定位,用法:driver.find_element_by_id();
- 以元素的name属性定位,用法:driver.find_element_by_name();
- 以元素的class属性定位,用法:driver.find_element_by_class_name();
- 以元素的标签定位,用法:driver.find_elements_by_tag_name();
- 根据超链接的文本定位,只支持a标签,用法:driver.find_element_by_link_text();
- 根据超链接的文本定位(支持部分文本),只支持a标签,
用法:driver.find_element_by_partial_link_text(); - css选择器定位,即样式定位,用法:driver.find_element_by_css_selector();
- 元素路径定位,用法:driver.find_element_by_xpath();
以上八种定位方式,根据需求选择一种唯一属性定位,如果不是唯一属性,可使用元素组定位,定位到的多个元素会存在一个列表中返回,再利用列表取值即可。
其他定位方式:
-
By方式定位:driver.find_element(By.属性,值),需要导包,可以用快捷方式alt+enter导入selenium下的对应包。
-
下拉列表的定位:下拉列表是常见元素中比较特殊的一种,比如12306购票网站上查询某时间段火车票情况,这里的时间段就是一个下拉列表。
对于下拉列表的定位,常见方式有三种: -
元素路径或css选择器定位;
-
select+option定位:先定位到select标签,再实例化Select对象并调用类中方法,文章末的应用实例中会有实例应用;
from selenium.webdriver.support.select import Select #导入包
Select(ele).select_by_value(option) #ele为标签select元素
- ul+li定位,先定位到ul标签,再定位li标签(有点脱裤子放屁的感觉,所以这种方式用得很少)。
元素常用属性:
- 元素点击:ele.click();
- 输入文本:ele.send_keys(),文件上传也可以用这种方式,将文件位置作为参数传入即可,只能使用绝对路径哦;
- 清空输入框内容:ele.clear(),主要用于某些输入框有默认数据需要重新输入的情况;
- 获取元素尺寸大小:ele.size;
- 获取元素所在坐标:ele.location,返回一个keys为x和y的字典;
- 获取元素文本值:ele.text,只适用a、label、p、div标签;
- 获取元素属性值:ele.get_attribute(属性名)。
三、等待时间
有些时候脚本很快就运行结束,无法看到运行过程的一些细节,或者网页加载比较慢,老是出现定位元素报错的问题,就需要我们加上等待时间来解决。等待时间为三种:
- 强制等待
import time #导入包
time.sleep(seconds)
一般为调试时使用,在需要等待的程序前都加上一定等待时间,程序会等到这个时间结束之后再继续往后运行,缺点比较明显,一方面是每个等待的节点都需要加上一行代码,另一方面是浪费的时间较多,很死板,但也是最简单的一种等待方式。
- 隐式等待
driver.implicitly_wait(seconds)
隐式等待相对于强制等待优势在于,它声明一次就作用于整个driver周期,故只需在程序开头声明即可,它会在指定的时间内不断地去尝试定位,在这个时间内定位到了元素就继续执行,时间到了还是无法定位则异常报错。缺点是对于时间的浪费较多。
- 显示等待
from selenium.webdriver.support.wait import WebDriverWait
WebDriverWait(driver,seconds).until(method) #显示等待
使用显示等待需导入对应包,它的运行逻辑是,设定一定等待时间,在等待时间内如果method为真即停止等待执行下一步操作,如果method为假就继续等待,直到等待时间结束异常报错(timeout),应用中常常把定位元素的方法作为method。显示等待是最节约时间,也是最复杂的一种等待方式,一般只会在企业或是特殊场景下应用。
四、鼠标键盘操作
- 鼠标操作
鼠标操作常用到的有下面这些,需要导入包才可以使用:
from selenium.webdriver import ActionChains #导入包
ActionChains(driver).click(ele) #单击
ActionChains(driver).click_and_hold(ele) #按住不放
ActionChains(driver).release() #释放鼠标
ActionChains(driver).double_click(ele) #双击
ActionChains(driver).context_click(ele) #右击
ActionChains(driver).move_by_offset(x,y) #以坐标移动鼠标
ActionChains(driver).drag_and_drop(source,target) #拖拽至指定位置
ActionChains(driver).drag_and_drop_by_offset(source,x,y) #拖拽至指定坐标
ActionChains(driver).move_to_element(ele) #鼠标悬停
ActionChains(driver).perform() #执行
需要注意的是,鼠标操作需要执行一个perform()才会生效,在一系列操作后,务必记得写一个perform()。
- 键盘操作
键盘的操作也需要导入包,使用很简单,用元素的send_keys()方法将键盘操作作为参数传过去即可。
from selenium.webdriver.common.keys import Keys #导入包
ele.send_keys(Keys.CONTROL,'a') #在元素内执行ctrl+a全选操作
五、应用实例
分享了一大堆,很干,最后附上一个实例源码,实例很简单,就是在12306查询火车票,然后将查到的所有车次、出发站、到达站、出发时间、到达时间、历时在控制台输出或将车次信息生成一个excel文件。欢迎下载参考或参与讨论,以后都会不定时的总结分享软件测试技术知识,欢迎关注哦!
下载链接:
基于selnium的12306查询火车票实例应用