基于Selenium的测试程序优化

简介: 顾翔老师开发的bugreport2script开源了,希望大家多提建议。文件在https://github.com/xianggu625/bug2testscript,主文件是:zentao.py 。bugreport是禅道,script是python3+selenium 3,按照规则在禅道上书写的bugreport可由zentao.py程序生成py测试脚本。

Selenium代码的优化


1.异常优化

考虑以下情形。


def testLogin(){
  #从Excel文件中读入测试数据,比如:Jerry/123456
  #继续后续测试
}
def teardown(){
  #从数据库表中删除的读入的数据,比如:Jerry/123456
  ...
}


比如测试程序在继续后续测试的时候出现了一个异常,比如元素没有找到,系统会自动退出,而不去执行teardown方法,也就是说数据库中的数据没有得到清除,这样如果下一次测试同样的case,采用同样的测试数据就会使测试程序发生脏数据异常,为了解决这个问题我们通过使用Python的try-catch来捕获异常,并且将所有的方法封装在一个类中。我们在util.py中封装一个class类。


(1)封装定位API

代码1:封装定位API。


def find_element_by_id(self,driver,mystr):
    try:
      return driver.find_element_by_id(mystr)
    except NoSuchElementException:
      print("find_element_by_id 没有发现元素"+mystr)


这样如果系统通过by_id方式找不到某个元素,测试程序会抛出“find_element_by_id 没有发现元素"+mystr(mystr即定位的id号)”信息,然后继续下面的程序。调用的时候采用下面的方法。


def setUp(self):
     d = drivers()
     self.driver=d.driver
     self.fd=findby()
     self.fd.implicitly_wait(self.driver,5)
def test_XXX():
self.fd.find_element_by_id(self.driver,"kw").clear()


当然其他的定位方式也同样适用。


(2)封装操作API

代码2:封装操作API。


def send_keys(self,elenment,send_string):
        try:
             elenment.send_keys(send_string)
        except:
              print("send_keys操作失败")


当执行send_keys发生异常,系统抛出“send_keys操作失败”信息,然后继续下面的程序。调用的时候采用下面的方法。


self.fd.send_keys(self.fd.find_element_by_id(self.driver,"kw"),inputstring)


2.Retry优化

UI自动化测试程序的最大问题之一在于由于网络不稳定,从而造成页面元素不是不存在,而是还没有被调出来(虽然Selenium提供了现式等待和隐式等待,实际工程中会发现这两个方法是有缺陷的,并且好些浏览器根本就不支持)。在这里进行如下的优化。


代码3:Retry优化。


def find_element_by_id(self,driver,mystr):
                try:
                        return driver.find_element_by_id(mystr)
                except NoSuchElementException:
                        for i in range(2):
                                try:
                                        time.sleep(2000)
                                        return driver.find_element_by_id(mystr)
                                except NoSuchElementException:
                                        print("尝试第"+str(i+1)+"次失败")
                        print("尝试第3次失败")
                        print("find_element_by_id 没有发现元素"+mystr)


当程序找不到元素的时候,等待2秒钟,继续获取,如果还是没有取到继续等待,在这里设置了两次的等待机会,如果没有报异常信息。


3.对页面的封装

def test_Add_Addess(self):
username='cindy'
password='123456'
#登录
self.clear(self.find_element_by_id(driver,"id_username"))
self.send_keys(self.find_element_by_id(driver,"id_username"),username)
self.clear(self.find_element_by_id(driver,"id_password"))
self.send_keys(self.find_element_by_id(driver,"id_password"),password)
self.submit(self.find_element_by_class_name(driver,"form-signin"))
#在登录首页找到用户名
self.fd.click(self.fd.find_element_by_link_text(self.driver, username))
#进入用户信息列表
self.fd.click(self.fd.find_element_by_id(self.driver,"add_address"))
#进入添加送货地址信息页面,添加收货信息
self.fd.clear(self.fd.find_element_by_name(self.driver,"address"))
self.fd.send_keys(self.fd.find_element_by_name(self.driver,"address"),"北京清华")
self.fd.clear(self.fd.find_element_by_name(self.driver,"phone"))
self.fd.send_keys(self.fd.find_element_by_name(self.driver,"phone"),"13699876655")
self.fd.click(self.fd.find_element_by_xpath(self.driver,"/html/body/div/form/button"))
#验证加入的信息
self.assertIsNotNone(self.fd.find_element_by_link_text(self.driver,"删除"))
#测试完毕,清场操作
self.fd.click(self.fd.find_element_by_link_text(self.driver,"删除"))


被测对象是一个电子商务网站,要测试在用户界面添加一条收货信息。所以必须先登录,登录完毕后点击当前用户名的超链,然后进入用户信息界面,接下来点击新建用户收货地址按钮,进入新建页面,建立完毕进行断言,最后为了以后仍旧可以进行这个测试用例,进行清除操作。由此可见,如果一个测试业务比较长,按照这样的写法可读性是比较差的,并不便于维护,因此采用目前比较流行的基于页面的封装方法。


先对登录页面进行封装,代码如下。


代码4:测试添加用户购物配送地址功能。


#通用信息
class Util:
    def __init__(self,driver):
        self.driver = driver
    def logout(self):
        findby.click(self.driver,findby.find_element_by_link_text(self,self.driver,"退出"))
        findby.quit(self,self.driver)
#登录页面
class LoginPage:
    def __init__(self,driver):
        self.driver = driver
#登录操作
    def login(self,username,password):
        findby.clear(self.driver,findby.find_element_by_id(self,self.driver,"id_username"))#清空用户输入框
        findby.send_keys(self.driver,findby.find_element_by_id(self,self.driver,"id_username"),username)#输入用户名
        findby.clear(self.driver,findby.find_element_by_id(self,self.driver,"id_password")) #清空密码输入框
        findby.send_keys(self.driver,findby.find_element_by_id(self,self.driver,"id_password"),password)#输入密码
        findby.submit(self.driver,findby.find_element_by_class_name(self,self.driver,"form-signin"))#提交表单


产品页面封装如下。


#产品页面
class ProductPage:
    def __init__(self,driver):
        self.driver = driver
    #进入用户信息页面
    def click_username(self,username):
        findby.click(self.driver,findby.find_element_by_link_text(self,self.driver,username))#


点击登录用户名链接


登录用户详情页面封装如下。


#登录用户详情页面
class UserPage:
    def __init__(self,driver):
        self.driver = driver
    #添加购物配送地址信息
    def click_add_address_button(self):
        findby.click(self.driver,findby.find_element_by_id(self,self.driver,"add_address"))
    #验证地址信息
    def check_address(self):
        return findby.find_element_by_link_text(self,self.driver,"删除")
    #删除地址信息
    def delete_address(self):
        delete_button = findby.find_element_by_link_text(self,self.driver,"删除")
        findby.click(self.driver,delete_button)


添加地址页面封装如下。


#地址
class AddressPage:
    def __init__(self,driver):
        self.driver = driver
    #添加新地址
    def create_address(self,addess,phone):
        findby.clear(self.driver,findby.find_element_by_name(self,self.driver,"address"))#清空地址栏
        findby.send_keys(self.driver,findby.find_element_by_name(self,self.driver,"address"),addess)#输入地址信息
        findby.clear(self.driver,findby.find_element_by_name(self,self.driver,"phone"))##清空电话栏
        findby.send_keys(self.driver,findby.find_element_by_name(self,self.driver,"phone"),phone)#输入电话信息
        findby.submit(self.driver,findby.find_element_by_xpath(self,self.driver,"/html/body/div/form/button"))#提交表单


这样,验证添加购物地址的测试代码如下。


#coding:utf-8
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
import unittest,time
from util import drivers,findby
from page import Util,LoginPage,ProductPage,UserPage,AddressPage,CartPage
class CheckEBusiness(unittest.TestCase):
    def setUp(self):
        driver = drivers().driver
        fd = findby()
        self.util = Util(driver)
        self.loginpage = LoginPage(driver)
        self.producepage = ProductPage(driver)
        self.userpage = UserPage(driver)
        self.addresspage = AddressPage(driver)
        self.cartpage = CartPage(driver)
        fd.implicitly_wait(driver,5)
        fd.get(driver,"http://127.0.0.1:8000")
        self.username = "cindy"
        self.password = "123456"
        self.adddress = "首体南路3号"
        self.phone = "13681732596"
    def test_Add_Addess(self):
        self.loginpage.login(self.username,self.password)
        self.producepage.click_username(self.username)
        self.userpage.click_add_address_button()
        self.addresspage.create_address(self.adddress,self.phone)
        self.assertIsNotNone(self,self.userpage.check_address())
        self.userpage.delete_address()
if __name__=="__main__":
        unittest.main()


这样测试程序的代码的可读性与可维护性都得到了很好得加强。现在增加“测试购物车功能”的验证。只需在Product类中建立如下两个方法。


代码5:测试添加商品进购物车功能。


#放入购物车
    def put_into_cart(self):
        findby.click(self.driver,findby.find_element_by_link_text(self,self.driver,"放入"))# 点击“放入”链接
    #查看购物车
    def view_cart(self):
        findby.click(self.driver,findby.find_element_by_partial_link_text(self,self.driver,"查看购物车"))# 点击“查看购物车”链接在加入一个Cart(购物车)类。


然后增加一个购物车的类。


#购物车页面
class CartPage:
    def __init__(self,driver):
        self.driver = driver
    #验证购物车中是否存在商品
    def check_goods(self):
        return findby.find_element_by_xpath(self,self.driver,"//*[@id=\"id_count\"]")
    #删除购物车总中的商品
    def delete_goods(self):
        findby.click(self.driver,findby.find_element_by_link_text(self,self.driver,"移除"))


相应的测试代码为。


def test_Add_Goods_into_Cart(self):
        self.loginpage.login(self.username,self.password)
        self.producepage.put_into_cart()
        self.producepage.view_cart()
        self.assertIsNotNone(self.cartpage.check_goods())
        self.cartpage.delete_goods()


最后再来验证一下对商品查询的功能,在Product类中加入。


代码6:测试商品查询功能。


#商品查询
    def search_goods(self,good_name):
        findby.send_keys(self.driver,findby.find_element_by_name(self,self.driver,"good"),good_name)#输入查询内容
        findby.click(self.driver,findby.find_element_by_xpath(self,self.driver,"//*[@id=\"navbar\"]/form/button"))#输入查询内容
        return findby.find_element_by_link_text(self,self.driver,"放入")


而在测试代码中加入如下两行测试语句就可以了。


def test_Search_Goods(self):
        self.loginpage.login(self.username,self.password)
        self.assertIsNotNone(self.producepage.search_goods("茶"))


星云测试

http://www.teststars.cc

奇林软件

http://www.kylinpet.com

联合通测

http://www.quicktesting.net


顾翔凡言:

    困而学之,学而知之,知而不困,不困则不学,不学则不知,不知则又困也,故学无终止。


目录
相关文章
|
1月前
|
人工智能 搜索推荐 数据管理
探索软件测试中的自动化测试框架选择与优化策略
本文深入探讨了在现代软件开发流程中,如何根据项目特性、团队技能和长期维护需求,精准选择合适的自动化测试框架。
122 8
|
1月前
|
定位技术 开发者
游戏开发者如何使用独享静态代理IP进行测试与优化
随着互联网技术的发展,使用代理IP的人数逐渐增加,特别是在业务需求中需要使用静态代理IP的情况越来越多。本文探讨了独享静态代理IP是否适用于游戏行业,分析了其优势如稳定性、不共享同一IP地址及地理位置选择等,同时也指出了需要注意的问题,包括可能的延迟、游戏兼容性和网络速度等。总体而言,选择合适的代理服务并正确配置,可以有效提升游戏体验。
38 2
|
2月前
|
人工智能 前端开发 测试技术
探索软件测试中的自动化框架选择与优化策略####
本文深入剖析了当前主流的自动化测试框架,通过对比分析各自的优势、局限性及适用场景,为读者提供了一套系统性的选择与优化指南。文章首先概述了自动化测试的重要性及其在软件开发生命周期中的位置,接着逐一探讨了Selenium、Appium、Cypress等热门框架的特点,并通过实际案例展示了如何根据项目需求灵活选用与配置框架,以提升测试效率和质量。最后,文章还分享了若干最佳实践和未来趋势预测,旨在帮助测试工程师更好地应对复杂多变的测试环境。 ####
67 4
|
2月前
|
人工智能 监控 测试技术
探索软件测试中的自动化框架选择与优化策略####
【10月更文挑战第21天】 本文深入剖析了软件测试领域面临的挑战,聚焦于自动化测试框架的选择与优化这一核心议题。不同于传统摘要的概述方式,本文将以一个虚拟案例“X项目”为线索,通过该项目从手动测试困境到自动化转型的成功历程,生动展现如何根据项目特性精准匹配自动化工具(如Selenium、Appium等),并结合CI/CD流程进行深度集成与持续优化,最终实现测试效率与质量的双重飞跃。读者将跟随“X项目”团队的视角,直观感受自动化框架选型的策略性思考及实践中的优化技巧,获得可借鉴的实战经验。 ####
47 0
|
1月前
|
Web App开发 数据采集 JavaScript
CDP与Selenium相结合——玩转网页端自动化数据采集/爬取程序
本文介绍了Selenium、Chrome DevTools及Chrome DevTools Protocol (CDP) 的基本功能与应用。Selenium是一款开源自动化测试工具,适用于网页端应用程序测试和数据采集,具备跨平台特性。Chrome DevTools内置浏览器中,提供调试、分析Web应用程序的功能,包括元素、控制台、源代码和网络选项卡等。CDP是一套用于与Chromium内核浏览器通信的API,支持自动化测试和性能分析。文中还展示了Selenium与CDP结合使用的示例,如捕获网络请求数据和打印网页内容,并推荐了相关书籍和资源以供深入学习。
196 39
CDP与Selenium相结合——玩转网页端自动化数据采集/爬取程序
|
1月前
|
Web App开发 IDE JavaScript
Selenium IDE:Web自动化测试的得力助手
Selenium IDE:Web自动化测试的利器。作为开源工具,Selenium IDE支持录制与回放用户操作,适用于Chrome、Firefox等多浏览器,简化了测试流程,提升了效率,降低了自动化测试的门槛。它还支持导出多种编程语言的脚本,便于测试集成与复用。
120 31
Selenium IDE:Web自动化测试的得力助手
|
1月前
|
Web App开发 IDE 测试技术
Selenium:强大的 Web 自动化测试工具
Selenium 是一款强大的 Web 自动化测试工具,包括 Selenium IDE、WebDriver 和 Grid 三大组件,支持多种编程语言和跨平台操作。它能有效提高测试效率,解决跨浏览器兼容性问题,进行性能测试和数据驱动测试,尽管存在学习曲线较陡、不稳定等缺点,但其优势明显,是自动化测试领域的首选工具。
225 17
Selenium:强大的 Web 自动化测试工具
|
15天前
|
消息中间件 监控 小程序
电竞陪玩系统架构优化设计,陪玩app如何提升系统稳定性,陪玩小程序平台的测试与监控
电竞陪玩系统架构涵盖前端(React/Vue)、后端(Spring Boot/php)、数据库(MySQL/MongoDB)、实时通信(WebSocket)及其他组件(Redis、RabbitMQ、Nginx)。通过模块化设计、微服务架构和云计算技术优化,提升系统性能与可靠性。同时,加强全面测试、实时监控及故障管理,确保系统稳定运行。
|
1月前
|
算法 Java 测试技术
Benchmark.NET:让 C# 测试程序性能变得既酷又简单
Benchmark.NET是一款专为 .NET 平台设计的性能基准测试框架,它可以帮助你测量代码的执行时间、内存使用情况等性能指标。它就像是你代码的 "健身教练",帮助你找到瓶颈,优化性能,让你的应用跑得更快、更稳!希望这个小教程能让你在追求高性能的路上越走越远,享受编程带来的无限乐趣!
133 13
|
2月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
84 1

热门文章

最新文章