Python_Selenium之basepage 识别元素、浏览器操作、获取属性、鼠标事件、键盘事件、弹窗、切换frame、切换句柄等封装
阅读原文时间:2023年07月11日阅读:1

#coding=gbk
import os
import time
from selenium import webdriver
from selenium.webdriver.common.by import By #导入by方法
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains ##对鼠标事件操作
from selenium.webdriver.common.keys import Keys # 对键盘事件操作
from common import HTMLTestReportCN #测试报告
from common.log_utils import logger
from common.config_utils import config

class BasePage(object):
def __init__(self,driver):
self.driver=driver

# ------ -------------------------------------浏览器操作封装----------------------------------------------#  
#打开网页  
def open\_url(self,url):  
    self.driver.get(url)  
    logger.info('打开URL地址%s;'%url)  

def set\_browser\_max(self):  
    self.driver.maximize\_window()  
    logger.info("设置浏览器的最大化")  

def close\_tab(self):  
    self.driver.close()  
    logger.info('关闭当前的tab页签')  

def set\_brower\_min(self):  
    self.driver.minimize\_window()  
    logger.info("设置浏览器的最小化")  

def brower\_refresh(self):  
    self.driver.refresh()  
    logger.info("浏览器的刷新操作")  

def get\_title(self):  
    value=self.driver.title  
    logger.info("获取网页的标题为:%s"%value)  
    return value  

def quit\_brower(self):  
    self.driver.quit()  
    logger.info("关闭浏览器")  

# ------ ------------------------------------- 等待封装---------------------------------------------------#  
#测试OK  
def implicitly\_wait(self,seconds=config.get\_timeout):  
    self.driver.implicitly\_wait(seconds)  

def wait(self,seconds=config.get\_timeout):  
    time.sleep(seconds)  

# ------ ------------------------------------- 元素识别的封装----------------------------------------------#  
def find\_element(self,element\_info):  
    try:  
        locator\_type\_name=element\_info\['locator\_type'\]  
        locator\_value\_info=element\_info\['locator\_value'\]  
        locator\_timeout=element\_info\['timeout'\]  
        if locator\_type\_name =='id':  
            locator\_type=By.ID  
        elif locator\_type\_name=='class':  
            locator\_type=By.CLASS\_NAME  
        elif locator\_type\_name=='xpath':  
            locator\_type=By.XPATH  
        #  识别元素  
        element=WebDriverWait(self.driver,locator\_timeout)\\  
            .until(lambda x:x.find\_element(locator\_type,locator\_value\_info))  
        logger.info('\[%s\]元素识别成功'%element\_info\['element\_name'\])  
    except Exception as e:  
        logger.error('\[%s\]元素不能识别,原因是%s' % (element\_info\['element\_name'\], e.\_\_str\_\_()))  
        self.screenshot\_as\_file()   #  失败后截屏  
    return element  

# ------ -------------------------------------获取属性封装----------------------------------------------#  
#获取元素属性封装-测试OK  
def get\_element\_attribute(self,element\_info,attribute\_name):  
    element=self.find\_element(element\_info)  
    value=element.get\_attribute(attribute\_name)  
    logger.info('\[%s\]元素的%s的值为:%s'%(element\_info\['element\_name'\],attribute\_name,value))  
    return  value  

#获取元素text属性封装-测试OK  
def get\_text(self,element\_info):  
    text=self.find\_element(element\_info).text  
    logger.info('\[%s\]元素的text值为:%s'%(element\_info\['element\_name'\],text))  
    return  text  

#------ ------------------------------------- 鼠标事件封装----------------------------------------------#  
#元素鼠标操作封装:-测试OK  
def click(self,element\_info):  
    element=self.find\_element(element\_info)  
    logger.info('\[%s\]元素进行点击操作'%element\_info\['element\_name'\])  
    element.click()  

#元素鼠标操作:右击-测试OK  
def context\_click(self,element\_info):  
    mouse = ActionChains(self.driver)  
    element = self.find\_element(element\_info)  
    logger.info('\[%s\]元素进行右击操作' % element\_info\['element\_name'\])  
    mouse.context\_click(element).perform()  

#元素鼠标操作:移动到该元素上--测试OK  
def move\_to\_element\_by\_mouse(self,element\_info):  
    element = self.find\_element(element\_info)  
    mouse = ActionChains(self.driver)  
    logger.info('将鼠标移动到\[%s\]元素上' % element\_info\['element\_name'\])  
    mouse.move\_to\_element(element).perform()  

def long\_press\_element(self,element\_info,senconds):  
    element = self.find\_element(element\_info)  
    logger.info('将鼠标长按到\[%s\]元素上后松开' % element\_info\['element\_name'\])  
    mouse = ActionChains(self.driver)  
    mouse.click\_and\_hold(element).pause(senconds).release(element)  

def scrollIntoView(self,element\_info):  
    element=self.find\_element(element\_info)  
    logger.info('将滚动条滚动至\[%s\]元素可见'%element\_info\['element\_name'\])  
    self.driver.execute\_script('arguments\[0\].scrollIntoView();', element)  
    time.sleep(1)  

# ------ ------------------------------------- 键盘事件封装-------------------------------------------#  
# #键盘事件操作封装:输入内容--OK  
def input(self,element\_info,content):  
    element=self.find\_element(element\_info)  
    element.send\_keys(content)  
    logger.info('\[%s\]元素输入内容:%s'%(element\_info\['element\_name'\],content))  

#删除内容-测试OK  
def back\_space(self,element\_info):  
    element=self.find\_element(element\_info)  
    logger.info('\[%s\]元素操作back\_space' % (element\_info\['element\_name'\]))  
    element.send\_keys(Keys.BACK\_SPACE)  

#清空内容--测试OK  
def clear\_input(self,element\_info):  
    element=self.find\_element(element\_info)  
    logger.info('\[%s\]元素输入框操作清空' % (element\_info\['element\_name'\]))  
    element.clear()  

#按回车--测试OK  
def enter(self,element\_info):  
    element=self.find\_element(element\_info)  
    logger.info('\[%s\]元素进行回车键操作' % (element\_info\['element\_name'\]))  
    element.send\_keys(Keys.ENTER)  

#全选  Ctrl+a--测试OK  
def ctrl\_a(self,element\_info):  
    element=self.find\_element(element\_info)  
    logger.info('\[%s\]元素输入框内容进行全选操作' % (element\_info\['element\_name'\]))  
    element.send\_keys(Keys.CONTROL, 'a')  

#粘贴 Ctrl +x--测试OK  
def ctrl\_x(self,element\_info):  
    element=self.find\_element(element\_info)  
    logger.info('\[%s\]元素输入框内容进行剪切操作' % (element\_info\['element\_name'\]))  
    element.send\_keys(Keys.CONTROL, 'x')  

#粘贴 Ctrl +v--测试OK  
def ctrl\_v(self,element\_info):  
    element=self.find\_element(element\_info)  
    logger.info('\[%s\]元素输入框内容进行粘贴操作' % (element\_info\['element\_name'\]))  
    element.send\_keys(Keys.CONTROL, 'v')  

# ------ ------------------------------------- 弹窗封装----------------------------------------------#  
#弹窗处理封装-测试OK  
def get\_alert\_content(self,action='accept',timeout=config.get\_timeout):  
    WebDriverWait(self.driver, timeout).until(EC.alert\_is\_present())  
    alter = self.driver.switch\_to.alert  
    value = alter.text  
    logger.info('当前弹窗的内容为:%s' % value)  
    if action == 'accept':  
        alter.accept()  
    elif action == 'dismiss':  
        alter.dismiss()  
    return value  

# ------ -------------------------------------frame封装-----------------------------------------------#  
#frame封装frame == > id/name   frame元素对象  
#思路一  
def switch\_to\_frame(self,element\_info):  
    element = self.find\_element(element\_info)  
    self.driver.switch\_to.frame(element)  
    logger.info('\[%s\]frame元素切换成功' %(element\_info\["element\_name"\]))  

#思路二  
def switch\_to\_frame\_id\_or\_name(self,id\_or\_name):  
    self.driver.switch\_to.frame(id\_or\_name)  
def switch\_to\_frame\_by\_element(self,element\_info):  
    element = self.find\_element(element\_info)  
    self.driver.switch\_to.frame(element)  
    logger.info('\[%s\]frame元素切换成功' % (element\_info\["element\_name"\]))  

#------------------------------------selenium执行js封装-----------------------------------------------#  
def execute\_script(self,js\_str,element\_info=None):  
    if element\_info:  
        self.driver.execute\_script(js\_str)  
    else:  
        self.driver.execute\_script(js\_str,None)  

def delete\_element\_attribute(self,element\_info,attribute\_name):  
    element = self.find\_element(element\_info)  
    self.driver.execute\_script('arguments\[0\].removeAttribute("%s");'%attribute\_name,element)  

def update\_element\_attribute(self, element\_info, attribute\_name,attribute\_value):  
    element = self.find\_element(element\_info)  
    self.driver.execute\_script('arguments\[0\].setAttribute("%s","%s");' %(attribute\_name,attribute\_value), element)  

# ------ -------------------------------------切换句柄封装-------------------------------------------#  
##方式一--测试OK  
def switch\_window\_by\_title(self,title):  
    for handle in self.driver.window\_handles:  
        self.driver.switch\_to.window(handle)  
        if self.driver.title.\_\_contains\_\_(title):  
            break  
    logger.info('切换到网页标题为\[%s\]的句柄成功!'%title)  

#方式二--测试OK  
def switch\_window\_by\_url(self,url):  
    for handle in self.driver.window\_handles:  
        self.driver.switch\_to.window(handle)  
        if self.driver.current\_url.\_\_contains\_\_(url):  
            break  
    logger.info('切换到URL为\[%s\]的句柄成功!' % url)  

#----------------------------截图封装----------------------------------------------------------#  
#测试OK  
# def screenshot\_as\_file\_old(self, \*screenshot\_path):  
#     current\_dir = os.path.dirname(\_\_file\_\_)  
#     if len(screenshot\_path) == 0:  
#         screenshot\_filepath = config.screenshot\_path  
#     else:  
#         screenshot\_filepath = screenshot\_path\[0\]  
#     now = time.strftime('%Y\_%m\_%d\_%H\_%M\_%S')  
#     screenshot\_filepath\_finally = os.path.join(current\_dir, '../' ,screenshot\_filepath, 'UITest\_%s.png' % now)  
#     self.driver.get\_screenshot\_as\_file(screenshot\_filepath\_finally)  
#     logger.info('图片截取成功')  

#如果要在测试报告中截图,需要使用这个截图封装  
def screenshot\_as\_file(self):  
    report\_path = os.path.join( os.path.abspath(os.path.dirname(\_\_file\_\_)) , '..', config.report\_path)  
    report\_dir = HTMLTestReportCN.ReportDirectory(report\_path)  
    report\_dir.get\_screenshot( self.driver )