WebUI automation testing framework based on Selenium
介绍: pyse基于selenium(webdriver)进行了简单的二次封装,比selenium提供的方法操作更简洁。
起因:
python + selenium 自动化测试写久了发现selenium(webdriver)提供原生的方法并简便,于是,产生了二次封装的想法。想不到太炫酷的名字,于是各取了两个单词的前两个字母-- pyse。
特点:
- 所有方法只提供xpath定位,webdriver提供了8种定位方法(id\name\class name\tag name\link text\partial link text\xpath\css selector)但xpath一定程度可以替代id\name\class name\tag name 等方法,本框架所提供的click_text()方法可以替代link text方法,所以只用xpath定位对不影响框架对元素的定位能力,又保证了定位方法的一致性。
- 本框架只是对selenium(webdriver)原方法的简单封装,精简为30个方法,经过我的自动实践,这些方法完全够胜任于我们的自动化工作。
- 集成了HTMLTestRunner 测试报告,使生成报告变得很简单。
安装及前提条件:
- Python2.7 :https://www.python.org/
- selenium: https://pypi.python.org/pypi/selenium
- 安装pyse : 将其克隆到本地,将pyse目录放到..\Python27\Lib\site-packages\目录下。
例子: 请查看demo目录
先看一下百度搜索的例子:
baidu.py
#coding=utf-8 from pyse import Pyse from time import sleep driver = Pyse("chrome") driver.open("https://ww.baidu.com") driver.type("//*[@id='kw']",u"pyse自动化测试") driver.click("//*[@id='su']") sleep(2) driver.quit()
再看一个page object 设计模式的例子
page_object_case.py
#coding=utf-8 from pyse import Pyse from time import sleep class Page(object): ''' 基本类,用于所页面的继承 ''' login_url = 'http://www.126.com' def __init__(self, selenium_driver, base_url=login_url, parent=None): self.base_url = base_url self.driver = selenium_driver self.timeout = 30 self.parent = parent def _iopen(self,url): url = self.base_url + url self.driver.open(url) assert self.on_page(),'Did not land on %s' % url def iopen(self): self._iopen(self.url) def on_page(self): return self.driver.get_url() == (self.base_url + self.url) class LoginPage(Page): ''' 126邮箱登录页面模型 ''' url = '/' def type_username(self,username): self.driver.type("//*[@id='idInput']",username) def type_password(self,password): self.driver.type("//*[@id='pwdInput']",password) def submit(self): self.driver.click("//*[@id='loginBtn']") def test_user_login(driver, username, password): """ 测试获取的用户名密码 是否可以登录 """ login_page = LoginPage(driver) login_page.iopen() login_page.type_username(username) login_page.type_password(password) login_page.submit() def main(): try: driver = Pyse("chrome") username = 'username' password = 'password' test_user_login(driver, username, password) sleep(3) text = driver.get_text("//span[@id='spnUid']") assert(text == '[email protected]'),u"用户名称不匹配,登录失败!" finally: # 关闭浏览器窗口 driver.close() if __name__ == '__main__': main()
再看一个使用unittest单元测试框架的例子。
unittest_case.py
#coding=utf-8 from pyse import Pyse,TestRunner from time import sleep import unittest class baiduTest(unittest.TestCase): def setUp(self): self.driver = Pyse("chrome") self.driver.wait(10) self.base_url = "http://www.baidu.com" def test_case(self): driver = self.driver driver.open(self.base_url) driver.click_text("设置") driver.click_text("搜索设置") sleep(2) driver.click("//a[@class='prefpanelgo']") sleep(1) driver.accept_alert() def tearDown(self): self.driver.quit() if __name__ == '__main__': TestRunner(r".\demo").run()
调用TestRunner()测试类时需要指定一个测试用例的目录,如:E:\mytestpro\test_case 。然后,调用的它的run()方法来运行测试用例。
匹配测试用例文件的规则是*_case.py 。所以,测试文件的命名一定要为 aa_case.py ,a12_case.py等。
它会自动在test_case目录下生成report目录并在其下面生成测试报告。如下:
支持的浏览器及驱动:
Firefox:
driver = Pyse("firefox")
或:
driver = Pyse("ff")
Chrome:
driver = Pyse("chrome")
IE:
driver = Pyse("internet explorer")
或:
driver = Pyse("ie")
Opera:
driver = Pyse("opera")
PhantomJS:
driver = Pyse("phantomjs") #需要将phantomjs驱动程序
phantomjs.exe放入脚本程序根目录下
Edge:
driver = Pyse("edge")
geckodriver(Firefox):https://github.com/mozilla/geckodriver/releases
Chromedriver(Chrome):https://sites.google.com/a/chromium.org/chromedriver/home
IEDriverServer(IE):http://selenium-release.storage.googleapis.com/index.html
operadriver(Opera):https://github.com/operasoftware/operachromiumdriver/releases
phantomjs(PhantomJS):http://phantomjs.org
MicrosoftWebDriver(Edge):https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver
==========================================================
元素定位:
pyse支持多种定位方式,id、name、class、link text、xpath和css。把定位方法与定位内容一体,写起更加简洁。
==========================================================
id定位:
driver.type("id=>kw", "pyse")
==========================================================
class定位:
driver.type("class=>s_ipt", "pyse")
==========================================================
name定位:
driver.type("name=>wd", "pyse")
==========================================================
link text定位: 点击百度首页上的"新闻"链接。
driver.click_text(u"link_text=>新闻")
==========================================================
xpath定位:
driver.type("xpath=>//*[@class='s_ipt']","pyse")
driver.type("xpath=>//*[@id='kw']","pyse")
==========================================================
css定位:
driver.type("css=>.s_ipt","pyse")
driver.type("css=>#su","pyse")
==========================================================
css选择器参考手册: http://www.w3school.com.cn/cssref/css_selectors.asp nose基本用法:http://pythontesting.net/framework/nose/nose-introduction/
项目地址:https://github.com/defnngj/pyse