PO模式 - common目录下的basepa_element.py

本文详细介绍了一个基于Selenium的自动化测试框架的封装过程,包括元素等待、查找、操作等功能的封装,以及日志记录、异常处理和截图保存的实现。

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

先来看看common有哪些东西
在这里插入图片描述
basepage_element.py和basepage_elements.py 封装的是关键字驱动,一个是单一的页面元素,一个是多个页面元素的情况下
config.py 用来判断环境
contants.py 读取目录结构
log.py 封装日志文件
uploding.py 封装页面文件上传

basepage(无关业务):关键字封装。等待、查找元素、点击、输入、获取 文本、获取 属性、窗口切换、iframe切换、上传、select
元素的操作:等待、查找、操作。
实现了:页面当中的每一个操作,都进行了异常捕获、失败截图、操作时间。
现在就来封装一个basepage文件

导入包:根据自己的需求来定

from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
import datetime
from PO.Common.log import MyLog
from PO.Common.contants import Open
from PO.Common.uploading import upload

然后命名,先把显性等待和页面截图操作,写出来。只有当执行失败的时候,才进行截图操作。

class BasePage:
    def __init__(self, driver):
        self.driver = driver
        '''
        loc:定位参数输入
        img_doc:截图名字
        timeout:显性等待的时长
        frequency:显示等待的间隔
        path:文件上传的路径
        '''
    # 等待时间
    def wait_eleVisble(self, loc, img_doc="", timeout=30, frequency=0.5):
        MyLog ().info ("等待元素可见:{}".format (loc))
        try:
            # 开始时间
            start = datetime.datetime.now ()
            WebDriverWait (self.driver, timeout, frequency).until (EC.visibility_of_element_located (loc))
            # 结束时间
            end = datetime.datetime.now ()
            MyLog ().info ("开始等待时间:{},等待结束时间:{},共等待:{}".format (start, end, end - start))
        except:
            MyLog ().info ("等待时间失效")
            # 截图
            self.save_web_screenshot (img_doc)
            raise
    # 网页截图
    def save_web_screenshot(self, img_doc):

        now = time.strftime ('%Y-%m-%d %H-%M')
        filename = ("{}_{}.png".format (img_doc, now))

        try:
            self.driver.save_screenshot (Open.screenshots () + '/' + filename)
            MyLog ().info ("网页截图成功,保存在:{}".format (Open.screenshots () + r'/' + filename))
        except:
            MyLog ().info ("请检查你定位是否正确")
            raise

然后加入查找元素,和点击操作

from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
import datetime
from PO.Common.log import MyLog
from PO.Common.contants import Open
from PO.Common.uploading import upload

class BasePage:
    def __init__(self, driver):
        self.driver = driver
        '''
        loc:定位参数输入
        img_doc:截图名字
        timeout:显性等待的时长
        frequency:显示等待的间隔
        path:文件上传的路径
        '''


    # 等待时间
    def wait_eleVisble(self, loc, img_doc="", timeout=30, frequency=0.5):
        MyLog ().info ("等待元素可见:{}".format (loc))
        try:
            # 开始时间
            start = datetime.datetime.now ()
            WebDriverWait (self.driver, timeout, frequency).until (EC.visibility_of_element_located (loc))
            # 结束时间
            end = datetime.datetime.now ()
            MyLog ().info ("开始等待时间:{},等待结束时间:{},共等待:{}".format (start, end, end - start))
        except:
            MyLog ().info ("等待时间失效")
            # 截图
            self.save_web_screenshot (img_doc)
            raise

    # 查找一个元素
    def get_element(self, loc, img_doc=""):
        MyLog().info ("定位的元素:{}".format (loc))
        try:
            return self.driver.find_element (*loc)
        except:
            MyLog ().warning ("查找元素失败")
            # 截图
            self.save_web_screenshot (img_doc)
            raise
    # 点击元素
    def click_element(self, loc, img_doc=""):
        # 等待元素,查找元素,点击元素
        self.wait_eleVisble (loc, img_doc)
        ele = self.get_element (loc, img_doc)
        MyLog().info ("要点击的元素:{}".format (loc))
        try:
            ele.click ()
        except:
            MyLog().warning ("点击元素失败")
            self.save_web_screenshot (img_doc)
            raise
    # 网页截图
    def save_web_screenshot(self, img_doc):

        now = time.strftime ('%Y-%m-%d %H-%M')
        filename = ("{}_{}.png".format (img_doc, now))
        try:
           self.driver.save_screenshot (Open.screenshots () + '/' + filename)
            MyLog ().info ("网页截图成功,保存在:{}".format (Open.screenshots () + r'/' + filename))
        except:
            MyLog ().info ("请检查你定位是否正确")
            raise

可以根据自己的场景需要,进行封装,我现在暂时用到的是获取文本值、输入文本操作,文件上传,点击操作
整体代码:

from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
import datetime
from PO.Common.log import MyLog
from PO.Common.contants import Open
from PO.Common.uploading import upload




class BasePage:
    def __init__(self, driver):
        self.driver = driver
        '''
        loc:定位参数输入
        img_doc:截图名字
        timeout:显性等待的时长
        frequency:显示等待的间隔
        path:文件上传的路径
        '''


    # 等待时间
    def wait_eleVisble(self, loc, img_doc="", timeout=30, frequency=0.5):
        MyLog ().info ("等待元素可见:{}".format (loc))
        try:
            # 开始时间
            start = datetime.datetime.now ()
            WebDriverWait(self.driver,timeout,frequency).until(EC.visibility_of_element_located (loc))
            # 结束时间
            end = datetime.datetime.now ()
            MyLog ().info ("开始等待时间:{},等待结束时间:{},共等待:{}".format (start, end, end - start))
        except:
            MyLog ().info ("等待时间失效")
            # 截图
            self.save_web_screenshot (img_doc)
            raise

    # 查找一个元素
    def get_element(self, loc, img_doc=""):
        MyLog().info ("定位的元素:{}".format (loc))
        try:
            return self.driver.find_element (*loc)
        except:
            MyLog ().warning ("查找元素失败")
            # 截图
            self.save_web_screenshot (img_doc)
            raise
    # 点击元素
    def click_element(self, loc, img_doc=""):
        # 等待元素,查找元素,点击元素
        self.wait_eleVisble (loc, img_doc)
        ele = self.get_element (loc, img_doc)
        MyLog().info ("要点击的元素:{}".format (loc))
        try:
            ele.click ()
        except:
            MyLog().warning ("点击元素失败")
            self.save_web_screenshot (img_doc)
            raise
    #输入文本操作
    def text_input_element(self,loc,img_doc="",*args):
        self.wait_eleVisble (loc, img_doc)
        ele = self.get_element (loc, img_doc)
        MyLog().info ("文本输入:{}".format (args))
        try:
            ele.clear()
            ele.send_keys(args)
        except:
            MyLog().warning ("输入文本值失败")
            self.save_web_screenshot (img_doc)
            raise
    #获取文值
    def text_element(self,loc,img_doc=""):
        self.wait_eleVisble(loc,img_doc)
        ele =self.get_element(loc,img_doc)
        try:
            text = ele.text
            MyLog ().info ("元素:{}获取的文本值是:{}".format (loc, text))
            return text
        except:
            MyLog().warning("获取文本值失败")
            self.save_web_screenshot(img_doc)
            raise

    #文件上传
    def files_upload_element(self,path,img_doc=""):
        try:
            time.sleep(3)
            upload(path)
            time.sleep(2)
        except:
            MyLog().warning("文件路径错误")
            self.save_web_screenshot(img_doc)
            raise

    # 网页截图
    def save_web_screenshot(self, img_doc):
        now = time.strftime ('%Y-%m-%d %H-%M')
        filename = ("{}_{}.png".format (img_doc, now))
        try:
            self.driver.save_screenshot (Open.screenshots () + '/' + filename)
            MyLog ().info ("网页截图成功,保存在:{}".format (Open.screenshots () + r'/' + filename))
        except:
            MyLog ().info ("请检查你定位是否正确")
            raise

怎么调用?很简单,好处:我们这么一写,别人就不知道我们在干嘛了,只知道这个东西能做点击操作,却没发现我们里面还有等待、点击、查找、日志、截图等操作。
也节约了每次写重复代码,比如要重复写显性等待,重复写find_xxx.click()操作。

from selenium import webdriver
from selenium.webdriver.common.by import By
from PO.Common.basepage_element import BasePage

driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
BasePage(driver).click_element((By.XPATH,'//div[@id="u1"]//a[@name="tj_settingicon"]'),'百度点击设置')
import unittest from time import sleep from selenium.webdriver.support import expected_conditions as EC from selenium import webdriver from selenium.common.exceptions import TimeoutException from selenium.webdriver.common.by import By # 导入元素定位模块 from selenium.webdriver.support.wait import WebDriverWait from unittestreport import ddt,yaml_data from config.congfig import Host, PATH from public.yzm import handle_captcha @ddt class Login(unittest.TestCase): def setUp(self): self.browser = webdriver.Edge() self.browser.maximize_window() self.browser.implicitly_wait(10) self.browser.get(Host) def tearDown(self): self.browser.quit() @yaml_data(PATH + r'\data\login.yaml') def test_login(self, data): global res self.browser.find_element(By.XPATH, '//*[@id="app"]/div/div[2]/div/form/div[1]/div/div/input').send_keys(data['name']) self.browser.find_element(By.XPATH, '//*[@id="app"]/div/div[2]/div/form/div[2]/div/div/input').send_keys(data['pwd']) # 调用验证码方法 if data['type']== "yzm_error" or data['type']=="yzm_null": self.browser.find_element(By.XPATH, '//*[@id="app"]/div/div[2]/div/form/div[3]/div/div[1]/input').send_keys(data['yzm']) else: handle_captcha(self.browser) self.browser.find_element(By.XPATH, '//*[@id="app"]/div/div[2]/div/form/button').click() try: if data['type']== "pass": res = self.browser.find_element(By.XPATH, '//*[@id="breadcrumb-container"]/span/span[1]/span[1]/a').text elif data['type']== "error": try: # 等待元素可见(最大10秒,轮询间隔0.5秒) error_element = WebDriverWait(self.browser, 10, 0.5).until( EC.visibility_of_element_located((By.CSS_SELECTOR, "div.el-message--error")) ) res = error_element.text except TimeoutException: print("错误弹框未出现,已超时") res = None # 或自定义超时处理 # res = self.browser.find_element(By.CSS_SELECTOR, 'div.el-message--error').text elif data['type']== "yzm_error": try: # 等待元素可见(最大10秒,轮询间隔0.5秒) error_element = WebDriverWait(self.browser, 10, 0.5).until( EC.visibility_of_element_located((By.CSS_SELECTOR, "div.el-message--error")) ) res = error_element.text except TimeoutException: print("错误弹框未出现,已超时") res = None # 或自定义超时处理 # res = self.browser.find_element(By.CSS_SELECTOR, 'div.el-message--error').text elif data['type']== "user_null": res = self.browser.find_element(By.XPATH,'//*[@id="app"]/div/div[2]/div/form/div[1]/div/div[2]').text elif data['type']== "pwd_null": res = self.browser.find_element(By.XPATH,'//*[@id="app"]/div/div[2]/div/form/div[2]/div/div[2]').text elif data['type']== "yzm_null": sleep(2) res = self.browser.find_element(By.XPATH,'//*[@id="app"]/div/div[2]/div/form/div[3]/div/div[3]').text except: res = self.browser.switch_to.alert.text print(res) self.assertIn(data['expected'], res) #选择版本管理 # driver.find_element(By.XPATH, '//*[@id="app"]/div/div[1]/div[2]/div[1]/div/ul/div[6]/li/div/span').click() # driver.find_element(By.XPATH, '//*[@id="app"]/div/div[1]/div[2]/div[1]/div/ul/div[6]/li/ul/div[1]/a/li').click() # # 选择版本名称 # sleep(1) # driver.find_element(By.CLASS_NAME,'el-input__inner').click() # # 通过value值选择选项 (选择版本名称) # # s.select_by_value('版本名称') # sleep(3) # driver.find_element(By.XPATH, '//div[3]/div[1]/div[1]/ul/li[2]').click() # #输入查询 # driver.find_element(By.XPATH, '//*[@id="app"]/div/div[2]/section/div/div[1]/div/input').send_keys('200') # driver.find_element(By.XPATH, '//*[@id="app"]/div/div[2]/section/div/div[1]/div/div[2]/button').click() 在不改变效果的情况下,优化一下代码
06-28
import unittest from time import sleep from selenium.webdriver import Keys from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By from unittestreport import ddt, yaml_data from config.congfig import Host, PATH from page.login import login @ddt class Sim(unittest.TestCase): def setUp(self): """测试环境初始化""" self.browser = login() self.browser.get(Host) def tearDown(self): """资源清理""" self.browser.quit() @yaml_data(PATH + r'\data\sim.yaml') def test_sim(self, data): # 选择sim管理模块 global result self.browser.find_element(By.XPATH, '//*[@id="app"]/div/div[1]/div[2]/div[1]/div/ul/div[3]/li/div').click() self.browser.find_element(By.XPATH, '//*[@id="app"]/div/div[1]/div[2]/div[1]/div/ul/div[3]/li/ul/div[1]/a/li').click() sleep(5) self.browser.find_element(By.XPATH, '//*[@id="app"]/div/div[2]/section/div/div[2]/div/form/div[1]/div/div/input').send_keys( data['SN']) self.browser.find_element(By.XPATH, '//*[@id="app"]/div/div[2]/section/div/div[2]/div/form/div[4]/div/div/input').send_keys( data['IMSI']) self.browser.find_element(By.XPATH, '//*[@id="app"]/div/div[2]/section/div/div[2]/div/form/div[2]/div/div/input').send_keys( data['ICCID']) # 点击查询 self.browser.find_element(By.XPATH, '//*[@id="app"]/div/div[2]/section/div/div[2]/div/form/div[5]/div/button/span').click() sleep(6) # 获取结果信息 if data['type'] == "pass": result = self.browser.find_element(By.XPATH, '//*[@id="app"]/div/div[2]/section/div/div[5]/div/span[1]').text elif data['type'] == "sz": result = self.browser.find_element(By.XPATH, '//*[@id="app"]/div/div[2]/section/div/div[4]/div[3]/table/tbody/tr[1]/td[4]/div').text elif data['type'] == "error": result = self.browser.find_element(By.XPATH, '//*[@id="app"]/div/div[2]/section/div/div[4]/div[3]/div/span').text elif data['type'] == "syy": self.browser.find_element(By.XPATH, '//*[@id="app"]/div/div[2]/section/div/div[5]/div/button[1]').click() # 定位输入框 input_element = WebDriverWait(self.browser, 10).until( EC.presence_of_element_located( (By.CSS_SELECTOR, 'div.el-pagination__editor input.el-input__inner') ) ) # 等待分页加载完成(根据实际页面元素调整) WebDriverWait(self.browser, 10).until( EC.presence_of_element_located((By.CSS_SELECTOR, '.el-table__body')) ) # 通过 JS 获取输入框的值 result = self.browser.execute_script( "return arguments[0].value", input_element ) elif data['type'] == "xyy": self.browser.find_element(By.XPATH, '//*[@id="app"]/div/div[2]/section/div/div[5]/div/button[2]/i').click() # 定位输入框 input_element = WebDriverWait(self.browser, 10).until( EC.presence_of_element_located( (By.CSS_SELECTOR, 'div.el-pagination__editor input.el-input__inner') ) ) # 等待分页加载完成(根据实际页面元素调整) WebDriverWait(self.browser, 10).until( EC.presence_of_element_located((By.CSS_SELECTOR, '.el-table__body')) ) # 通过 JS 获取输入框的值 result = self.browser.execute_script( "return arguments[0].value", input_element ) elif data['type'] == "ymxz": self.browser.find_element(By.XPATH, '//*[@id="app"]/div/div[2]/section/div/div[5]/div/ul/li[3]').click() # 定位输入框 input_element = WebDriverWait(self.browser, 10).until( EC.presence_of_element_located( (By.CSS_SELECTOR, 'div.el-pagination__editor input.el-input__inner') ) ) # 等待分页加载完成(根据实际页面元素调整) WebDriverWait(self.browser, 10).until( EC.presence_of_element_located((By.CSS_SELECTOR, '.el-table__body')) ) # 通过 JS 获取输入框的值 result = self.browser.execute_script( "return arguments[0].value", input_element ) elif data['type'] == "ymsr": try: # 定位输入框 input_element = WebDriverWait(self.browser, 10).until( EC.presence_of_element_located( (By.CSS_SELECTOR, 'div.el-pagination__editor input.el-input__inner') ) ) input_element.send_keys(data['yema']) input_element.send_keys(Keys.RETURN) # 等待分页加载完成(根据实际页面元素调整) WebDriverWait(self.browser, 10).until( EC.presence_of_element_located((By.CSS_SELECTOR, '.el-table__body')) ) # 通过 JS 获取输入框的值 result = self.browser.execute_script( "return arguments[0].value", input_element ) except Exception as e: print(f"操作失败: {e}") self.browser.save_screenshot("error_screenshot.png") # 断言验证 self.assertIn(data['expected'], result, f"断言失败: 预期包含 '{data['expected']}',实际为 '{result}'uoyuo优化·一下代码
最新发布
07-01
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值