selenium pageObject

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


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
课程介绍你是否在寻找机会进入自动化测试领域? 你是否渴望学习selenium webdriver + Java以及最新的框架和技术进行web自动化测试? 你是否感兴趣学习Selenium如何用在你现有的项目里的? 这门课带你从Selenium搭建环境开始讲起,然后学习selenium,TestNG, logback, maven, jenkins。 我们假设学员没有任何自动化经验,来设计的这套课程。每个课题都从最基础的开始讲起。Selenium相关的该覆盖的课题都覆盖了。 例子都是来自于真实的web应用项目,帮助你理解不同的组件怎么用上自动化,这将展示给你一个行业层面的框架,增加自信心。 全网没有其他课程像这门课涵盖到如此之深的细节。 您将会学到什么 学完课程以后,你将拥有完整的Selenium Webdriver知识 你将具备从头开始设计Page ObjectPage Factory、DATADRIVEN等搭建自动化框架的能力 用100多个实例对Selenium现实场景应用进行深入理解 全面了解TestNG, Maven, Jenkins, HTML报告,多浏览器并行测试 了解数据库测试和使用Selenium进行性能测试 你将彻底了解testNG框架 你从网上随便选择一个网站,都可以实现自动化,用所有可能的测试用例进行自动化测试 将提高你的编码技能,以编写最优化的自动化测试用例代码 你基本可以搞定任何Selenium面试,并能从设计阶段开始领导整个Selenium自动化项目 你应该能够使用应用程序的GUI来验证数据完整性 你将能够创建漂亮的报告来打动客户或领导 更深入地理解自动化指南和代码质量标准 会附带一个练习网站,可以用上所有可用的WebDriver功能,实现自动化 【适合人群】 软件手动测试人员想转为自动化测试的人员 自动化软件测试人员想加强专业技能的 刚毕业学生想从事软件行业 QA 组长或项目经理 【课程优势】 学完课程以后,你将拥有完整的Selenium Webdriver知识 【讲师介绍】 资质介绍: 12年以上软件测试工作经验,其中7年以上自动化测试开发经验 新书“Python3+Selenium3自动化测试项目实战”作者
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.csdn.net/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.csdn.net/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、付费专栏及课程。

余额充值