Selenium基本二次封装

Selenium是一个用于Web应用程序自动化测试工具,可以直接运行在浏览器中,针对页元素来进行定位并模仿人为操作。在进行自动化测试的过程中,我们经常会重复执行很多脚本,语句以及方法,这时,我们可以讲常用的动作封装到一个类中,以便多次调用。

一,把显示等待封装到每一次的元素定位中

# 元素定位
def ElementLocalization(method, locator, Sign=True):
    '''
    :param method: 定位方式
    :param locator: 元素路径
    :param Sign: 定位失败是否跳过(True抛出异常,False跳过)
    '''
    try:         
        return AccordingWait(method, locator)
    except Exception as e:
        if Sign:
            raise e
        else:
            return False

# 显式等待
def AccordingWait(method, locator, total=3, interval=1):
    '''
    :param method: 定位方式
    :param locator: 元素路径
    :param total: 总共等待时间
    :param interval: 等待间隔
    :return: 元素定位路径
    '''
    Ele = WebDriverWait(driver, total, interval).until(
        ec.visibility_of_all_elements_located(
            (method, locator)
        )
    )
    return Ele

#---------测试定位元素---------
#对元素进行定位,超时时间为3秒,等待间隔为1秒,3秒后如果还未定位到元素则抛出异常
ElementLocalization(By.ID,'username')

在web自动化中,网络是影响自动化结果最大的因素。在元素还没加载出来的时候,我们就对元素进行定位通常就会报错,如果中间加上强制等待会大大增加自动化的时间成本,如果每一个地方都加上显示等待又会使代码冗余,并且难于维护,所以把显示等待封装到元素定位中。

二,基于元素定位ElementLocalization()衍生出的封装

#元素点击
def ElementClick(self,method,locator,Sign=True):
    '''
    :param method: 定位方式
    :param locator: 元素路径
    '''
    self.ElementLocalization(method,locator,Sign).click()
        
#输入文本
def ElementInput(self,method,locator,text,Sign=True):
    '''
    :param method: 定位方式
    :param locator: 元素路径
    :param text: 输入文本
    '''
    self.ElementLocalization(method,locator,Sign).send_keys(text)
   
#获取文本
def GetElementText(self,method,locator,Sign=True):
    '''
    :param method: 定位方式
    :param locator: 元素路径
    '''
    text = self.ElementLocalization(method, locator,Sign).text
    return text

三,满足简单web自动化项目的基本封装

# -*- coding:utf-8 -*-

from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec

class basepage(object):

    #构造函数
    def __init__(self,driver,time=3):
        '''
        :param driver: 传入WebDriver
        :param time: 隐式等待时间,默认3秒
        '''
        self.driver = driver
        self.driver.maximize_window()
        self.driver.implicitly_wait(time)

    #访问url
    def AccessUrl(self,url):
        self.driver.get(url)

    # 显式等待
    def AccordingWait(self, method, locator, node, total=3, interval=1):
        '''
        :param method: 定位方式
        :param locator: 元素路径
        :param node: 是否多路径
        :param total: 总共等待时间
        :param interval: 等待间隔
        :return: 元素定位路径
        '''
        if node == 'less':
            Ele = WebDriverWait(self.driver, total, interval).until(
                ec.visibility_of_element_located(
                    (method, locator)
                )
            )
            return Ele
        else:
            Ele = WebDriverWait(self.driver, total, interval).until(
                ec.visibility_of_all_elements_located(
                    (method, locator)
                )
            )
            return Ele

    #元素定位
    def ElementLocalization(self,method,locator,node='less',Sign=True):
        '''
        :param method: 定位方式
        :param locator: 元素路径
        :param Sign: 定位失败是否跳过(True抛出异常,False跳过)
        '''
        try:
            return self.AccordingWait(method,locator,node)
        except Exception as e:
            if Sign:
                raise
            else:
                return False

    #元素点击
    def ElementClick(self,method,locator,node='less',Sign=True):
        '''
        :param method: 定位方式
        :param locator: 元素路径
        '''
        self.ElementLocalization(method,locator,node,Sign).click()

    #输入文本
    def ElementInput(self,method,locator,text,node='less',Sign=True):
        '''
        :param method: 定位方式
        :param locator: 元素路径
        :param text: 输入文本
        '''
        self.ElementLocalization(method,locator,node,Sign).send_keys(text)

    #获取文本
    def GetElementText(self,method,locator,node='less',Sign=True):
        '''
        :param method: 定位方式
        :param locator: 元素路径
        '''
        text = self.ElementLocalization(method, locator,node,Sign).text
        return text

    # 清除文本
    def ClearElementText(self,method,locator,node='less',Sign=True):
        '''
        :param method: 定位方式
        :param locator: 元素路径
        '''
        local = self.ElementLocalization(method, locator,node,Sign)
        local.clear()

    #等待元素消失,消失后返回True
    def ExistenceWaite(self,method,locator,total=3,interval=1):
        '''
        :param method: 定位方式
        :param locator: 元素路径
        :param total: 总共等待时间
        :param interval: 等待间隔
        :return: bool
        '''
        try:
            WebDriverWait(self.driver,total,interval).until_not(
                ec.presence_of_element_located
                    (method,locator)
            )
        except Exception:
            return False
        return True

    #移动游标
    def MoveCursor(self,method,locator):
        '''
        :param method: 定位方式
        :param locator: 元素路径
        '''
        pass

    #切换iframe
    def ChangeFrame(self,num=0):
        '''
        :param num: 默认进入第一次iframe
        '''
        iframe = self.driver.find_elements_by_tag_name('iframe')[num]
        return self.driver.switch_to.frame(iframe)

    #释放iframe
    def ReleaseFrame(self):
        self.driver.switch_to.default_content()

    #判断元素是否存在
    def AreThere(self, method, locator,node='less'):
        '''
        :param method: 定位方式
        :param locator: 元素路径
        :param return: bool
        '''
        Flag = True
        try:
            self.ElementLocalization(method, locator,node)
            return Flag
        except:
            Flag = False
            return Flag

    #页面缩放
    def PageZoom(self,num=0.5):
        '''
        :param num: 缩放比例
        '''
        zoom = "document.body.style.zoom='{}'".format(num)
        self.driver.excute_script(zoom)

    #改变元素标签属性
    def ChangeAttribute(self,method,locator,value,txt,node='less',Sign=True):
        path = self.ElementLocalization(method,locator,node,Sign)
        js = 'arguments[0].{}="{}"'.format(value,txt)
        self.driver.execute_script(js,path)

    #内嵌滚动条滚动
    def DivRolling(self,classname,method='div',direction='left', num=0,num2=0):
        '''
        :param classname: 内嵌div的classname
        :param method: 内嵌windows/div
        :param direction: 滚动条滚动方向
        :param num: 左边距
        :param num2: 上边距
        '''
        try:
            if method == 'div':
                if direction == 'top':
                    js = 'document.getElementsByClassName("{}")[0].scrollTop=' \
                         '{}'.format(classname, num)
                    self.driver.execute_script(js)
                elif direction == 'left':
                    js = 'document.getElementsByClassName("{}")[0].scrollLeft=' \
                         '{}'.format(classname, num)
                    self.driver.execute_script(js)
                else:
                    pass
            if method == 'window':
                js = "window.scrollTo({},{})".format(num, num2)
                return self.driver.execute_script(js)
        except Exception as e:
            raise e

    #获取当前页面URL
    def GetUrl(self):
        return self.driver.current_url

    #切换到新的窗口句柄
    def ChangeHandle(self):
        # 获取当前所有句柄
        handles = self.driver.window_handles
        return self.driver.switch_to_window(handles[-1])

    def  LongitudinalRolling(self,num):
        js = "var q=document.getElementById('id').scrollTop="+num
        self.driver.execute_script(js)

    # 将x,y插入js字符串
    def Change_JS(self,x, y):
        js = "window.scrollTo(,);"
        str_js1 = list(js)
        scrollTo_x = str_js1.index(',')
        str_js1.insert(scrollTo_x, str(x))
        js1 = ''.join(str_js1)
        str_js2 = list(js1)
        scrollTo_y = str_js2.index(')')
        str_js2.insert(scrollTo_y, str(y))
        js2 = ''.join(str_js2)
        return js2

    # 通过坐标(x, y)控制横向和纵向滚动条
    def TransverseRolling(self,x, y):
        js = self.Change_JS(x, y)
        self.driver.execute_script(js)

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Selenium二次封装是指将常用的动作和方法封装到一个类中,以便于在自动化测试中多次调用。常见的二次封装包括将显示等待操作封装到元素定位中。 在二次封装中,我们可以使用显示等待来等待元素的出现,以避免在元素没有加载出来时出现定位错误。封装时,我们可以设置总等待时间和等待间隔,并使用WebDriverWait类的until方法来等待元素的可见性。如果超过指定的等待时间仍然无法定位到元素,可以选择抛出异常或跳过定位错误。 以下是一个示例的封装代码: ``` def ElementLocalization(method, locator, Sign=True): try: return AccordingWait(method, locator) except Exception as e: if Sign: raise e else: return False def AccordingWait(method, locator, total=3, interval=1): Ele = WebDriverWait(driver, total, interval).until( ec.visibility_of_all_elements_located((method, locator)) ) return Ele ``` 在这个示例中,ElementLocalization函数封装了元素定位操作,其中使用了AccordingWait函数来实现显示等待。根据传入的定位方式和路径参数,ElementLocalization函数将使用显示等待来等待元素的可见性,并返回定位到的元素。如果定位失败,并且Sign参数为True,则会抛出异常;否则,将返回False。 使用二次封装后,我们可以直接调用ElementLocalization函数来定位元素,并在定位失败时选择如何处理错误。 请注意,这个示例中的代码只是一种封装方式,实际的封装方式可以根据需求进行调整和扩展。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Selenium基本二次封装](https://blog.csdn.net/weixin_43937682/article/details/122517450)[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^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

帅冒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值