APP自动化-使用excel文件关键字执行寻找元素及其他操作

发布时间 2023-05-25 19:39:47作者: 琉璃星眸

这里就是关键字驱动,三个主要元素,EXCEL表格(记录关键字),关键字函数(和关键字对应),执行器(记录执行步骤)

1、首先建立EXCEL表格,如下图:

 2、关键字函数编写:

先在package目录下建立一个Context文件,创建函数Context,用来映射。

创建Keys文件,记录关键字函数

首先创建session函数用来连接设备,和创建driver,映射给context类,属性名为driver,用作传递后后面使用的函数调用driver

 创建执行器文件Execute.py

先导包wiat, ec, keys文件,EXCEL读取文件的PY文件中函数ExcelReader,Context类文件中的类,

 声明excel文件,使用ExcelReader读取文件,没有声明SHEET页,默认第一页,

声明data为读取excel得到的迭代器(多行数据)

path = "C:/Users/a/PycharmProjects/pythonProject1/test2.xlsx"
file_object = ExcelReader(path)
data = file_object.get_case_data()  # 得到的是迭代器(字典,来源于 yield caps)

设置for循环,i in data,',声明action = 迭代器中的关键字action

如果变量action 为session,执行KEY文件的关键字函数session, 得到连接设备,且设置了设备驱动driver ,传递给context类中的“driver”属性。

关键字函数KEYS文件中设置首要关键字find函数,用来解释如何查找元素。

def find(by, value, ele_str=None):  # 寻找元素
    # ele = driver.find_element(by, value)
    driver = getattr(Context, "driver")
    ele = Wait(driver, 2).until(ec.presence_of_element_located((by, value)))
    # 因为要保证找到元素,才能进行点击,等待之类的操作,ec.presence_of_element_located等于函数return driver.find_elements(*locator)
    if not ele_str:
        setattr(Context, "current_ele", ele)
        # 如果ele_str=None,把ele = driver.find_element(by, value)="00000000-0000-01f9-7fff-ffff0000004d"的元素赋值给"current_ele"
    else:
        setattr(Context, ele_str, ele)
        # 如果ele_str不为None,ele_str赋值为ele,即ele_str(例如:书城) = element="00000000-0000-01f9-7fff-ffff0000004d"
    print("find的ele:", ele)  # element="00000000-0000-01f9-7fff-ffff0000004d"
    print("find的ele_str:", ele_str)  # 书城元素

这里的FIND函数,需要用到显性等待wait和查找方式ec方法,最简单的方法driver.find_element(by, value),需要传递(by, value),这里的ele_str=None用作设置无论EXCEL表格中是否传了元素值,都能得到值。(执行器中设置了ele_str取值为EXCEL表格中的save_name)

 函数内部,先从Context类中获取驱动driver,

再声明ele为显性等待后使用ec.presence_of_element_located((by, value))得到的元素,(如果元素存在,肯定能得到元素)

# 这里不用driver.find_elementsby,value)是因为如果这里找不到,后面的click或者send_keys都会错,所以要保证找到元素。

ec.presence_of_element_located((by, value))源码是return driver.find_elements(*locator),locator=(by,value)

如果EXCEL表格中没有给出确定的元素,即传参ele_str=None,那么设置映射Context类的"current_ele"(当前元素)为find函数查到的元素。

如果EXCEL表格中给出确定的元素,那么设置映射Context类的"ele_str"(传参函数)为find函数的传参,即等于表格中的save_name传参内容

执行器中的find执行方法是:

如果关键字是find,那么执行关键字函数find,传参是迭代器当前读取行的by,value,save_name

    if action == "find":
        find(by=i["by"], value=i["value"], ele_str=i["save_name"])

 

找到元素后再进行,click 和 send_keys操作,关键字函数和执行器写法如下

 click函数只需传find函数找到的元素ele即可。

执行器中判断excel文件中的save_name有没有传。如果不存在,取find函数获取到的ele赋值给element,如果存在,获取excel文件的ele_object的值。

最终设置ele为element的值。

 

send_keys函数和click函数大致一样。

只是传参中多了一个content。

 

剩余的其他查找元素方法如下:

但是发现一个问题,

find函数用 driver.find_elements(*locator),locator=(by,value)的时候,excel表格的关键字为wait_ele_not_display(element)的时候,不报错

那些显示等待函数是可以用,

find函数用Wait(driver, 2).until(ec.presence_of_element_located((by, value)))的时候,关键字为wait_ele_not_display(element)的时候,会报错

TypeError: appium.webdriver.webdriver.WebDriver.find_element() argument after * must be an iterable, not WebElement

翻译过来是:类型错误:*之后的appium.webdriver.webdriver.webdriver.find_element()参数必须是可迭代的,而不是WebElement,

意思是不能传对象?有懂的请告知