1

我运行了许多 python 脚本和程序来聚合和编辑 Attachmate Extra 中的数据。直到最近,我的公司还在使用旧版本的 Attachmate Extra。我正在测试新版本(Reflection Desktop v. 16.2),我的脚本不再工作。我在此链接上的有用建议的帮助下构建了它们。我希望能够在新版本上控制(抓取、写入等)屏幕。

这是我目前所在的位置。运行此代码会创建一个新窗口:

system = win32com.client.Dispatch("ReflectionIBM.Session")
system.Visible = True

...但是从那里我无法执行我以前使用的任何命令。运行这个,例如

system.MoveCursor(11, 65)

在模拟器中创建一个不连接到会话的新选项卡。我已经查看了反射文档以寻找答案。该页面使我相信不再需要旧的会话方法,但我不确定。我想我包装了正确的对象,文档说遗留命令仍然有效,但我还没有弄清楚如何链接它们。

作为参考,这里是我之前用来连接到 Attachmate 的线路:

system = win32com.client.Dispatch("EXTRA.System")
sess0 = system.ActiveSession
Screen = sess0.Screen

任何帮助表示赞赏。我一直在 win32com 浏览器中搜索列表命令并查看注册表以查找可用的类,但我不知道要查找什么。谢谢!

编辑:

我之前使用了几个函数在 Attachmate 中读取、写入和移动光标。例子:

def write(screen,row,col,text):
    screen.row = row
    screen.col = col
    screen.SendKeys(text)

write(screen, 10, 65, "test")

有没有办法让这个在反射中再次工作?

4

2 回答 2

0

我仍然不知道为什么会这样。在 VBA 中,GetObject 方法适用于“反射工作区”,但在 python 中,它没有产生任何我能找到的可用属性。对于 python,要获取活动会话对象,我必须使用 EXTRA.System:

from win32com.client.gencache import EnsureDispatch
screen = EnsureDispatch("EXTRA.System").ActiveSession.Screen

从那里开始,代码似乎与 VBA 大致相同

screen.GetString(row, col, len)
screen.PutString(data, row, col)
screen.SendKeys('<PF1>')

用于与主机交互。

经过更多的文档阅读和更多的试验和错误,我解决了它。“EXTRA.System”出于遗留原因而保留,因此在技术上仍然可以使用。但是,要连接到 Reflection 的活动会话,这可行:

system = win32com.client.GetObject('Reflection Workspace')

然后获取活动视图:

screen = system.GetObject("Frame").SelectedView.Control.Screen

或特定编号的视图:

screen = system.GetObject("Frame").view(1).Control.Screen

与反射交互的代码也发生了变化,现在看起来像:

screen.GetText(row, col, len)
screen.PutText2(data, row, col)
screen.SendControlKey(ControlKeyCode)

ControlKeyCode的文档似乎没有提供控制键的代码。但是,您可以在反射附带的 Visual Basic 对象浏览器中找到定义。在 Reflection 的宏选项卡上,单击 Visual Basic,然后按 F2 并搜索 ControlKeyCode。应显示它们的列表。例如,我的显示 ControlKey_F1=10。

screen.SendKeys("N")

仍然可以用于发送单个按键,例如 N 键,但 SendControlKey 似乎已经取代了命令键,例如 Enter、Page Up 和功能键。

于 2020-09-17T20:17:42.627 回答
0

在这方面已经推出了python包py_reflection,

如何开始:

通过 pip 安装包:

py -m pip install py_reflection

运行包(在终端中运行以下命令):

python
>>>from py_reflection import app
>>>app.run()

Api Endpoint 及其描述: ** 所有的端点都有一个共同的参数 view_idx(integer, optional)。使用此参数在模拟器中的会话之间切换。

/send_keys:使用此端点在模拟器中按键。要传递的参数:text(string), x(integer), y(integer)

/get_text:使用此端点从特定坐标获取文本。要传递的参数:x(integer), y(integer)

/press_key:使用此端点来按下特殊控制键: 要传递的参数:control_key(string all in caps)。可用的控制键:'F1','F2','F3','F4','F5','F6','F7','F8','F9','F10','F11','F12 ','F13','F14','F15','F16','F17','F18','F19','TAB','DELETE','LEFT','DOWN','UP', 'RIGHT','PAGEUP','PAGEDOWN','CLEAR','END','ENTER'

/get_text_coordinates:使用此端点获取模拟器屏幕中存在的文本坐标。传递参数:text(string), total_row_count(integer, optional), total_column_count(integer, optional)

/check_text_present:使用此端点检查模拟器屏幕中是否存在给定文本。传递参数:text(string), total_row_count(integer, optional), total_column_count(integer, optional)

/move_cursor:使用此端点将光标移动到指定坐标。要传递的参数:x(integer), y(integer)

/get_view_count:使用此端点获取模拟器中打开的会话数。

更多信息请访问pypi.org

于 2021-08-08T16:29:02.143 回答