思想:

1.定义basepage.py用来写公共方法,比如找元素,打开url,切换frame.这样的部分都写在这里.不必每次用都重写.

2.LoginPage.py 每个功能模块一个文件或者一个类

   这都是可以的,将每个动作封装成一个个的小组件.

3.这里用unittest框架来测试.

下面,以安居客登录为例

1.公用功能部分 basepage.py

#coding:utf-8
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.common.exceptions import NoSuchElementException
'''
公共方法封装:
1.打开浏览器
2.找元素
3.switch_to
4.send_keys
'''
class Action(object):

    def __init__(self,p_url,s_driver,p_title):
        self.base_url = p_url
        self.base_driver = s_driver
        self.page_title = p_title

    #打开浏览器,并最大化
    def page_open(self,url,title):
        self.base_driver.get(url)
        self.base_driver.maximize_window()
        assert title in self.base_driver.title
    #找元素,并加入
    def findElement(self,*loc):
        try:

            WebDriverWait(self.base_driver,5,0.5).until(lambda driver: self.base_driver.find_element(*loc).is_displayed())
            return self.base_driver.find_element(*loc)
        except:
            print(u'%s未能找到页面%s元素'%(self,loc))

    #切换到frame
    def switch_to_frame(self,doc):
        self.base_driver.switch_to_frame(doc)

    #跳出frame
    def default_switch(self):
        self.base_driver.switch_to.default_content()

    #重写sendkeys
    def send_keys(self,doc,value,clear=True,click=False):
        #loc = getattr(self,'_%s'%doc)
        element = self.findElement(doc)
        if clear: element.clear()
        if click: element.click()
        element.send_keys(value)

2.功能模块动作封装anjk_Login.py

每个操作封装成一个个小组件.

这里需要注意的是

self.findElement(*self.pwtab_loc).click()
参数中,带*号,为什么要带星号,因为我们参数是一个元组.中间有By.ID这样的对像,如果不加会有问题.
#coding:utf-8
from selenium.webdriver.common.by import By
from scripts import basepage
from selenium import webdriver
class LoginPage(basepage.Action):
    #定位元素
    username_loc = (By.ID,"pwdUserNameIpt")
    password_loc = (By.ID,"pwdIpt")
    pwtab_loc = (By.ID,"pwdTab")
    btn_loc = (By.ID,"pwdSubmitBtn")
    switchFrame = 0
    #打开页面
    def open_url(self):
        self.page_open(self.base_url,self.page_title)

    #切换frame
    def switch_to_f(self):
        self.switch_to_frame(self.switchFrame)

    #切换登录方式
    def switch_login(self):
        self.findElement(*self.pwtab_loc).click()

    #输入用户名
    def inputUserName(self,username):
        self.findElement(*self.username_loc).send_keys(username)
    #输入pndc
    def inputPassWord(self,password):
        self.findElement(*self.password_loc).send_keys(password)

    #单击登录按钮
    def clickLogin(self):
        self.findElement(*self.btn_loc).click()

if __name__=="__main__":
        driver = webdriver.Firefox()
        driver.implicitly_wait(30)
        url = 'https://login.anjuke.com/login/form?history=aHR0cHM6Ly9zaGFuZ2hhaS5hbmp1a2UuY29tLw=='
        username ='123'
        password=''
        Login_page = LoginPage(url,driver,u'登录')
        Login_page.open_url()
        Login_page.switch_to_f()
        Login_page.switch_login()
        Login_page.inputUserName(username)
        Login_page.inputPassWord(password)
        Login_page.clickLogin()

3.unittest  LoginTest.py

#coding:utf-8
import unittest
from page import anjk_login
from selenium import webdriver
class case_login_ank(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        cls.driver = webdriver.Firefox()
        cls.driver.implicitly_wait(30)
        cls.url = 'https://login.anjuke.com/login/form?history=aHR0cHM6Ly9zaGFuZ2hhaS5hbmp1a2UuY29tLw=='
        cls.username ='123'
        cls.password=''

    def test_case_login(self):
        Login_Page = anjk_login.LoginPage(self.url,self.driver,u'登录')
        Login_Page.open_url()
        Login_Page.switch_to_f()
        Login_Page.switch_login()
        Login_Page.inputUserName(self.username)
        Login_Page.inputPassWord(self.password)
        Login_Page.clickLogin()

    @classmethod
    def tearDownClass(cls):
        cls.driver.quit()

if __name__=="__main__":
    unittest.main()

selenium PO模式-冯金伟博客园