我正在创建一个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,而不是一次从各种来源一次将代码拼凑在一起。它不是很优雅,功能是命中注定的。
答案 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元素。您可以进行前后比较,以查看发生了什么变化(如果有)。
希望有帮助。