selenium python怎么封装方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了selenium python怎么封装方法相关的知识,希望对你有一定的参考价值。

参考技术A

一、常用函数的封装

在使用selenium做web自动化测试的过程中,经常会碰到各种各样的问题,比如:

1、页面加载比较慢时,selenium查找元素抛出异常,导致脚本运行中止

2、写完脚本后发现代码逻辑不够清晰,维护困难,降低测试效率

所以很有必要对selenium进行封装使框架更适合公司的需求,下面是基类的封装,主要使用单例模式,可以将业务逻辑代码存放在不同的Python文件中

注:BASE_URL为博客园的登录地址

1 # -*- coding:utf-8 -*-  2 from selenium import webdriver  3 import time  4   5 OVER_TIME = 5  6 BASE_URL = "nblogs.com/user/signin?ReturnUrl=hFwww.cnblogs.com%2F"  7   8   9 class Driver(object): 10  11     def __new__(cls, *args, **kw): 12         """ 13         使用单例模式将类设置为运行时只有一个实例,在其他Python类中使用基类时, 14         可以创建多个对象,保证所有的对象都是基于一个浏览器 15         """ 16         if not hasattr(cls, '_instance'): 17             orig = super(Driver, cls) 18             cls._instance = orig.__new__(cls, *args, **kw) 19         return cls._instance 20  21     def start(self, url=BASE_URL, driver_name="Chrome"): 22         """ 23         启动浏览器 24         :param url: 测试地址 25         :param driver_name: 在启动时设置浏览器的类型 26         :return: 27         """ 28         if driver_name == "Firefox": 29             self.driver = webdriver.Firefox() 30         elif driver_name == "Ie": 31             self.driver = webdriver.Ie() 32         else: 33             self.driver = webdriver.Chrome() 34         self.driver.implicitly_wait(OVER_TIME) 35         self.driver.get(url) 36         self.driver.maximize_window() 37  38     def get_url(self): 39         """返回浏览器的地址""" 40         return BASE_URL 41  42     def find_element(self, by, value): 43         """ 44         这里添加了一个OVER_TIME作为查找元素的超时次数,根据系统的实际情况设置OVER_TIME的大小 45         """ 46         for i in range(OVER_TIME): 47             try: 48                 return self.driver.find_element(by=by, value=value) 49             except Exception, e: 50                 print e 51  52     def find_elements(self, by, value): 53         """与find_element一致""" 54         for i in range(OVER_TIME): 55             try: 56                 return self.driver.find_elements(by=by, value=value) 57             except Exception, e: 58                 print e 59  60     def find_display_elements(self, by, value): 61         """ 62         查找状态为displayed的元素集合,当查找一类元素时, 63         经常出现有些元素是不可见的情况,此函数屏蔽那些不可见的元素 64         """ 65         for i in range(OVER_TIME): 66             try: 67                 elements = self.driver.find_elements(by=by, value=value) 68                 num = elements.__len__() 69             except Exception, e: 70                 print e 71                 time.sleep(1) 72             if num >= 1: 73                 break 74         display_element = [] 75         # 将可见的元素放到列表中, 并返回 76         for j in range(num): 77             element = elements.__getitem__(j) 78             if element.is_displayed(): 79                 display_element.append(element) 80         return display_element 81  82     def is_element_present(self, By, Value): 83         """判断元素是否存在""" 84         try: 85             self.driver.find_element(by=By, value=Value) 86             return True 87         except Exception, e: 88             print e 89             return False 90  91     def close(self): 92         self.driver.close() 93  94     def quit(self): 95         u"""退出浏览器""" 96         self.driver.quit() 97  98 if __name__ == "__main__": 99     page = Driver()100     page.start()

二、使用封装过的框架和pageobject模式设计登录脚本

1 # -*- coding:utf-8 -*- 2 from webdriver import Driver 3 from selenium.webdriver.common.by import By 4  5  6 class Login(object): 7  8     def __init__(self, user_name="xxx", pwd="xxx"): 9         self.page = Driver()10         page = self.page11         page.start(url=page.get_url())12         self.user_name = page.find_element(By.ID, "input1")13         self.pwd = page.find_element(By.ID, "input2")14         self.login_btn = page.find_element(By.ID, "signin")15         self.login(user_name, pwd)16 17     def login(self, user_name, pwd):18         self.user_name.clear()19         self.user_name.send_keys(user_name)20         self.pwd.clear()21         self.pwd.send_keys(pwd)22         self.login_btn.click()23 24 25 if __name__ == "__main__":26     Login("xxx", "xxx")

三、打开博客园新闻、博问等子页面脚本设计

1 # -*- coding:utf-8 -*- 2 from webdriver import Driver 3 from login import Login 4 from selenium.webdriver.common.by import By 5  6  7 class SubPage(object): 8  9     def __init__(self):10         self.page = Driver()11         page = self.page12         self.home_page = page.find_element(By.LINK_TEXT, u"园子")13         self.news_page = page.find_element(By.LINK_TEXT, u"新闻")14         self.q_page = page.find_element(By.LINK_TEXT, u"博问")15         self.ing_page = page.find_element(By.LINK_TEXT, u"闪存")16 17     def open_home_page(self):18         self.home_page.click()19 20     def open_news_page(self):21         self.news_page.click()22 23     def open_q_page(self):24         self.q_page.click()25 26     def open_ing_page(self):27         self.ing_page.click()28 29 30 if __name__ == '__main__':31     Login("xxx", "xxx")32     sub = SubPage()33     sub.open_q_page()

四、其他

按照此模式博友可根据公司具体的业务来实现自动化测试脚本,本文抛砖引玉,如有其他更好的想法可以一起探讨

selenium + python自动化测试unittest框架学习webdriver的二次封装

因为webdriver的api方法很长,再加上大多数的定位方式是以xpath方式定位,更加让代码看起来超级长,为了使整体的代码看起来整洁,对webdriver进行封装,学习资料来源于虫师的《selenium +  python自动化测试》一书。

在与测试用例文件夹同一目录下新建一个文件夹package,用来放置封装方法的模块文件

我们将webdriver二次封装的文件命名为location.py

from selenium import webdriver
from test_case.public import login                   #login文件中的driver传入

#定位一个元素
def findId(driver,Id):
    f = driver.find_element_by_id(Id)
    return f

def findName(driver,Name):
    f = driver.find_element_by_name(Name)
    return f

def findClassName(driver,ClassName):
    f = driver.find_element_by_class_name(ClassName)
    return f

def findTagName(driver,TagName):
    f = driver.find_element_by_tag_name(TagName)
    return f

def findCss(driver,Css):
    f = driver.find_element_by_css_selector(Css)
    return f

def findLinkText(driver,LinkText):
    f = driver.find_element_by_link_text(LinkText)
    return f

def findPLinkText(driver,PLinkText):
    f = driver.find_element_by_partial_Link_text(PLinkText)
    return f

def findxPath(driver,xPath):
    f = driver.find_element_by_xpath(xPath)
    return f

#定位一组元素

def findsId(driver,Id):
    f = driver.find_elements_by_id(Id)
    return f

def findsName(driver,Name):
    f = driver.find_elements_by_name(Name)
    return f

def findsClassName(driver,ClassName):
    f = driver.find_elements_by_class_name(ClassName)
    return f

def findsTagName(driver,TagName):
    f = driver.find_elements_by_tag_name(TagName)
    return f

def findsCss(driver,Css):
    f = driver.find_elements_by_css_selector(Css)
    return f

def findsLinkText(driver,LinkText):
    f = driver.find_elements_by_link_text(LinkText)
    return f

def findsPLinkText(driver,PLinkText):
    f = driver.find_elements_by_partial_link_text(PLinkText)
    return f

def findsxPath(driver,xPath):
    f = driver.find_elements_by_xpath(xPath)
    return f

在其他需要用到定位方法的文件中将模块导入,且将文件所在的文件路径加入sys.path路径集中便可引用

#实现webdriver二次封装
from package import location
sys.path.append("D:\\fcj\\study\\seleniumtest\\package")
l = location

之后使用的定位方法则变成以下简洁写法:

例如:find_element_by_id()的方法

l.findId(driver,"id")

 

以上是关于selenium python怎么封装方法的主要内容,如果未能解决你的问题,请参考以下文章

Python+Selenium中级篇之7-把截图类方法封装到前面的BasePage.py

python+selenium自动化鼠标事件之封装

selenium + python自动化测试unittest框架学习webdriver的二次封装

web自动化测试入门篇04——selenium+python基础方法封装

Python+Selenium框架设计篇之4-框架内封装基类和实现POM

selenium 封装