应用类(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
2
3
4
5
6
7
8
9
# we want to act in a VirtualBox VM window and use the VM's name
# which is always part of the Window title when running
vb = App("VM-name")
if not vb.isRunning():
App.open(r'"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" startvm VM-name')
while not vb.isRunning():
wait(1)
vb.focus()
appWindow = App.focusedWindow()

    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
2
3
4
5
6
7
myApp = App("Firefox")
if not myApp.window(): # no window(0) - Firefox not open
App.open("c:\\Program Files\\Mozilla Firefox\\Firefox.exe")
wait(2)
myApp.focus()
wait(1)
type("l", KEY_CTRL) # switch to address field

        之后,它着重于Firefox应用程序,使用该window()方法获取最前面的窗口区域,在该区域内执行一些操作,最后关闭该窗口:

1
2
3
4
5
6
7
8
9
10
# using a new window
firefox = App.open("c:\\Program Files\\Mozilla Firefox\\Firefox.exe");
wait(2)
firefox.focus()
wait(1)
# now your just opened new window should be the frontmost
with Region(firefox.window()): # see the general notes below
# some actions inside the window(0)'s region
click("somebutton.png")
firefox.close() # close the window - stop the process

        下面是另一个例子,通过遍历它们(Mac)来突出显示应用程序的所有窗口:

1
2
3
4
5
6
# not more than 100 windows should be open ;-)
myApp = App("Safari")
for n in range(100):
w = myApp.window(n)
if not w: break # no more windows
w.highlight(2) # window highlighted for 2 second

通用方面,提示和的窍门

请注意,特别是窗口处理功能是实验性的,正在进一步的开发之中。
特别是在Windows上,请注意,可能有许多匹配的窗口和窗口,可能根本看不到。目前该 window()功能除了返回区域外,还没有识别特殊窗口的功能。所以你可能需要一些额外的检查,以确保你在正确的窗口上行事。
Windows / Linux:该close()功能目前杀死应用程序,而不关闭它的窗户。这是一个异常终止,并可能在下次启动时被您的应用程序识别(例如,Firefox通常会尝试重新加载页面)。
即使窗口被隐藏/最小化,它们在可见状态下的区域也被返回。目前没有Sikuli功能,决定给定的窗口(n)是否可见,或者如果它是当前最前面的窗口。唯一的保证:window()/ window(0) 是应用程序(Mac)或一系列匹配窗口(Windows / Linux)的最顶层窗口。
目前没有方法可以在这样的窗口上进行操作(调整窗口大小,展现窗口标题,…)。
一些技巧:

检查一个窗口的返回区域的位置:一些应用程序通过给它们“外部”坐标(例如负值)来隐藏窗口,
检查一个窗口的返回区域的大小:通常你的应用程序窗口将占据屏幕的主要部分,所以窗口的返回区域(例如150x30)可能是一些不可见的东西或在真实应用程序窗口上的覆盖(例如,“在历史中搜索”输入字段在Safari Top-Sites页面,报告为windows(0))
如果您有多个应用程序窗口,请尝试将它们放置在不同的坐标处,以便您可以决定现在执行哪一个操作。
有时可以使用OCR文本提取功能 Region.text()获取窗口标题。

原文链接