selenium2-python25-自动化测试模型-登录模块化
来自: http://my.oschina.net/TTSK/blog/614885
通过上一节对测试模型的学习可以发现,在我们的目前的脚本中有很多代码是可以模块化的,比如登 录模块。我们的每一个用例的执行都需要登录脚本,那可我们是否可以将登录脚本独立到单独的文件调用。
下面就以百度登录退出测试用例为例:
# coding:utf-8 from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.ui import Select from selenium.common.exceptions import NoSuchElementException import unittest,time import login class Login(unittest.TestCase): def setUp(self): self.driver = webdriver.Firefox() self.driver.implicitly_wait(30) self.base_url ='http://www.baidu.com' self.verficationErrors = [] self.accept_next_alert =True def test_login(self): driver = self.driver driver.get(self.base_url) driver.maximize_window() # #登录 driver.find_element_by_xpath(".//*[@id='u1']/a[7]").click() time.sleep(2) driver.find_element_by_xpath(".//*[@id='TANGRAM__PSP_8__userName']").clear() time.sleep(2) driver.find_element_by_xpath(".//*[@id='TANGRAM__PSP_8__userName']").send_keys('xxxx') time.sleep(2) driver.find_element_by_xpath(".//*[@id='TANGRAM__PSP_8__password']").clear() time.sleep(2) driver.find_element_by_xpath(".//*[@id='TANGRAM__PSP_8__password']").send_keys('xxxx') time.sleep(2) driver.find_element_by_xpath(".//*[@id='TANGRAM__PSP_8__submit']").click() time.sleep(2) # #退出 # div = driver.find_element_by_id('s_user_name_menu') # div.find_element_by_xpath(".//*[@id='s_user_name_menu']/div/a[5]/text()").click() # # div.find_element_by_class_name('quit').click() # # time.sleep(2) # driver.find_element_by_xpath(".//*[@id='tip_con_wrap']/div[3]/a[3]").click() # time.sleep(2) # print '成功退出账户' def tearDown(self): self.driver.quit() self.assertEqual([],self.verficationErrors) if __name__ == '__main__': unittest.main()
在与 baidu.py 相同的目录下创建 login.py 文件,脚本内容如下:
# coding:utf-8 from selenium import webdriver from selenium.common.exceptions import NoSuchElementException import unittest,time #登录模块(函数) def login(self): driver =self.driver driver.maximize_window() driver.find_element_by_xpath(".//*[@id='u1']/a[7]").click() time.sleep(2) driver.find_element_by_xpath(".//*[@id='TANGRAM__PSP_8__userName']").clear() time.sleep(2) driver.find_element_by_xpath(".//*[@id='TANGRAM__PSP_8__userName']").send_keys('xxxx') time.sleep(2) driver.find_element_by_xpath(".//*[@id='TANGRAM__PSP_8__password']").clear() time.sleep(2) driver.find_element_by_xpath(".//*[@id='TANGRAM__PSP_8__password']").send_keys('xxxx') time.sleep(2) driver.find_element_by_xpath(".//*[@id='TANGRAM__PSP_8__submit']").click() time.sleep(2)
通过上面的例子我们明显的发现类的方法与函数有一个明显的区别,在类的方法中必须有个额外的第 一个参数(self),但在调用类的方法时却不必为这个参数赋值。self 参数所指的是对象本身,所以习惯
性地命名为 self。
为何 Python 给 self 赋值而你不必给 self 赋值?
创建了一个类 MyClass,实例化 MyClass 得到了 MyObject 这个对象,然后调用这个对象的方法 MyObject.method(a,b),在这个过程中,Python 会自动转为 Myclass.method(MyObject,a,b),这就是 Python 的 self 的原理。即使你的类的方法不需要任何参数,但还是得给这个方法定义一个 self 参数,虽然我们 在实例化调用的时候不用理会这个参数。
下面回到用例本身来讨论如何模块化和调用的,在 login.py 文件中:
def login(self): driver = self.driver
这里用到的是方法,(driver = self.driver)driver 为对象身的 driver,这一句很重要,否则我们 无法在 ligin()方法中使用 driver 操作浏览器。
在 baidu.py 文件中:
#导入登录文件import login ......
#调用登录模块login.login(self)
......
首先导入 login 文件,然后对文件中的 login()方法进行调用。