selenium框架浅谈

发表于:2017-11-15 14:06

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

 作者:无涯    来源:python自动化测试

  我们知道,selenium是一个很优秀的web框架,提供了很丰富的API,使用它结合进行做web的自动化测试真的很完美,但是在实际的情况中,理想与现实总是存在那么一点距离,这点距离主要是难维护,难维护的最核心是页面元素经常改变,测试过程中数据很多,不知道怎么进行维护,页面元素确实经常改变,很难改变,另外一个就是数据问题,比如我们验证N个表单在不同输入情况下的提示信息,会有不同的提示信息,都得需要验证,那么我们就先来解决元素属性怎么来方便的维护开始。
      我们知道,By类中提供了对元素定位,总共是8个方法,单个元素定位是8个,多个元素元素也是8个,具体见By类的源码:
  class By(object):
      """
      Set of supported locator strategies.
      """
      ID = "id"
      XPATH = "xpath"
      LINK_TEXT = "link text"
      PARTIAL_LINK_TEXT = "partial link text"
      NAME = "name"
      TAG_NAME = "tag name"
      CLASS_NAME = "class name"
      CSS_SELECTOR = "css selector"
  至于具体的元素定位以及方法,这里我就不解释了,理由很简单的,那是因为我们要写一个方法,来包含页面元素定位所有的,在框架的层面,元素定位是没有id,name这些东西的,我们的心中只有By类,那么如何解决写一个方法,可以对这8个类型的元素定位,单个,多个包含了,见基础的代码:
  #!/usr/bin/env python 
  #-*-coding:utf-8-*-
  from  selenium.webdriver.support.expected_conditions import NoSuchElementException
  class WebDriver(object):
     def __init__(self,driver):
        self.driver=driver
     def findElement(self, *loc):
        try:
           return self.driver.find_element(*loc)
        except NoSuchElementException as e:
           print 'Error details :%s' % (e.args[0])
     def findsElement(self, *loc):
        try:
           return self.driver.find_elements(*loc)
        except NoSuchElementException as e:
           print 'Error details :%s' % (e.args[0])
  见如上的代码,二个方法搞定,OK,就把这些代码叫基础框架的代码吧,下来我们要编写对象层面的东西,也就是在一个地方维护页面元素的属性,OK,就已百度首页的搜索为案例,对象层需要继承我们编写的基础类WebDriver,见对象层面的代码:
  #!/usr/bin/env python 
  #-*-coding:utf-8-*-
  from selenium.webdriver.common.by import  By
  from base import  WebDriver
  class BaiduTest(WebDriver):
     so_loc=(By.ID,'kw')
     def type(self,keyword):
        self.findElement(*self.so_loc).send_keys(keyword)
     def getElement(self):
        return  self.findElement(*self.so_loc)
  在对象层面中,获取了搜索input的元素属性,编写了搜索输入关键字的方法,下来就是测试了,测试类继承我们的对象层的类吧,见实现的测试代码:
  #!/usr/bin/env python 
  #-*-coding:utf-8-*-
  import  unittest
  from selenium import  webdriver
  from baidu import  BaiduTest
  class UiTest(unittest.TestCase,BaiduTest):
     @classmethod
     def setUpClass(cls):
        cls.driver=webdriver.Firefox()
        cls.driver.maximize_window()
        cls.driver.implicitly_wait(30)
        cls.driver.get('http://www.baidu.com')
     def test_so_001(self):
        self.type(u'搜索关键字')
     @classmethod
     def tearDownClass(cls):
        cls.driver.quit()
  if __name__=='__main__':
     unittest.main(verbosity=2)
  但是在测试用例中,没有断言,另外一点,存在数据,心里总感觉不美气,OK,把数据存在文件中,测试用例添加断言吧,见修改后的代码:
  #!/usr/bin/env python 
  #-*-coding:utf-8-*-
  import  unittest
  from selenium import  webdriver
  from baidu import  BaiduTest
  def readFile(fileName):
     import  os
     f=open(os.path.join(os.path.dirname(__file__),fileName))
     return f.read()
  class UiTest(unittest.TestCase,BaiduTest):
     @classmethod
     def setUpClass(cls):
        cls.driver=webdriver.Firefox()
        cls.driver.maximize_window()
        cls.driver.implicitly_wait(30)
        cls.driver.get(readFile('url.txt'))
     def test_so_001(self):
        self.type(readFile('so.txt'))
        self.assertEqual(self.getElement().get_attribute('value'),readFile('so.txt'))
        
     @classmethod
     def tearDownClass(cls):
        cls.driver.quit()
  if __name__=='__main__':
     unittest.main(verbosity=2)
  OK,测试用例很干净,维护元素属性在一个地方了,数据也是在一个地方了,只不过我们使用的是txt。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

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

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

沪ICP备05003035号

沪公网安备 31010102002173号