尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

selenium实战记录-base、page、script等-分层思想

selenium实战记录-base、page、script等-分层思想 介绍po模式页面对象模型Page Object Model他的核心思想分层分层页面分为三层包括对象库层、操作层、业务层对象库层封装定位元素的方法。操作层封装对元素的操作。业务层将一个或多个操作组合起来完成一个业务功能。比如登录需要输入帐号、密码、点击登录三个操作几个页面就几个.py文件每个文件都是分三层三个类用例也需要单独存放文件夹编程思想分类归纳scripts脚本、page页面、base页面基类、report报告、pytest.ini配配置文件、utils第三方工具类项目结构样式projectName #项目名称├── base #封装PO基类├── page #封装PO页面对象├── scripts #定义测试用例脚本├── data #存放测试数据├── report #存放生成的测试报告├── log #存放日志文件├── img #存放截图├── config.py#定义项目的配置信息├── utils.py #定义工具类├──pytest.ini #pytest配置文件├── utils.py #定义工具类└──conftest.py #不用写任何代码放在项目的根目录所有测试文件都能读取它日志处理1、定义config文件放入日志初始化函数importloggingimportosfromloggingimporthandlers#获取当前文件路径BaseDiros.path.dirname(__file__)deflog_config():#日志器loggerlogging.getLogger()logger.setLevel(logging.INFO)#处理器c_handlelogging.StreamHandler()c_handle.setLevel(logging.INFO)filenameBaseDir/log/logtest.logf_handlelogging.handlers.TimedRotatingFileHandler(filenamefilename,whenM,interval30,backupCount3)#格式器fmt%(asctime)s %(levelname)s [%(name)s] [%(filename)s(%(funcName)s:%(lineno)d)] - %(message)sformattorlogging.Formatter(fmtfmt)#将格式器添加到处理器f_handle.setFormatter(formattor)c_handle.setFormatter(formattor)#将处理器添加到日志器logger.addHandler(c_handle)logger.addHandler(f_handle)2、日志调用放到base目录下的init文件中importconfig config.log_config()utils1、工具类如web页面建立连接、关闭连接等方法封装定义工具类fromseleniumimportwebdriverimporttime#获取弹出的信息defget_msg():time.sleep(1)returnUtilsDriver.get_driver().find_element_by_css_selector(.el-message).textclassUtilsDriver:_driverNone# 定义一个获取浏览器驱动对象的方法# 表示这个方法是一个类级别的方法,调用不需要实例化classmethoddefget_driver(cls):ifcls._driverisNone:#判断是否为空为空则创建webdriver对象cls._driverwebdriver.Chrome()cls._driver.maximize_window()cls._driver.implicitly_wait(10)returncls._driver# 定义一个退出浏览器驱动对象的方法 浏览器驱动对象退出之后还有一串效的字符串存在classmethoddefquit_driver(cls):ifcls._driverisnotNone:cls._driver.quit()cls._driverNonebase1、封装基础类页面对象类的基类2、包括对象库层、操作类封装通用方法以及类如对象库层封装定位元素方法操作层定义输入文本方法。–通用方法封装fromselenium.webdriver.support.waitimportWebDriverWaitfromutilsimportUtilsDriver#对象库层基类封装classBasePage:def__init__(self):self.driverUtilsDriver.get_driver()defget_element(self,location):waitWebDriverWait(self.driver,10,1)elementwait.until(lambdax:x.find_element(*location))returnelementclassBaseHandle:definput_text(self,element,text):element.clear()element.send_keys(text)page1、页面对象类一个也没一个文件如登陆也没、客户列表页面、客户添加页面等2、三层模式包括对象库层、操作类、业务类通用方法调用base类#后台登陆页面对象fromselenium.webdriver.common.byimportByfrombase.baseimportBasePagefrombase.baseimportBaseHandle#定义对象库层classLoginPage(BasePage):def__init__(self):super().__init__()#继承基类的初始化方法自带驱动#初始化账号密码登陆按钮元素self.enterpriseBy.XPATH,//*[placeholder请输入企业号]self.accountBy.XPATH,//*[placeholder请输入用户名]self.psdBy.XPATH,//*[placeholder请输入密码]self.login_btnBy.CSS_SELECTOR,.el-button#定位企业号、用户名、密码、登陆按钮元素deffind_enterprise(self):returnself.get_element(self.enterprise)deffind_account(self):returnself.get_element(self.account)deffind_psd(self):returnself.get_element(self.psd)deffind_login_btn(self):returnself.get_element(self.login_btn)#定义操作层classLoginHandle(BaseHandle):def__init__(self):self.login_pageLoginPage()#实例化元素对象类#定义账号密码输入框definput_enterprise(self,enterprise):self.input_text(self.login_page.find_enterprise(),enterprise)definput_account(self,account):self.input_text(self.login_page.find_account(),account)definput_psd(self,psd):self.input_text(self.login_page.find_psd(),psd)defclick_login_btn(self):self.login_page.find_login_btn().click()#定义业务层classLoginProxy:#实例化操作层类def__init__(self):self.login_handleLoginHandle()#点击登陆跳转到home页面defgo_home_page(self,enterprise,account,psd):#输入账号密码点击登陆self.login_handle.input_enterprise(enterprise)self.login_handle.input_account(account)self.login_handle.input_psd(psd)self.login_handle.click_login_btn()scripts1、测试脚本测试用例需要导入pytest库第三方工具库等fromutilsimportget_msg,UtilsDriverimportpytest#定义测试类classTestLogin:#初始化。类级别的defsetup_class(self):self.driverUtilsDriver.get_driver()#调用工具类的方法创建web对象self.urlhttps://yxf.xinproptech.com/admin-tenant/#/loginself.driver.get(urlself.url)#刷新,方法级别每次调用方法用例重新刷新页面defsetup(self):self.driver.refresh()#结束销毁类级别统一销毁defteardown_class(self):UtilsDriver.quit_driver()#调用工具类中的关闭webdriver对象#账号为空pytest.mark.lastdeftest_login_01(self):#输入账号self.driver.find_element_by_xpath((//*[classel-input__inner])[1]).send_keys( )self.driver.find_element_by_xpath((//*[classel-input__inner])[2]).send_keys(ydhl)self.driver.find_element_by_xpath((//*[classel-input__inner])[3]).send_keys(ydhl123)#点击登陆self.driver.find_element_by_css_selector(.el-button).click()#获取提示信息msgget_msg()#调用工具类的get_msg方法#断言提示信息是否符合预期assert账号不存在inmsgpytest.ini1、pytest配置文件.ini文件运行命令、html报告配置、失败重试配置等。包括测试脚本路径、测试文件名称、类名称、方法名称等配置[pytest] addopts -s -v -p no:warning --htmlreport/report.html --reruns 1 --capturetee-sys test_paths./scripts test_filestest_*.py test_classesTest* test_functionstest_*conftest.py1、不用写任何代码放在项目的根目录所有测试文件都能读取它。data1、存放测试数据如参数化时使用的测试数据log1、存放日志记录脚本执行过程中产生的日志记录。img1、测试过程中产生的图片如测试过程中遇到bug截图这样可以定位bug。运行1、terminal中输入pytest即可测试报告1、html测试报告
返回列表