底层实现原理(简易版):
代码示例:
1.先封装浏览器,创建单例模式(无论怎样,类里只会创建一个实例对象)
from selenium import webdriver
class Browser(object):
"""单例浏览器的类"""
__instance = None # 实例对象 #原始不存在 #单例模式:确保某一个类只有一个实例存在。即,无论创建多少个实例对象,都是同一个对象。
driver = None # 浏览器driver
def __new__(cls, browser_name, *args, **kwargs):
if cls.__instance is None:
cls.__instance = object.__new__(cls) #创建私有实例对象
# 打开浏览器
if browser_name in ("chrome", "Chrome", "gc", "谷歌"):
cls.driver = webdriver.Chrome() # 驱动在默认的python目录下,也可以实现指定项目的驱动文件
elif browser_name in ("firefox", "ff", "火狐"):
cls.driver = webdriver.Firefox()
else:
raise TypeError(f"你传入的浏览器类型 [ browser_name ] 不受支持")
return cls.__instance
# 关闭浏览器-->并且要结束单例模式
@classmethod
def close_all_browsers(cls):
if cls.driver is not None: # 不是空的时候才关闭,防止多次调用。
cls.driver.quit()
cls.driver = None
cls.__instance = None # 解除单例
2.创建basepage,指定浏览器,封装元素操作和去网页
import time
import allure
from rtest.browser.browser import Browser #导入browser里面的类。
from selenium.webdriver.support.select import Select
class BasePage(object):
"""提供所有页面操作的公共方法-->类似SeleniumLibrary"""
def __init__(self):
"""拿到driver"""
self.instance_browser=Browser("chrome") #创建浏览器实例
self.dr = self.instance_browser.driver #实现driver
def input_text(self, locator, text, clear=True): #两个参数,一个布尔做判断。
"""
定位元素,输入文本
:param locator: 定位器,例如("xpath","//input")、("id","username")
:param text: 输入的文本
:param clear: 默认清空
:return: None
"""
ele = self.dr.find_element(*locator) #因为元素通常是('id','name')这种格式的,localtor是个元组,要解包
if clear is True:
ele.clear()
ele.send_keys(text)
@allure.step("点击按钮")
def click_button(self, locator):
"""点击按钮"""
self.dr.find_element(*locator).click()
@allure.step("断言")
def element_text_should_be(self, locator, expected):
ele = self.dr.find_element(*locator)
assert expected in ele.text
@allure.step("去往一个url地址 {url}")
def goto_location(self,url):
"""去往一个url地址"""
self.dr.get(url)
@allure.step("清空输入框的文本",locotor)
def clear_text(self)
self.dr.find_element(*locotor).clear()
@allure.step("设置隐式等待 {implicitly_wait}")
def set_driver(self,implicitly_wait):
self.dr.maximize_window()
self.dr.implicitly_wait(implicitly_wait)
@allure.step("关闭浏览器")
def close_all_browsers(self):
filename=fr"F:\tester\image\screenshot\{int(time.time())}.png"
self.dr.get_screenshot_as_file(filename)
allure.attach.file(filename,"关闭前截图",attachment_type=allure.attachment_type.PNG)
#allure添加附件(allure.attach) ,语法:allure.attach(body, name, attachment_type, extension),对测试用例、测试步骤以及fixture的结果加以补充。
self.instance_browser.close_all_browsers()#结束单例模式
@allure.step("得到文本消息")
def get_text_info(self,locator):
text=self.dr.find_element(*locator).text
print(text)
@allure.step("点击文本链接")
def click_link_text(self,text):
self.dr.find_element("link text",text).click()
@allure.step("按下拉列表的文本选择")
def select_from_list_by_label(self,locator,lable):
"""
根据参入的lable文本进行下拉列表的选择
:param locator: select 的定位器
:param lable: 根据文本选择
:return: None
"""
Select(self.dr.find_element(*locator)).select_by_visible_text(lable)
@allure step("js查找元素并传入值")
def execute_javascript_date(self,locator,date):
"""执行js脚本"""
self.dr.execute_script('arguments[0].value=arguments[1]',self.dr.find_element(*locator),date)
#js操作ÿ