经过一周的学习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,是对CSDN登录页面的一些操作的封装)
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(是对CSDN登录页面一些元素的定位)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.csdn.net/' self.title = 'CSDN首页-不止于代码' 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'我的CSDN') # 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'我的CSDN') 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()