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