基于Selenium的自动化测试之元素定位和等待

不少伙伴接触软件测试都会或多或少接触到自动化测试,自动化测试是工作中常用的测试方法,它可以减少测试人员的重复工作,本篇博客就从环境搭建开始讲起,并对元素定位做一个简单的总结,欢迎各位大佬参与讨论,不足之处,也希望各位大佬提出!
一、环境搭建
准备以下工具:

  • 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查询火车票实例应用

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值