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

以上学习的是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 flag

if __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买的,无偿分享

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码小怡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值