selenium2-python25-自动化测试模型-登录模块化

atian1986 8年前

来自: 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()方法进行调用。