Selenium web UI自动化测试框架介绍

发表于:2021-2-08 09:44

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:佚名    来源:CSDN

  Web UI自动化测试使用了unittest框架,内容如下图:
  1. case
  · 放自动化测试用例
  1.1 app(APP与web可以使用同一套测试框架,后续会详细说明)
  1.2 web
  web下有具体的模块用例,一个模块的case对应一个py文件,如首页模块、购物车模块各自对应一个py文件(如果模块较大,可继续细分为多个小模块,尽量不要让1个py文件行数过多)
  TestCase里面的方法主要有3部分
  · setUp:初始化
  · test方法:具体业务实现
  · tearDown:清理/释放(截图、退出)
  Unittest框架执行顺序:setUp->test->tearDown
  · 每执行1条测试用例之前,都要先执行setUp方法
  · 每执行1条测试用例之后,都要再执行tearDown方法
  · test里面报错了也会继续走tearDown
  · 这三个函数名是unittest框架固定的,不能修改(大小写也不能改)
  1). setUp:初始化
  def setUp(self): # 初始化
  # self关键字是类的一个实例化对象(只能用self表示),self.driver就是类的一个变量,这个变量就能被其他方法所认识
  # 平常在一个方法中,定义的变量是局部变量,只能被这个方法认识
  self.driver = webdriver.Chrome()  # 初始化driver
  self.driver.get("http://101.133.169.100/yuns/index.php")  # 打开项目地址
  self.driver.maximize_window()  # 窗口最大化
  time.sleep(5)
  print("starttime:" + time.strftime('%Y-%m-%d-%H-%M-%S', time.localtime(time.time())))  # 打印开始时间
  # strftime:格式化时间的一个方法  time.localtime(time.time()):拿到了当前的时间,并将其格式化

  2). test方法:具体业务实现
  · 一个test方法对应一个测试用例
  · 包含的使用场景:搜索框中输入搜索内容后,判断返回结果是否包含了搜索的内容,如搜索女装,出现包含“女装”的商品
  · 每一条自动化用例都要有一个断言结果
  断言方式:
  def testShouye01_01(self):
      '''测试首页导航文案显示是否正常'''
      Mylogin(self.driver).login()
      firstPageNavi = self.driver.find_element_by_xpath("//div[@class='top']/span")  #定位控件
      loginText = self.driver.find_element_by_css_selector("div.login>a:nth-child(1)")
      regisText = self.driver.find_element_by_css_selector("div.login>a:nth-child(3)")
      #断言结果,使用assertEqual判断实际结果与预期结果是否一致
      #如果一致,用例pass,如果不一致,直接报错,代码不会再往下继续执行
      self.assertEqual("亲,欢迎您来到云商系统商城!",firstPageNavi.text)  #判断逗号前后内容是否相等,前后顺序可调换
      self.assertEqual("17731990979", loginText.text)
      self.assertEqual("退出", regisText.text)
      self.assertNotEqual("dd", regisText.text)  #assertNotEqual:断言不相等
      #assertIn:包含   assertNotIn:不包含
      self.assertIn("云商系统商城",firstPageNavi.text)  #断言逗号后是否包含逗号前的内容
      #如果返回的是true,则assertTrue断言通过,如果返回的是false,则失败
      self.assertTrue(self.driver.find_element_by_xpath("//div[@class='top']/span").is_displayed())  #判断控件是否显示出来
      self.assertFalse(firstPageNavi.is_displayed())  #判断不存在
      #自创断言方式
      if loginText.text == "177****0979":
          print("等于")
      else:
          print("不等于")
          self.driver.find_element_by_xpath("王麻子")  #故意写一个错误语句,不相等时就会报错
  3). tearDown:清理/释放(截图、退出)
  def tearDown(self):   #释放/清理
  filedir = "D:/test/screenshot/"
  #如果电脑没有上面的路径,就创建
  if not os.path.exists(filedir):os.makedirs(os.path.join('D:/', 'test', 'screenshot')) 
  #打印结束时间
  print("endTime:" + time.strftime('%Y-%m-%d-%H-%M-%S',time.localtime(time.time())))
  screen_name = filedir + time.strftime('%Y-%m-%d-%H-%M-%S',time.localtime(time.time())) + ".png"
  self.driver.get_screenshot_as_file(screen_name)
  #截图,截图名称(唯一化):截图保存路径+截图时间+.png
  self.driver.quit()  #退出浏览器

  截图的意义:一条用例执行结果不论是通过还是失败,都需要通过teardown,如果这条用例执行失败、报错,此时截的图就是报错时的页面。截图之前先打印了结束时间,可以通过这个时间找到对应的截图。
  2. public
  放常用的封装的公用的业务模块,比如登录模块,使用时直接调用
  如封装登录模块,代码如下:
  import time
  class Mylogin(object):
      def __init__(self, driver):  #封装了一个init方法
          self.driver = driver  #将driver赋值给self.driver
      def login(self):  #封装登录方法
          self.driver.find_element_by_name("username").send_keys("156********")
          self.driver.find_element_by_name("password").send_keys("123456")
          self.driver.find_element_by_xpath("//div[@class='el-form-item']/div[1]").click()
          time.sleep(5)
  调用方法:
  Mylogin(self.driver).login()
  3. report
  放自动化测试报告(执行结果通过/失败),运行testrunner.py后自动生成HTML报告
  4. testrunner
  批量运行所有case,部分截图如下:
  5. 运行
  运行所有py文件:运行时不能以unittests in形式去运行,要以py形式运行。运行后会生成一个html报告。
  报告截图如下:
  运行后在pycharm里也可看到运行结果:
  代表成功 F代表断言失败 E代表定位不到控件
  · 运行单个py文件:以unittests in形式运行,运行结果会呈现在pycharm里面
  · 如果运行方式不对,可到运行编辑器中设置

  上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号