应用类(App)
class App
使用类或者实例的方法
一般而言,你可以选择使用类的方法(e.g. App.open("application-identifier")
)或者先创建一个类的实例接着使用该实例的方法(e.g. 先myApp = App("application-identifier")
,之后 myApp.open()
)。(对于二者)没有一个优先级的用法推荐,唯一真正的不同之处在于,当使用实例方法时,可能会节省一些资源,因为使用类的方法可能会产生更多的中间对象。因此,如果您频繁地使用相同的应用或者窗口,使用实例方法也许更合适(注:transparent的意思为”透明的;显然的;坦率的;易懂的”,但译者认为此处理解为“合适的”最好)。
如何创建一个应用程序实例
基本的选择只是说,创建应用someApp = App("some-app-identifier")
之后,你有你的应用实例,以后你可以一起使用实例的方法,而不必再次指定字符串。
通常,所有类的方法都会返回一个应用实例,您可以将其保存在一个变量中,以便之后在您的脚本中使用它。
在实例创建时,使用给定的文本扫描进程列表以查找可执行文件的名称。如果找到了,应用程序将被初始化为响应的信息(PID,可执行文件,主窗口最前面的窗口标题)。所以,你可以直接访问此应用实例,查看应用是否运行(isRunning()
),是否有窗口(hasWindow()
),获取主窗口的标题(getWindow()
)以及获取进程ID(PID)(getPID
)。
应用程序实例的字符串表示如下所示:
[nPID:executableName (main/frontmost window title)] given text
Note: nPID是进程号
executableName是可执行文件名
main/frontmost window title:主窗口最前端的标题
given text:给定的文本,创建实例时传入的参数,其实就是应用的名称
对于Windows/Linux而言,如果没有找到,则会扫描当前已知的窗口标题,查看他们是否包含给定的文本。找到第一个(和给定文本匹配的)窗口评估(有点假定的意思)为应用程序,并初始化应用实例。
如果在进程列表中既没有找到可执行的文件,也没有找到匹配的窗口,则应用程序初始化为未运行(PID设置为-1),给定的文本会被记住(这句话意思是给定的文本会包含在创建的实例中)。
如果你指定一个打开的窗口的确切窗口标题,你将会得到该窗口。但是,如果你指定某些文本,且在不止一个打开得窗口标题中找到,你将会得到这些窗口行中的第一个。所以,如果你需要一个特定的窗口,你需要知道确切的窗口标题或至少标题文本的一部分,这使得这个窗口在当前的上下文中是唯一的(e.g. 在访问窗口之前,用一个特定的名称保存文档)。
对于Mac OS X而言,通过其中一个窗口标题的一部分来识别正在运行的应用程序,尚不可能。你能通过getWindow()
获取当前最前端窗口的应用的窗口的标题。
Note: 目前,无论窗口是隐藏还是最小化,这些信息是不可用且不可能将这样的窗口带到复合Sikuli特性的前面。
class App
classmethod pause(waitTime)
用法: App.pause(someTime) (业务功能)
只需几秒钟(整数或浮点数)就可以做任何事情。
classmethod App(application)
用法: someApp = App(application)
创建一个应用程序实例,稍后与实例方法一起使用(请参见上文)
参数: application – 应用程序的名称(不分大小写), t可在系统用于查找应用程序的路径中找到,或应用程序的完整路径。或者,您可以添加参数,这些参数将在打开时提供给应用程序(请参阅参考资料setUsing())。
返回值: App对象,可以和实例方法一起使用
isRunning([ waitTime ])
用法: App实例someApp
之前已被创建,可以这样使用if not someApp.isRunning(): someApp.open()
。
参数: waitTime - 可选:整形,单位:秒,获取运营程序等待的时间
返回值: 如果应用程序正在运行(有进程ID),则为true,否则为False
Windows通过窗口标题(部分)识别应用程序是很常见的。如果尚未打开,在继续操作之前必须先使用方法打开它。
所以这是一个典型的例子,如何处理:
例:
1 | # we want to act in a VirtualBox VM window and use the VM's name |
hasWindow()
用法: App实例someApp
之前已被创建。if not someApp.hasWindow(): openNewWindow() # some private function
返回值: 如果应用程序正在运行并注册了主窗口,则为true,否则为False
getWindow()
用法: App实例someApp
之前已被创建。title = someApp.getWindow()
返回值: 应用程序最前面的窗口的标题,其可能是一个空字符串
getPID()
用法: App实例someApp
之前已被创建。pid = someApp.getPID()
返回值: 如果应用正在运行,则进程标识为数字,否则为-1
getName()
用法: App实例someApp
之前已被创建。appName = someApp.getName()
返回值: 应用程序的简称,如进程列表中所示。
setUsing(parametertext)
用法: App实例someApp
之前已被创建。appName = someApp.setUsing("parm1 x parm2 y parm3 z")
参数: parametertext
- 字符串,如果你要从命令行启动应用程序,就使用你给予的字符串启动应用。
返回值: 应用程序实例
classmethod open(application)
用法: App.open(application)
,打开指定的应用程序(如果尚未打开)并将其置前(放在窗口最前面)
参数: application - 应用程序的名称(不区分大小写),可在系统用于定位应用程序的路径中找到,或应用程序的完整路径(Windows:在路径字符串中使用双反斜杠\来表示反斜杠)
返回值: App程序对象,可以与实例方法一起使用,如果失败,则返回null
此方法在功能上等同于openApp()。
*open([waitTime])
用法: App实例someApp
之前已被创建。someApp.open()
打开此应用程序。
参数: waitTime - 可选:秒作为整数,应该等待应用程序运行
返回值: 应用程序实例或空/无如果打开失败
classmethod focus(application)
用法: App.focus(application)
将输入焦点切换到应用程序/窗口。
参数: apllication - 应用程序的名称(不区分大小写)或(部分)窗口标题(Windows / Linux)(区分大小写)。
返回值: 可以与实例方法一起使用的App对象,在发生故障的情况下返回空
focus()
用法: someApp.focus()App实例someApp
之前已被创建。
将输入焦点切换到此应用程序/窗口。
classmethod close(application)
用法: App.close(application)
它关闭给定的应用程序或匹配的窗口(Windows / Linux)。如果没有找到正在运行的应用程序或打开的窗口(Windows / Linux),它什么也不做。在Windows / Linux上,应用程序本身是否关闭取决于天气,所有打开的窗口关闭或应用程序的主窗口关闭,然后关闭所有其他打开的窗口。
参数: 应用程序 - 应用程序的名称(不区分大小写)或(部分)窗口标题(Windows / Linux)(区分大小写)。
这个方法在功能上等同于closeApp()。
close()
用法: someApp.close()App实例someApp
之前已被创建。
关闭此应用程序。
处理应用程序窗口
classmethod focusedWindow()
用法: App.focusedWindow()
确定当前聚焦或最前面的窗口并切换到该窗口。Sikuli没有告诉你,这个窗口属于哪个应用程序。
返回值: Region表示窗口的对象,如果没有这样的窗口,则为None。
在Mac上,当启动一个脚本时,Sikuli隐藏它的窗口并开始处理脚本。在这个时刻,没有窗口有焦点。因此,有必要先点击某个地方或App.focus()用来专注于一个窗口。在这种情况下,此方法可能会返回None。
在Windows上,这个方法总是返回一个区域。当桌面上没有打开窗口时,该区域可能会引用特殊窗口,如任务栏或系统托盘中的图标。
例:
#突出显示当前最大的窗口2秒钟的
应用程序。focusedWindow ()。突出(2 )
#在
firstWindow = App 之前保存窗口区域。focusedWindow ()
firstWindow 。突出(2 )
window([ n ] )
用法1: App(application).window([n])应用程序实例即时创建。
用法2: someApp.window([n])App实例someApp
之前已被创建。
获取与此应用程序(Mac)的第n个窗口相对应的区域或具有匹配标题(Windows / Linux)的一系列窗口。
参数: n - 0或一个正整数。如果省略,则默认为0。
返回值: 窗口占用的区域,如果存在的话,否则为None。
以下是一个尝试打开Firefox浏览器窗口并切换到地址字段(Windows)的示例:
1 | myApp = App("Firefox") |
之后,它着重于Firefox应用程序,使用该window()
方法获取最前面的窗口区域,在该区域内执行一些操作,最后关闭该窗口:
1 | # using a new window |
下面是另一个例子,通过遍历它们(Mac)来突出显示应用程序的所有窗口:
1 | # not more than 100 windows should be open ;-) |
通用方面,提示和的窍门
请注意,特别是窗口处理功能是实验性的,正在进一步的开发之中。
特别是在Windows上,请注意,可能有许多匹配的窗口和窗口,可能根本看不到。目前该 window()功能除了返回区域外,还没有识别特殊窗口的功能。所以你可能需要一些额外的检查,以确保你在正确的窗口上行事。
Windows / Linux:该close()功能目前杀死应用程序,而不关闭它的窗户。这是一个异常终止,并可能在下次启动时被您的应用程序识别(例如,Firefox通常会尝试重新加载页面)。
即使窗口被隐藏/最小化,它们在可见状态下的区域也被返回。目前没有Sikuli功能,决定给定的窗口(n)是否可见,或者如果它是当前最前面的窗口。唯一的保证:window()/ window(0) 是应用程序(Mac)或一系列匹配窗口(Windows / Linux)的最顶层窗口。
目前没有方法可以在这样的窗口上进行操作(调整窗口大小,展现窗口标题,…)。
一些技巧:
检查一个窗口的返回区域的位置:一些应用程序通过给它们“外部”坐标(例如负值)来隐藏窗口,
检查一个窗口的返回区域的大小:通常你的应用程序窗口将占据屏幕的主要部分,所以窗口的返回区域(例如150x30)可能是一些不可见的东西或在真实应用程序窗口上的覆盖(例如,“在历史中搜索”输入字段在Safari Top-Sites页面,报告为windows(0))
如果您有多个应用程序窗口,请尝试将它们放置在不同的坐标处,以便您可以决定现在执行哪一个操作。
有时可以使用OCR文本提取功能 Region.text()获取窗口标题。