selenium pageObject

本文介绍了一个基于PageObject模式的自动化测试框架实现。通过封装基础页面操作,实现了登录功能,并提供了两个测试案例验证正确性和异常处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

经过一周的学习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()

Selenium Page Object模式是一种设计模式,用于将页面的元素和操作封装到一个类中,以便于测试代码的编写和维护。通过使用Page Object模式,可以将测试代码与页面的具体实现细节分离,提高测试代码的可读性和可维护性。 在引用的代码中,可以看到使用了Page Object模式的一些示例。首先,通过声明一个含两个元素的元组,存放操作方式及内容,来定位页面元素\[2\]。然后,通过声明一个方法,封装对元素的操作,来实现对页面元素的操作\[2\]。最后,在构造方法中传入浏览器,并和测试用例类使用同一浏览器\[2\]。 此外,还可以看到在引用的代码中,使用selenium库的webdriver模块来启动浏览器、访问网页,并进行元素定位和操作\[1\]\[3\]。 总结来说,Selenium Page Object模式是一种将页面元素和操作封装到类中的设计模式,可以提高测试代码的可读性和可维护性。在使用Page Object模式时,可以通过声明元组来定位页面元素,通过声明方法来封装对元素的操作,并在构造方法中传入浏览器对象。 #### 引用[.reference_title] - *1* [Python+Selenium自动化测试(五):Page Object模式](https://blog.youkuaiyun.com/Max_138015/article/details/120028865)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [selenium设计模式之------PageObject,自动化测试分层设计思想](https://blog.youkuaiyun.com/weixin_42976139/article/details/102368263)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值