如何调用别的.air脚本中封装好的方法

简介: 如何调用别的.air脚本中封装好的方法

前言



今天我们来讲一个大家经常问到或者经常容易出错的一个问题--如何调用别的.air脚本中封装好的方法,我们将围绕以下内容来讲解:


  1. 普通调用的方法;
  2. 设定默认项目根目录PROJECT_ROOT来调用的方法;
  3. 调用过程中常见的问题


为了帮助大家更好地理解,下文都将以实际案例来介绍调用的方法和常见问题。


普通调用的方法



首先,我们新建1个common.air的脚本,在里面定义1个名为common_function()的方法:


# common.air
from airtest.core.api import *
auto_setup(__file__)
def common_function():
    touch("tmp.png")
复制代码


然后,我们再新建1个call.air的脚本,用来调用common.air里面封装好的方法:


# call.air
from airtest.core.api import using
auto_setup(__file__)
# using("相对路径/绝对路径")
using("common.air")
from common import common_function
common_function()
复制代码


common.aircall.air脚本所在目录如图所示:



值得注意的是,call.air的代码示例中,using("common.air")使用的是相对路径,我们也可以使用绝对路径来找到common.air,如:


using("D:/test/common.air")
复制代码


设定默认项目根目录PROJECT_ROOT来调用的方法



如果需要调用的子脚本路径统一都放在某个目录下,可以通过设定一个默认项目根目录 PROJECT_ROOT,让使用using接口时能够在当前根目录下寻找别的子脚本,无需填写完整路径,让脚本之间相互调用使用更加方便。


例如,我们建立一个名为test1.air的脚本,绝对路径为D:/test/user/project/test1.air :



# test1.air
from airtest.core.api import *
auto_setup(__file__)
def test():
    touch("tmp.png")
复制代码


然后我们在"D:/test/"目录下新建main.air脚本,调用test1.air脚本里面的test方法:



# main.air
from airtest.core.api import *
auto_setup(__file__)
# PROJECT_ROOT需要填写绝对路径
ST.PROJECT_ROOT = "D:/test/user/project"
using("test1.air")
from test1 import test
test()
复制代码


调用过程中常见的问题



路径斜杠问题


填写路径的时候,需要注意使用的是/而非反斜杠\,特别是你从计算机上复制路径的时候,计算机的路径使用的都是反斜杠\,我们在代码中使用时需要手动转换过来,不然会出现以下报错:



图中示例的路径中包含了很多反斜杠\(特殊字符),方法一是我们可以通过添加反斜杠\来转义,也就是说路径字符串可以写成类似这样:D:\\test\\user\\project

或者是我们可以在字符串前加一个r来定义原始字符串(忽略所有的转义字符,比如这里的反斜杠\),类似这样: r"D:\test\user\project"


调用的模块不存在


在调用的过程中,我们经常会遇到以下报错:



上述报错的意思是,程序找不到我们想要调用的名为test1的这个模块。这时候我们可以从以下几方面来思考:


  1. 仔细核对调用的模块是否存在于你填写的路径里面;
  2. 设定默认的项目根目录PROJECT_ROOT时是否使用了相对路径而没有使用绝对路径。


如果以上都没有问题,但程序还是找不到你想调用的模块,你还可以尝试把路径加入到sys.path里面去,Python就会在sys.path的路径下搜索对应的.py文件,以上述的main.air脚本为例:


# main.air
from airtest.core.api import *
auto_setup(__file__)
#将test1.air的路径添加到sys.path里面
sys.path.append(r"D:\test\user\project\test1.air")
using("test1.air")
from test1 import test
test()
复制代码


这种方法是在运行时修改sys.path,运行结束后失效。


另外你还可以通过设置环境变量PYTHONPATH来增加模块搜索的路径,设置方式与设置Path环境变量类似。注意只需要添加你自己的搜索路径,Python自己本身的搜索路径不受影响。


在IDE可以运行的脚本到命令行运行就报错


上文中,我们介绍了俩个方法实现调用,里面的例子是在IDE中运行的;但如果我们直接在命令行中使用airtest run 脚本绝对路径来运行,有可能又会出现找不到模块的情况:



这是因为,在IDE里面默认会把父路径加到sys.path里面,而使用命令行跑脚本的时候,不会默认添加父路径;为避免以上错误,我们可以在脚本里手动把路径添加到sys.path里面,避免不必要的错误。


sys.path.append(r"D:\test\user\project\test1.air")


相关文章
|
JavaScript 前端开发
49dwr - 传递额外的数据到 callback 函数
49dwr - 传递额外的数据到 callback 函数
39 0
|
3月前
|
Java 数据库连接 数据库
|
3月前
|
安全 Java 数据库连接
|
5月前
|
Java API
JavaSE——常用API进阶一(1/3)-Object类(Object类的作用、Object类的常见方法-toString方法、equal方法、clone方法)
JavaSE——常用API进阶一(1/3)-Object类(Object类的作用、Object类的常见方法-toString方法、equal方法、clone方法)
37 0
|
6月前
LabVIEW使用VI服务器的调用节点将数据传递到另一个VI 使用调用节点(Invoke Node)与通过引用调用节点(Call by Reference)调用VI时有什么差别?
LabVIEW使用VI服务器的调用节点将数据传递到另一个VI 使用调用节点(Invoke Node)与通过引用调用节点(Call by Reference)调用VI时有什么差别?
162 0
|
6月前
|
JavaScript 编译器 API
v-pre的作用、使用场景、示例代码
v-pre 指令在 Vue 中的作用主要是`防止编译器解析某个特定的元素及其内容`。这在你想要展示 Vue 模板语法或者 Mustache 标签(例如 {{message}})而不是让 Vue 将其解析为数据绑定时非常有用。`使用 v-pre 指令的内容将会原样显示在页面上,不会进行数据绑定或插值。
|
Java Python
java调用python脚本并传递参数list
java调用python脚本并传递参数list
117 0
|
JSON 前端开发 Java
【Java用法】代码参数里的 payload 是什么意思?
【Java用法】代码参数里的 payload 是什么意思?
160 0
|
C++ Python
python类中初始化形式:def __init__(self)和def __init__(self, 参数1,参数2,,,参数n)区别
python类中初始化形式:def __init__(self)和def __init__(self, 参数1,参数2,,,参数n)区别
168 0
|
JavaScript 前端开发 测试技术
loadrunner 脚本优化-关联函数web_reg_save_param()函数详解
loadrunner 脚本优化-关联函数web_reg_save_param()函数详解
219 0