经过一周的学习page object,终于写了一个稍微完整的pageobject封装,但是结构仍需要改进,现在贴出基本的代码,结构以及不完善的地方日后学习后 继续更新,如有错误,还请大家指出。谢谢!
basepage.py (这个文件是对一些基本的方法的封装,其余的页面都可以继承自该页面)
# 该文件封装一些常用的方法,以便别的页面调用
from selenium.webdriver.common.by import By
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
import time
import os
class BasePage(object):
# 基本的一些东西,例如URL ,driver等
def __init__(self, selenium_driver, base_url, pagetitle):
self.driver = selenium_driver
self.url = base_url
self.title = pagetitle
# 打开网页,
# 是否要对open函数中进行传参数:URL?
# 最初的想法是不传参直接用————init————封装的,
# 但是最后又想了一下感觉,如果用init里面的,那就是一个固定的URL,还是传参数比较好。
def open(self, url, implicitly_wait = 30):
self.driver.get(url)
self.driver.maximize_window()
try:
assert driver.title, self.title
except Exception as e:
print(e)
self.driver.implicitly_wait(implicitly_wait)
return self
# 找到元素
# def find_element(self, *loc):
# try:
# WebDriverWait(self.driver,10).until(EC.visibility_of_element_located(*loc))
# return self.driver.find_element(*loc)
# # WebDriverWait(self.driver,10).until(EC.visibility_of_element_located(loc))
# # return self.driver.find_element(*loc)
# except Exception as e:
# print('no such element')
def find_element(self,*loc):
try:
WebDriverWait(self.driver,10).until(EC.visibility_of_element_located(loc))
return self.driver.find_element(*loc)
except Exception as e:
print(e)
def click_element(self, *loc):
return self.find_element(*loc).click()
def verify_title(self, giventitle):
try:
assert self.driver.title, giventitle
except Exception as e:
print(e)
def send_keys(self, loc, value):
# return self.click_element(*loc).send_keys(value)
self.find_element(*loc).clear()
self.find_element(*loc).send_keys(value)
def save_screenshot(self):
day = time.strftime('%Y%m%d',time.localtime(time.time()))
screen_shoot_path = '.\screenshot_%s' % day
if not os.path.exists(screen_shoot_path):
os.mkdir(screen_shoot_path)
tm = time.strftime('%H%M%S',time.localtime(time.time()))
screen = self.driver.save_screenshot(screen_shoot_path + '\\%s.png' %tm)
return screen
loginpage.py(继承自basepage,是对优快云登录页面的一些操作的封装)
from basepage import BasePage
from selenium.webdriver.common.by import By
class LoginPage(BasePage):
def open(self,url):
self.driver.get(url)
self.driver.maximize_window()
try:
assert self.driver.title, self.title
except Exception as e:
print(e)
def input_username(self, loc, username):
self.send_keys(loc, username)
def input_password(self, loc, pasword):
self.send_keys(loc, pasword)
def click_submit(self, *loc):
self.click_element(*loc)
def login_success(self,giventitle):
self.verify_title(giventitle)
print('login success')
def login_failure(self, *loc):
infor = self.find_element(*loc).text
print(infor)
locators.py(是对优快云登录页面一些元素的定位)
from selenium.webdriver.common.by import By
class loginLocators(object):
denglu = (By.LINK_TEXT, '登录')
username = (By.CSS_SELECTOR, '#username')
password = (By.CSS_SELECTOR, '#password')
submit = (By.CSS_SELECTOR, '#fm1 > input.logging')
errmessage = (By.CSS_SELECTOR, "#fm1 > div.error-mess")
login.py(公共函数,用于登录)
from loginpage import LoginPage
from selenium.webdriver.common.by import By
from locators import loginLocators
def loginFunc(login, username, password = 'XXX'):
# login = LoginPage(driver, url , title)
login.click_element(*loginLocators.denglu)
login.input_username(loginLocators.username, username)
login.input_password(loginLocators.password, password)
login.click_submit(*loginLocators.submit)
test_login.py(测试用例)
from loginpage import LoginPage
import unittest
from selenium import webdriver
from selenium.webdriver.common.by import By
from loginpage import LoginPage
import time
from locators import loginLocators
from login import loginFunc
class Login(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Chrome()
self.url = 'http://www.youkuaiyun.com/'
self.title = '优快云首页-不止于代码'
def test_login1(self):
u"""login with correct username and password"""
login = LoginPage(self.driver, self.url , self.title)
login.open(self.url)
# self.driver.find_element_by_link_text('登录').click()
# self.driver.find_element(By.CSS_SELECTOR, '#username').send_keys("XXX")
# self.driver.find_element(*loginLocators.username).send_keys("XXX")
# login.find_element(*loginLocators.denglu)
# 第一种方法:没有写public的login函数,就是一步步的自己去登录执行操作
# login.click_element(*loginLocators.denglu)
# login.verify_title(u'帐号登录')
# login.input_username(loginLocators.username, 'CXXX')
# login.input_password(loginLocators.password, 'XXX')
# login.click_submit(*loginLocators.submit)
# login.verify_title(u'我的优快云')
# time.sleep(5)
# 第二种方法:写了一个登录函数loginFunc,但是中间遇到了很多问题,现在总结如下:
# 1.如何传参数、要传递什么参数
# 我是先把登录函数一步步写好,然后在把它抽成一个函数,这个时间要传递的一些登录需要的变量就可以一目了然了,但是结合上下文,
# 如果需要运行登录函数的话,还需要一些别的参数和变量,最初我的写法是在loginFunc内部,又写了一次login = LoginPage(driver,url , title)
# 此时需要在loginFunc函数中的参数添加driver,url,title,自己知道这样写代码冗余,但是又不知道该如果改进,想了好久把login当成一个参数传递进loginFunc中,然后就可以成功运行了。
loginFunc(login,'CXXX')
login.save_screenshot()
login.verify_title(u'我的优快云')
def test_login2(self):
u"""login with correct username and wrong password"""
login = LoginPage(self.driver, self.url , self.title)
login.open(self.url)
loginFunc(login,'XXXX',password = 'XXX')
login.login_failure(*loginLocators.errmessage)
def tearDown(self):
self.driver.quit()
if __name__ == '__main__':
unittest.main()