现象:
自动化在调用SAP EXE可执行文件时,程序调用起来了,但是进行用户登录时报:pywintypes.com_error: (-2147352567, '\xb7\xa2\xc9\xfa\xd2\xe2\xcd\xe2\xa1\xa3', (614, u'saplogon', u'The enumerator of the collection cannot find en element with the specified index.', u'C:\\Program Files (x86)\\SAP\\FrontEnd\\SAPgui\\saplogon.HLP', 393215, 0), None),大概意思是找不到en的元素位置,所以导致失败,登录SAP源码为:
def open_SAP(self):
# 关闭本地进程
time.sleep(1)
self.close_SAP()
# 打开SAP
sap_app = r"C:\Program Files (x86)\SAP\FrontEnd\SAPgui\saplogon.exe"
subprocess.Popen(sap_app)
time.sleep(1)
flt = 0
while flt == 0:
try:
hwnd = win32gui.FindWindow(None, "SAP Logon 750")
flt = win32gui.FindWindowEx(hwnd, None, "Edit", None)
time.sleep(3)
except:
time.sleep(0.5)
# win32gui.SendMessage(flt, win32con.WM_SETTEXT, None, "GMD")
win32gui.SendMessage(flt, win32con.WM_SETFOCUS, 0, 0)
win32gui.SendMessage(flt, win32con.WM_CHAR, ord('G'), 0)
win32gui.SendMessage(flt, win32con.WM_CHAR, ord('M'), 0)
win32gui.SendMessage(flt, win32con.WM_CHAR, ord('D'), 0)
time.sleep(1)
# 获取登录按钮并点击
dlg = win32gui.FindWindowEx(hwnd, None, "Button", None) # 登陆(0)
win32gui.SendMessage(dlg, win32con.WM_LBUTTONDOWN, 0)
win32gui.SendMessage(dlg, win32con.WM_LBUTTONUP, 0)
time.sleep(2)
# /app/con[0]/ses[0]/wnd[0] 窗体结构
SapGuiAuto = win32com.client.GetObject("SAPGUI")
application = SapGuiAuto.GetScriptingEngine
connection = application.Children(0)
time.sleep(6)
self.session = connection.Children(0)
代码执行到self.session这步报错,已经打开了SAP程序,但是登录具体用户就报错
分析:
因为SAP是第三方系统,我们自动化登录只是调用SAP的VB语言,于是手动打开SAP进行登录,想将登录脚本重新修改,想进行脚本录制与回放,发现此按钮置灰不可点击,只能不停的去百度优快云,不停的查询github,还是解决不了。
于是乎,将SAP登录环境更换地址,发现跑成功了,其他SAP地址是可以进行脚本录制与回放,于是猜想大概率是因为无法录制导致元素找不到
解决:
百度下如何将此按钮变为可用。具体步骤如下,此处直接上图:
1:登录进去,输入事务代码:RZ11
2.输入参数名称:sapgui/user_scripting,回车
3.选择更改值:
4.将新值设置为:TRUE
设置完成之后,脚本录制与回放按钮可以正常点击
再次跑脚本,可以正常找到元素位置,问题解决