selenium + python 完整自动化测试脚本及讲解(五、element_control包介绍)

selenium + python 完整自动化测试脚本及讲解(五、element_control包介绍)

  

编写不易,求关注!!!

在这里插入图片描述

简介

element_control 主要功能是对元素的基本操作,比如点击,输入数据等!
在这里插入图片描述

文件名介绍
ELEMETN_TOOLS_ACTIONS封装元素操作特殊的工具方法
ELEMETN_TOOLS_LOCATION封装元素定位特殊的工具方法
element_Test_Login用来测试,也是调用上面两个方法的

备注: 这只是一个框架,不是真正的测试代码!给写测试用例的时候提供一个方便。

ELEMETN_TOOLS_ACTIONS 文件

这个文件里面主要包括了根据元素对象进行基本操作,其中元素表功我还没写出来,后续我会添加的

# -*- coding: utf-8 -*-
from selenium.webdriver.common.by import By
from selenium.webdriver.remote.webelement import WebElement
from selenium.webdriver.remote.webdriver import WebDriver

from element_control.ELEMETN_TOOLS_LOCATION import *
from utils.SENDKYES import *
from utils.PROPERTIES_TOOLS import getProperties
from selenium.webdriver.support.ui import Select

import os


# 文本框
from utils.UPLOAD_FILE_TOOLS import UpLoad_File_autoIT, UpLoad_File_SENDKEYS, UpLoad_File_win32api


def ACTIONS_send_keys(driver: WebDriver, Parameter_By, Parameter_Value, keys: str):
    """
    通过 Parameter_By, Parameter_Value 定位元素,并将 keys 的值发送到 元素中!
    :param driver: WebDriver
    :param Parameter_By:  selenium.webdriver.common.by.By 对象的枚举类型
    :param Parameter_Value: 定位元素的条件。
    :param keys: 要输入字符
    :return: 无
    """
    # 获取一个 可以输入文字的对象
    ele = get_element_Send_keysAble(driver, Parameter_By, Parameter_Value)
    #
    ACTIONS_send_keys_ele(ele, keys)
    pass


def ACTIONS_send_keys_ele(ele: WebElement, keys: str):
    """
    将 keys 的值发送到 ele元素中!
    :param ele: WebElement
    :param keys: 要输入字符
    :return: 无
    """
    # 判断元素是否有效,TODO 使用js有效化对象
    if ACTIONS_to_displayed(ele):
        ele.clear()
        ele.send_keys(keys)


# 点击
def ACTIONS_click(driver: WebDriver, Parameter_By: str, Parameter_Value: str):
    """
    通过 Parameter_By, Parameter_Value 定位元素,并将 点击 元素中!
    :param driver: WebDriver
    :param Parameter_By:  selenium.webdriver.common.by.By 对象的枚举类型
    :param Parameter_Value: 定位元素的条件。
    :return: 无
    """
    click_ele = get_element_clickable(driver, Parameter_By, Parameter_Value)
    ACTIONS_click_ele(click_ele)
    pass


def ACTIONS_click_ele(ele: WebElement):
    if ACTIONS_to_displayed(ele):
        ele.click()
    pass


# 上传文件
def ACTIONS_UpLoad_File_autoIT(driver: WebDriver, Parameter_By: str, Parameter_Value: str, file_path):
    # 第三方插件实现文件上传
    file_ele = get_element_time(driver, Parameter_By, Parameter_Value)
    UpLoad_File_autoIT(file_ele, file_path)
    pass


# 上传文件
def ACTIONS_UpLoad_File_SENDKEYS(driver: WebDriver, Parameter_By: str, Parameter_Value: str, file_path):
    file_ele = get_element_time(driver, Parameter_By, Parameter_Value)
    UpLoad_File_SENDKEYS(driver, file_ele, file_path)
    pass


# 上传文件
def ACTIONS_UpLoad_File_win32api(driver: WebDriver, Parameter_By: str, Parameter_Value: str, file_path):
    file_ele = get_element_time(driver, Parameter_By, Parameter_Value)
    UpLoad_File_win32api(file_ele, file_path)
    pass


# 复选框
def ACTIONS_Checkbox(driver: WebDriver, Parameter_By: str, Parameter_Value: str, Checkboxs_Opt=None):
    """
    通过 Parameter_By, Parameter_Value 获取所有复选框按钮对象。
    通过 Checkboxs_Opt 数组进行点击,数组中0代表不选择,其他代表选中。
    如果Checkboxs_Opt 长度 大于 页面中对象的长度,则超过的做操作,
    如果Checkboxs_Opt 长度 小于 页面中对象的长度,默认追加 0 不选择
    :param driver: webDriver 对象
    :param Parameter_By: selenium 中的By对象
    :param Parameter_Value: selenium 元素定位信息
    :param Checkboxs_Opt: 数组:1代表选中,0代表不选择
    :return: 无
    use template
        ACTIONS_Checkbox(driver, By.XPATH, u"//form//input[@name='Checkbox' and @type='checkbox']", [1, 1, 1, 1])
    """
    Checkboxs = get_elements(driver, Parameter_By, Parameter_Value)
    ACTIONS_Checkbox_ele(Checkboxs, Checkboxs_Opt)


def ACTIONS_Checkbox_ele(Checkboxs, Checkboxs_Opt=None):
    if Checkboxs_Opt is None:
        Checkboxs_Opt = [1]
    # 通过 Parameter_By, Parameter_Value 获取所有复选框按钮对象。
    # 如果Checkboxs_Opt 长度 小于 页面中对象的长度,默认追加 0 不选择
    if len(Checkboxs_Opt) < len(Checkboxs):
        x = len(Checkboxs) - len(Checkboxs_Opt)
        for i in range(x):
            Checkboxs_Opt.append(0)
    # 通过 Checkboxs_Opt 数组进行点击,数组中0代表不选择,其他代表选中。
    for i in range(len(Checkboxs)):
        Checkbox = Checkboxs[i]
        if Checkboxs_Opt[i] == 0:
            if Checkbox.is_selected():
                Checkbox.click()
        else:
            if not Checkbox.is_selected():
                Checkbox.click()


# 单选框
def ACTIONS_Radio(driver: WebDriver, Parameter_By: str, Parameter_Value: str, Radios_Opt=1):
    """
    通过 Parameter_By, Parameter_Value 获取所有按钮对象。
    :param driver: webDriver 对象
    :param Parameter_By: selenium 中的By对象
    :param Parameter_Value: selenium 元素定位信息
    :param Radios_Opt: 要选中的元素     如果这个数字 大于 单选按钮个数,则选择最后一个。
                                        如果这个数字 小于 1,则选择第一个。
    :return: 无
    """
    Radioxs = get_elements(driver, Parameter_By, Parameter_Value)
    ACTIONS_Radio_ele(Radioxs,Radios_Opt)


def ACTIONS_Radio_ele(Radioxs, Radios_Opt):
    if Radios_Opt > len(Radioxs) - 1:
        Radios_Opt = len(Radioxs) - 1
    elif Radios_Opt < 0:
        Radios_Opt = 0
    Radioxs[Radios_Opt].click()


# 下拉框
def ACTIONS_Select_Text(driver: WebDriver, Parameter_By: str, Parameter_Value: str, text):
    select_tag = get_element_time(driver, Parameter_By, Parameter_Value)
    ACTIONS_Select_Text_ele(driver, select_tag, text)


def ACTIONS_Select_Text_ele(driver: WebDriver, select_tag, text):

    if select_tag.tag_name.lower() == "select":
        # 等待时间调短,即便是没有元素也不用等待时间太久
        try:
            driver.implicitly_wait(3)
            Select(select_tag).select_by_value(text)
            set_Driver_implicitly_wait(driver)
            # 如果Select中没有text的选项 自动选择第二个元素
        except Exception:
            ACTIONS_Select_Index_ele(select_tag, 2)
    else:
        select_tag.click()
        ACTIONS_click_ele(select_tag)


# 下拉框
def ACTIONS_Select_Index(driver: WebDriver, Parameter_By: str, Parameter_Value: str, index):
    select_tag = get_element_time(driver, Parameter_By, Parameter_Value)
    ACTIONS_Select_Index_ele(select_tag, index)


def ACTIONS_Select_Index_ele(select_tag, index):
    if select_tag.tag_name.lower() == "select":
        if len(Select(select_tag).options) < index:
            index = len(Select(select_tag).options) - 1
        Select(select_tag).select_by_index(index)
    else:
        select_tag.click()
        sendKeys_ON(40, index)  # 40 = 键盘↓键
        sendKeys_ON(13)  # 13 = 回车键


# 截图
def ACTIONS_screenshot(driver: WebDriver, file_outPut_Name: str = None, file_outPut_Path: str = None):
    if file_outPut_Path is None:
        file_outPut_Path = getProperties("output_result_path") + "\\screenshot\\"
    if file_outPut_Name is None:
        file_outPut_Name = str(time.time()).replace(".", "") + ".png"
    # 去除首位空格
    path = file_outPut_Path
    path = path.strip()
    # 去除尾部 \ 符号
    path = path.rstrip("\\")
    if not os.path.exists(file_outPut_Path):
        os.makedirs(path)
    driver.save_screenshot(file_outPut_Path + file_outPut_Name)
    return file_outPut_Path + file_outPut_Name


# close alert 弹窗
def ACTIONS_switchTo_alert(driver):
    """
    关闭alert弹窗,返还弹窗内容
    :param driver: webDriver 对象
    :return: 这个 alert 的文本内容
    """
    try:
        alert = driver.switch_to.alert
    except Exception :
        return "页面没有 Alert 弹窗"
    text = alert.text
    alert.accept()
    return text

# 标红


# 判断元素是否有效
def ACTIONS_to_displayed(ele: WebElement, is_to: bool = False) -> bool:
    if ele.is_displayed():
        return True
    else:
        # TODO 使用js有效化对象
        return False

ELEMETN_TOOLS_LOCATION 文件

此文件包含了元素定位方法,还不是很完善,后续我会添加的

# -*- coding: utf-8 -*-
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from object.DRIVER import set_Driver_implicitly_wait


def get_element_time(driver, Parameter_By, Parameter_Value, time=3):
    """
    使用selenium 的显示等待时间和EC对象组合定位元素。
    :param driver: 浏览器驱动对象
    :param Parameter_By: selenium 中的By对象
    :param Parameter_Value: selenium 元素定位信息
    :param time: 等待时间,如果时间过后还没找到则停止程序并抛出异常。
               time default = 2 秒
    :return:通过 Parameter_By, Parameter_Value信息定位的元素。
    use template
        get_element_time(driver, By.XPATH, "//input[@name=='userName']", 2)
    """
    return get_element(driver, Parameter_By, Parameter_Value, EC.presence_of_element_located, time)


def get_element_clickable(driver, Parameter_By, Parameter_Value, time=2):
    """
    使用selenium 的显示等待时间和EC对象组合定位元素。
    :param driver: 浏览器驱动对象
    :param Parameter_By: selenium 中的By对象
    :param Parameter_Value: selenium 元素定位信息
    :param time: 等待时间,如果时间过后还没找到则停止程序并抛出异常。
               time default = 2 秒
    :return:通过 Parameter_By, Parameter_Value 信息定位的元素,并且这个元素可以点击。
    use template
        get_element_clickable(driver, By.XPATH, "//input[@name=='userName']", 2)
    """
    return get_element(driver, Parameter_By, Parameter_Value, EC.element_to_be_clickable, time)


def get_element_Send_keysAble(driver, Parameter_By, Parameter_Value, compel=False, time=2):
    """
    使用selenium 的显示等待时间和EC对象组合定位元素。
    :param driver: 浏览器驱动对象
    :param Parameter_By: selenium 中的By对象
    :param Parameter_Value: selenium 元素定位信息
    :param compel: 是否强制发送
    :param time: 等待时间,如果时间过后还没找到则停止程序并抛出异常。
               time default = 2 秒
    :return:通过 Parameter_By, Parameter_Value 信息定位的元素,并且这个元素可以输入文字。
    use template
        get_element_clickable(driver, By.XPATH, "//input[@name=='userName']",False, 2)
        get_element_clickable(driver, By.XPATH, "//input[@name=='userName']",time=2)
    """
    ele = get_element(driver, Parameter_By, Parameter_Value, EC.presence_of_element_located, time)
    if ele.tag_name == 'textarea' or ele.tag_name == 'input' or compel:
        # TODO 完整判断是否可以输入文字
        return ele
    else:
        raise Exception("这个标签不是文本框,或者文本域,\n 如需要请compel == True\n\tuse template\n\t\t"
                        "get_element_clickable(driver, By.XPATH, \"//input[@name=='userName']\",True)")


def get_elements(driver, Parameter_By, Parameter_Value, time=2):
    """
    使用selenium 的显示等待时间和EC对象组合定位元素。
    :param driver: 浏览器驱动对象
    :param Parameter_By: selenium 中的By对象
    :param Parameter_Value: selenium 元素定位信息
    :param time: 等待时间,如果时间过后还没找到则停止程序并抛出异常。
               time default = 2 秒
    :return:通过 Parameter_By, Parameter_Value信息定位的多个元素。
    use template
        get_element_time(driver, By.XPATH, "//input[@name=='userName']",EC.element_to_be_clickable, 2)
    """
    driver.implicitly_wait(time)
    # elements = None
    try:
        elements = WebDriverWait(driver, time).until(
            EC.visibility_of_all_elements_located((Parameter_By, Parameter_Value)))
    except Exception:
        E_mag = dict(url=driver.current_url,
                     time=time,
                     by=Parameter_By,
                     val=Parameter_Value)
        raise Exception("在 %(url)s 页面 %(time)s秒 内没找到 %(by)s == %(val)s 的元素." % E_mag)
    finally:
        set_Driver_implicitly_wait(driver)
    return elements


def get_element(driver, Parameter_By, Parameter_Value, get_element_def, time=2 ):
    """
    使用selenium 的显示等待时间和EC对象组合定位元素。
    :param driver: 浏览器驱动对象
    :param Parameter_By: selenium 中的By对象
    :param Parameter_Value: selenium 元素定位信息
    :param get_element_def: EC 对象中的方法
    :param time: 等待时间,如果时间过后还没找到则停止程序并抛出异常。
               time default = 2 秒
    :return:通过 Parameter_By, Parameter_Value信息定位的元素。
    use template
        get_element_time(driver, By.XPATH, "//input[@name=='userName']",EC.element_to_be_clickable, 2)
    """
    driver.implicitly_wait(time)
    try:
        element = WebDriverWait(driver, time).until(get_element_def((Parameter_By, Parameter_Value)))
    except Exception:
        E_mag = dict(url=driver.current_url,
                     time=time,
                     by=Parameter_By,
                     val=Parameter_Value)
        raise Exception("在 %(url)s 页面 %(time)s秒 内没找到 %(by)s == %(val)s 的元素." % E_mag)
    finally:
        set_Driver_implicitly_wait(driver)
        # 页面滚动到元素位置
    driver.execute_script("arguments[0].scrollIntoView();", element)
    return element

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值