以上学习的是element的基本属性和方法,那么验证点添加的技巧和方式是什么呢?我们知道自动化的过程就是人的手工测试的过程,在手工测试中需要人来判断业务是否达到需求要求,那么在自动化脚本中就要加入程序代码的判断来代替人工。这种在自动化脚本中添加的验证代码,叫做验证点。在测试脚本中加入一个好的验证点是发现程序Bug的关键。但是并不是说验证设置的越多越好,因为验证点是通过脚本的实现,脚本本身程序越长调用变量越多,都会占有更多的内存空间,并且验证点越多,程序运行时间越长,对机器资源也是一种巨大的消耗。自动化脚本验证点越多运行出错的概率越高,一旦出错,测试开发人员排查测试脚本代码的难度也会变大,要分析脚本失败,是测试脚本本身的问题还是被测试系统软件的问题。所以设置检查点可以参考如下方法:

1. 验证点设置常规方法

A. 根据测试用例设置重点检查点

每个测试用例设计时都有测试的重点,例如一个在线电影购票系统,测试购票功能,业务场景是登陆系统,选择影院座位然后购票。这个测试的重点是购票,登陆功能的验证点就可以忽略。

B. 设置验证点要全面

在设计测试用例时,要全面了解测试操作的影响。对涉及到业务功能完成后的影响界面显示,后台数据等等,都设置验证点,防止出现测试遗漏的地方。

C. 验证点设置尽量灵活

设置验证点通常会比对实际的运行结果和预期结果。如美颜软件的测试,每次自拍人物可能是随机的,这时候预期的结果是达到某一要求条件的,没有固定预期结果。还有搜索引擎的测试,因为数据量的变化,每次搜索的关键字会发现搜索的结果展示是不一样的,这时候要验证的是数据的展示是否符合规范要求而不是一定要怎么样。 只有真正的了解验证点所使用的场景,才能开发出更加健壮的测试脚本。

2. 验证点设置中常见的错误

在测试过程中,测试人员设计了测试用例,设置了验证点,可是在测试用例投入使用的过程中,我们不得不反复修改测试用例。因为测试用例总是通不过,维护成本很高。虽然这一部分是因为被测对象变化造成的,还有一部分原因是验证点设置的不对。所以常见的验证点设置中的错误如下:

A. 检测动态变化的元素

前面说过软件的一些功能会因为使用时间的不同,数据积累的不同都导致展示结果的不同,如果验证点是死的,那么就会导致自动化测试脚本执行无法成功,所以规则本身也是一种验证点。

B. 验证点设置过繁

验证点是检测Bug的关键,但是如果在每一步操作后添加验证点,这样做也是多余的,虽然增加验证点,但是过多的验证点会影响测试脚本的运行。而且测试脚本出错,去定位错误的时候,是非常困难,可能会一个测试脚本出错会引发相关的测试脚本都无法执行。

C. 忘记设置验证点或是验证点不是测试重点

新手开发自动化测试用例时,往往过分关注自动化脚本的开发但忘记开发对应的验证点代码或是验证点代码添加的不正确。如电商系统,在购物成功后,一要看购物篮是否还有购买的物品另外要看物流系统的信息显示,但是自动化开发人员却是去检验页面图片显示,这样会不管脚本执行成功,自动化测试脚本都不会报错,但是自动化测试执行就失去了意义。

D. 验证需要刷新才有反映的元素

在测试的时候,一些元素在操作完成后需要重新加载到页面上,就需要主动刷新一下页面才能显示。手工测试,人为的会主动去触发刷新操作,在自动化脚本很容易遗忘这样的开发细节,如果不刷新,就不符合预期结果。所以要养成观察测试执行的细节,把代码添加进去,让自动化脚本更加强壮。

这几种是常见的错误,在自动化验证点开发的过程中还会遇到很多技术问题,要多尝试,不懂要学会利用搜索引擎找到解决问题的办法,这也是学习自动化测试必备的技能。

验证文本

测试Web应用程序时,需要验证元素在页面上显示的值或文本是否正确。测试脚本需要在运行时从一个元素中检索文本或值,测试脚本在运行的其他地方使用它。WebDriver的element接口提供了多种方式的获取和验证文本,如element类text方法可以实现获取和验证文本。

实例:验证发帖是否正确

import time
from selenium import webdriver #加载selenium库
from selenium.webdriver.common.keys import Keys #加载selenium键盘定义库
def get_webdriver(url):
# get_webdriver代码实现在本书第一个webdriver脚本中
def login_discuz(driver,str_user,str_pwd):
#登录代码的实现在本书第一个webdriver脚本def post_reply(driver,post_forum,post_subject,post_message):
link_forum = driver.find_element_by_link_text(post_forum) #'Discuz!-BUG反馈'
link_forum.click()
time.sleep(2)
btn_post_reply = driver.find_element_by_xpath('.//*[@id=\'newspecial\']/img')
btn_post_reply.click()
txt_subject = driver.find_element_by_xpath('.//*[@id=\'subject\']')
txt_subject.send_keys(post_subject)
driver.switch_to.frame('e_iframe')
txt_message=driver.find_element_by_xpath('html/body')
txt_message.send_keys(post_message)
driver.switch_to.default_content()
btn_post_message_submit = driver.find_element_by_xpath('.//*[@id=\'postsubmit\']')
btn_post_message_submit.click()

技术解释:post_reply是实现用户在discuz板块发帖,传入四个参数driver,post_forum,post_subject,post_message分别代表webdriver实例,发帖的板块,发帖的标题和发帖的内容。在发帖的页面里,发帖的内容需要输入富文本框中,用xpath等定位方式是无法定位到内容输入框元素,因为它是被包含在一个iframe中,需要脚本切换到该frame中去,用firebug定位到该富文本框的HTML代码是,提取id属性值传给driver.switch_to.frame(‘e_iframe’),达到切换到iframe中去,然后执行代码driver.find_element_by_xpath(‘html/body’)定位到文本框元素,输入发贴内容,前文有介绍切换后要切换回主框架中,所以要执行代码driver.switch_to.default_content()。最后定位发帖按钮元素,提交帖子。

def validate_post_reply(driver,post_forum,post_subject):
link_forum = driver.find_element_by_link_text(post_forum)
link_forum.click()
time.sleep(2)
flag=True
i = 1
try:
while driver.find_element_by_xpath('.//*[@id=\'normalthread_' + str(i) + '\']/tr/th/a[2]'):
i = i + 1
flag=False
if driver.find_element_by_xpath('.//*[@id=\'normalthread_' + str(i) + '\']/tr/th/a[2]').text == post_subject:
print('找到')
flag=True
break
except:
flag=False
return flagif __name__ == '__main__':
#用变量存储用户名,密码
str_user="admin"
str_pwd="admin"
str_post_forum='Discuz!-BUG反馈'
str_subject='发帖不成功'
str_post_message='发帖后出现错误'
discuz_url=r'http://192.168.0.110/discuz/forum.php'
wb=get_webdriver(discuz_url)
login_discuz(wb,str_user,str_pwd)
time.sleep(2)
post_reply(wb,str_post_forum,str_subject,str_post_message)
wb.quit()
time.sleep(2)
wb = get_webdriver(discuz_url)
result=validate_post_reply(wb,str_post_forum,str_subject)
if result:t
print('ok')
else:
print('sorry')

技术解释:validate_post_reply是验证帖子是否发送成功,验证功能不需要登陆discuz,直接打开首页就可以验证。代码核心是用webdriver的find_element_by_xpath方法定位到发帖的板块中的帖子元素。分析帖子的xpath规律发现就是中间的序号会变化,所以利用一个构造的字符串’.//*[@id=‘normalthread_’ + str(i) + ‘’]/tr/th/a[2]'来代表帖子的xpath,while循环迭代不断检索帖子获得帖子的标题,用driver.find_element_by_xpath().text与预期结果进行比对,如果帖子标题和预期结果一致就返回true,否则是false。

验证元素属性值

进行web测试时,要对页面元素的状态进行验证,如登陆功能,需求上要求每次登陆时,登陆输入框中保存上次登陆用户名的信息。

实例:登陆discuz论坛,验证搜索男女朋友信息页面的输入框初始不为空。打开页面操作,登陆—>我的->好友->查找好友

import time
from selenium import webdriver #加载selenium库
from selenium.webdriver.common.keys import Keys #加载selenium键盘定义库
def get_webdriver(url):
# get_webdriver代码实现在本书第一个webdriver脚本中
def login_discuz(driver,str_user,str_pwd):
#登录代码的实现在本书第一个webdriver脚本
#打开搜索好友页面
def open_search_friend_page(driver):
myitem=driver.find_element_by_id('myitem')
myitem.click()
my_friend=driver.find_element_by_xpath('.//*[@id=\'myitem_menu\']/li[3]/a')
my_friend.click()
search_friend=driver.find_element_by_xpath('.//*[@id=\'ct\']/div[2]/div/ul/li[2]/a')
search_friend.click()#验证搜索男女朋友信息的用户输入框和用户id输入框不为空
def verify_search_friend_element(driver):
txt_username=wb.find_element_by_name('username')
value=txt_username.get_attribute('value')
if value=='':
print('用户名输入框值为空正确')
else:
print('用户名输入框值不为空错误')txt_userid = wb.find_element_by_name('uid')
value = txt_userid.get_attribute('value')
if value == '':
print('用户ID输入框值为空正确')
else:
print('用户ID输入框值不为空错误')if __name__ == '__main__':
#用变量存储用户名,密码
str_user="admin"
str_pwd="admin"
discuz_url=r'http://192.168.0.110/discuz/forum.php'
wb=get_webdriver(discuz_url)
login_discuz(wb,str_user,str_pwd)
time.sleep(2)
open_search_friend_page(wb)
verify_search_friend_element(wb)

技术解释:webdriver的find_elements_by_xxx方法只能获取到标签级,而get_attribute可以获取到标签属性级。

验证CSS值

在Web测试的过程有时需要对页面布局进行测试,验证其是否符合规范。如针对图片元素验证是否按照系统规格要求图片展示大小放置。以discuz登录成功,验证头像图像为例,实现脚本验证图片头像显示要求为高宽各为48像素。在HTML源码中没有直接给img标签设置宽高属性,而是在CSS中设置,所以这里要验证img的在CSS中的属性值。

实例:登陆discuz论坛后获得头像图片的尺寸和预期结果对比验证是否符合要求。

import time
from selenium import webdriver #加载selenium库
from selenium.webdriver.common.keys import Keys #加载selenium键盘定义库
def get_webdriver(url):
# get_webdriver代码实现在本书第一个webdriver脚本中
def login_discuz(driver,str_user,str_pwd):
#登录代码的实现在本书第一个webdriver脚本if __name__ == '__main__':
#用变量存储用户名,密码
str_user="admin"
str_pwd="admin"
discuz_url=r'http://192.168.0.110/discuz/forum.php'
wb=get_webdriver(discuz_url)
login_discuz(wb,str_user,str_pwd)
time.sleep(2)img_obj=wb.find_element('css selector','.avt img')
width = img_obj.value_of_css_property("width")
height= img_obj.value_of_css_property("height")
print('宽:'+str(width)+';'+'高:'+str(height))
if width=='48px' and height=='48px': #验证宽高是否正确
print('正确')
else:
print('错误')

技术解释: 上述实现主要是调用element对象的value_of_css_property方法,传入参数为CSS定义属性。在Webdriver测试脚本执行过程中动态获得头像图片的宽高。

最后感谢每一个认真阅读我文章的人,下面这个网盘链接也是我费了几个月时间整理的非常全面的,希望也能帮助到有需要的你!

这些资料,对于想转行做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。希望对大家有所帮助……

如果你不想一个人野蛮生长,找不到系统的资料,问题得不到帮助,坚持几天便放弃的感受的话,可以点击下方小卡片加入我们群,大家可以一起讨论交流,里面会有各种软件测试资料和技术交流,同时我也把上面花几个月整理的资料放里边了,赶快加入吧。

敲字不易,如果此文章对你有帮助的话,点个赞收个藏来个关注,给作者一个鼓励。也方便你下次能够快速查找。

自学推荐B站视频:

零基础转行软件测试:38天自学完软件测试,拿到了字节的测试岗offer,堪称B站最好的视频!

自动化测试进阶:已上岸华为,涨薪20K,2022最适合自学的python自动化测试教程,自己花16800买的,无偿分享

测开系列Selenium Webdriver Python(21)--元素定位2相关推荐

  1. python webdriver点击指令_测开系列Selenium Webdriver Python(20)--Webdriver运行原理

    Webdriver运行原理 转帖请注明出处!谢谢 在开发Webdriver的自动化脚本过程中,Webdriver后台在创建WebDriver实例的过程中,先确认浏览器的原生组件中是否存在可匹配的版本. ...

  2. selenium webdriver 学习总结-元素定位

    webdriver提供了丰富的API,有多种定位策略:id,name,css选择器,xpath等,其中css选择器定位元素效率相比xpath要高些,使用id,name属性定位元素是最可靠,效率最高的一 ...

  3. Selenium WebDriver + python 自动化测试框架

    目标 组内任何人都可以进行自动化测试用例的编写 完全分离测试用例和自动化测试代码,就像写手工测试用例一下,编写excel格式的测试用例,包括步骤.检查点,然后执行自动化工程,即可执行功能自动化测试用例 ...

  4. selenium学习笔记之元素定位

    selenium学习笔记之元素定位 Selenium是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样. 首先需要创建浏览器驱动: from sele ...

  5. 关于selenium的8种元素定位

    selenium中有八种元素定位,分别是:id,name,class_name,tag_name,link_text.partial_link_text.xpath.css 简单的定位可以用id.na ...

  6. Selenium webdriver中的xpath定位

    使用selenium进行自动化测试,其实很多时候就是模拟用户的操作,在前端页面对元素进行操作,因此元素的定位在自动化测试中是至关重要的.关于如何 使用id,className,name,linkTex ...

  7. Python Appium 元素定位方法简单介绍

    Python  Appium  元素定位 常用的八种定位方法(与selenium通用) id定位 name定位 Xpath定位 如下图,使用 uiautomatorviewer.bat 获取页面元素 ...

  8. selenium webdriver python 元素操作

    常用操作 click 点击某个元素 driver.find_element_by_id("su").click() clear driver.find_element_by_id( ...

  9. selenium webdriver (python)的基本用法一

    阅在线 AIP 文档: http://selenium.googlecode.com/git/docs/api/py/index.html 目录 一.selenium+python 环境搭建..... ...

最新文章

  1. linux下查看、删除指定文件名长度的文件
  2. MySQL 如何查找删除重复行?
  3. Spring源码分析——Bean的生命周期
  4. 【转】Oracle执行计划解释
  5. UVALive - 3126 Taxi Cab Scheme(最小路径覆盖-二分图最大匹配)
  6. TEdit扩展:做成多按钮的Edit,可用作浏览器地址栏
  7. python中输入17=x会引起错误_python新手常犯的17个错误
  8. JS高级程序设计笔记——事件(一)
  9. 在.Net中进行SQL Server数据库备份与还原操作实用类
  10. 深度学习的1000+篇文章总结
  11. 苹果7系统更新12无服务器,别再为苹果手机无法更新系统犯难,这几种方式帮你解决!...
  12. 人性的弱点 - 把握人际交往的关键
  13. 深度学习岗位面试记录
  14. 自动驾驶与汽车现状前沿
  15. 谈医药行业网站的运营模式分析
  16. 微信支付 unmatched order appid and payment appid
  17. 抑郁症自测量表测试软件,科学网-抑郁症自测量表(SDS)-李侠的博文
  18. FPGA零基础学习:FPGA芯片简介
  19. Arduino - 输出引脚扩流
  20. 关于matlab提示“警告: 矩阵为奇异工作精度” 的问题

热门文章

  1. android获取控件宽和高
  2. html5 获取页面的宽和高
  3. 核心网upf作用_5G核心网UPF硬件加速技术
  4. 进入BIOS+制作u盘启动盘+将u盘启动盘设置为开机首选方法
  5. 从零开始使用 IDEA 开发插件 (一)
  6. mysql去重合并字符串_Mysql将近两个月的记录合并为一行显示
  7. 天涯明月刀手游显示服务器已满,《天涯明月刀手游》服务器爆满进不去游戏怎么办,排队时间太长怎么办?...
  8. STM32的IIC(模拟)读写AT24c02
  9. 手机哔哩哔哩如何转换html5,手机b站(哔哩哔哩)账号up主头像图片如何设置?怎么保存到相册里面...
  10. Android自定义底部弹出窗-dialog(2种实现分析+源码)