selenium框架浅谈

我们知道,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。

感谢关注!互相交流,谢谢!!!

原文发布于微信公众号 - Python自动化测试(wuya-python)

原文发表时间:2017-10-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏CSDN技术头条

提高代码可读性的10个技巧

以下为译文: 如果你的代码很容易阅读,这也会帮助你调试自己的程序,让工作变得更容易。 代码可读性是计算机编程领域的一个普遍课题,这也是作为开发人员首先要学习的...

20770
来自专栏GopherCoder

『Go 语言学习专栏』-- 第九期

13710
来自专栏逍遥剑客的游戏开发

Ogitor代码分析

14520
来自专栏高性能服务器开发

服务器开发通信协议设计介绍

由于我们的即时通讯软件的用户存在用户状态问题,即用户登录成功以后可以在他的好友列表中看到哪些好友在线,所以客户端和服务器需要保持长连接状态。另外即时通讯软件一般...

25120
来自专栏喔家ArchiSelf

全栈必备JavaScript基础

1995年,诞生了JavaScript语言,那一年,我刚刚从大学毕业。在今年RedMonk 推出的2017 年第一季度编程语言排行榜中,JavaScript 排...

13840
来自专栏owent

小记最近踩得两个C++坑

记一下最近踩得两个C++独有的暗坑,其中一个和ABI相关。第二个坑其实之前研究过,但是没有实例,这次算是碰到了个典型的实例。

12320
来自专栏游戏开发那些事

【Cocos2d-x游戏开发】Cocos2d-x中的数据存储技术

  数据存储和网络功能可以说是一款游戏中必不可少的功能,如果一款游戏不能保存进度那么它的可玩性必然大打折扣(试想一下,玩家辛辛苦苦玩了一整天的游戏,结果退出时告...

10310
来自专栏程序员的诗和远方

异步多图加载这件小事儿(Promise与async)

日常开发过程中,时不时会遇到要同时预加载几张图片,并且等都加载完再干活的情况,结合 Promise 和 async/await 代码会优雅很多,但也容易遇到坑,...

37480
来自专栏逸鹏说道

SignalR代理对象异常 推出的结论

异常汇总:http://www.cnblogs.com/dunitian/p/4523006.html#signalR SignalR代理对象异常:Uncau...

30350
来自专栏从流域到海域

《笨办法学Python》 第1课手记

《笨办法学Python》第1课手记 在powershell中打开Python输入如下代码: print "Hello World!" print "Hello...

23570

扫码关注云+社区

领取腾讯云代金券