AppleScript无法识别应用程序索引地址

时间:2019-06-13 15:52:37

标签: applescript

我正在创建一个AppleScript来控制SAP中的一些基本标准动作,并且在可用事务的主菜单页面中,所有编写的内容都可以正常工作。当前脚本将填写“命令文本字段”,并打开一个新的现有交易代码。但是,一旦SAP转到新的事务代码页,则当我第二次运行AppleScript时,它不再识别命令文本字段的索引。而是将事务代码粘贴到恰好是当前焦点的任何文本字段中。当我运行脚本时,它应该总是转到相同的文本字段,因为总索引地址没有更改,但是没有改变。

我试图打开SAP的脚本字典,但是看来我公司的SAP风格已禁用脚本字典,因此我被迫使用索引地址来填充文本字段并单击按钮

on chooseSAPTransaction()
    global sapTransaction, transactionCode
    set transactionCode to "" -- intialize the variable
    set transactionList to choose from list {"Find Document", "Change Document", "Look up Product", "Correct Product"} with prompt "SAP Action:" default items {""}
    if transactionList is false then
        error number -128
    else
        set choosenTransaction to item 1 of transactionList
    end if
    if choosenTransaction is "Find Document" then
        set transactionCode to "code1"
        chooseCode1()
    end if
    if choosenTransaction is "Change Document" then
        set transactionCode to "code2"
        chooseCode2()
    end if
    if choosenTransaction is "Look up Product" then
        set transactionCode to "code3"
        chooseCode3()
    end if
    if choosenTransaction is "Correct Product" then
        set transactionCode to "code4"
        chooseCode4()
    end if
    set sapTransaction to "/n" & transactionCode
    activate application "SAP"
    delay 0.1
    tell application "System Events"
        tell process "SAP"
            tell front window to tell toolbar 1 to tell text field 1
                keystroke sapTransaction
            end tell
            tell front window to tell toolbar 1 to tell button 1 to perform action "AXPress"
        end tell
    end tell
end chooseSAPTransaction

在随后的脚本执行中,它会跳过tell front window to tell toolbar 1 to tell text field 1并直接转到keystroke sapTransaction

({"/n" & transactionCode创建一个字符串,该字符串告诉SAP要进行新交易。当手动键入该字符串时,它总是将您带到新交易,无论您当前交易中可能有几层深度。)

我希望索引告诉在运行脚本的每个新实例上都转到相同的元素,但是一旦运行一次,AppleScript将不再找到该元素的地址。

编辑:

我只是尝试将粘贴操作移到其自己的唯一处理程序中,以便可以在尝试进行下一步之前调用它,但这也没有用。

-snip-

    if choosenTransaction is "Find Document" then
        set transactionCode to "code1"
        set sapTransaction to "/n" & transactionCode
        pasteTransaction()
        chooseCode1()
    end if

-snip-

on pasteTransaction()
    global serialNumber, sapTransaction, transactionCode
    activate application "SAPGUI"
    delay 0.1
    tell application "System Events"
        tell process "SAPGUI"
            tell front window to tell toolbar 1 to tell text field 1
                keystroke sapTransaction
            end tell
            tell front window to tell toolbar 1 to tell button 1 to perform action "AXPress"
        end tell
    end tell
end pasteTransaction

修改2:

我通过强制SAP浏览菜单来使其工作。哇!

on pasteTransaction()
    global serialNumber, sapTransaction, transactionCode
    activate application "SAPGUI"
    delay 0.1
    tell application "System Events"
        click menu item ¬
            "Target Command Field" of menu 1 of menu bar item ¬
            "Edit" of menu bar 1 of application process "SAPGUI"
        keystroke sapTransaction
        tell process "SAPGUI"
            tell front window to tell toolbar 1 to tell button 1 to perform action "AXPress"
        end tell
    end tell
end pasteTransaction

不幸的是,这不能解决AppleScript找不到文本字段的正确索引地址这一更大的问题,因为使这一部分正常工作只是第一步。现在,我必须在每个事务中的各个文本字段中输入文本字符串。

因此,如果有人知道如何解决原始的索引地址问题,那就太好了。

我希望我知道如何实际编写AppleScript,而不是一次从各种来源一次将代码拼凑在一起。它不是很优雅,功能是命中注定的。

1 个答案:

答案 0 :(得分:0)

GUI脚本编写始终是一种技巧,并且如果看不到实际的应用程序,就很难诊断问题。显然,界面中发生了一些变化,这些变化使您试图利用的视图层次结构脱离了,但是...我将指出菜单和工具栏往往是动态的,这使事情变得更加棘手。但是,您可以尝试以下两种诊断方法和替代方法。

首先,让我重写如下所示的GUI代码:

tell application "System Events"
    tell process "SAP"
        tell front window
            tell toolbar 1
                tell text field 1
                    keystroke sapTransaction
                end tell
                tell button 1
                    perform action "AXPress"
                end tell
            end tell
        end tell
    end tell
end tell

因此,首先(假设您定位的是正确的文本字段),您可以尝试以下方法:

            tell toolbar 1
                tell text field 1
                    set value to sapTransaction
                end tell
                tell button 1
                    perform action "AXPress"
                end tell
            end tell

keystroke可以被任何具有焦点的UI元素拦截,但是设置文本字段的value应该直接进入正确的元素。如果这不起作用,则可以在脚本编辑器中尝试以下诊断:

            tell toolbar 1
                properties of every text field
            end tell

这应该在脚本编辑器的日志中为工具栏1中的所有文本字段提供一个列表。这样,您就可以查看文本字段是否具有name属性(这样可以简化寻址:即{{1} }),或者如果其他一些文本字段已添加到层次结构中较高位置的工具栏,请更改您要查找的文本字段的索引。如果情况变得更糟,您可以尝试以下方法:

tell text field "someName"

将列出工具栏的所有UI元素。您可以进行前后比较,以查看发生了什么变化(如果有)。

希望有帮助。