SAP login self

import sys
import win32com.client
import win32api
import win32gui
import win32con
# import win32ui
import time
import os
import subprocess


def Login():
    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 770")
            flt = win32gui.FindWindowEx(hwnd, None, "Edit", None)
        except:
            time.sleep(0.5)
    win32gui.SendMessage(flt, win32con.WM_SETTEXT, None, "BOT_LOGIN")
    win32gui.SendMessage(flt, win32con.WM_KEYDOWN, win32con.VK_RIGHT, 0)
    win32gui.SendMessage(flt, win32con.WM_KEYUP, win32con.VK_RIGHT, 0)
    time.sleep(0.1)

    dlg = win32gui.FindWindowEx(hwnd, None, "Button", None)  # 登陆(0)
    win32gui.SendMessage(dlg, win32con.WM_LBUTTONDOWN, 0)
    win32gui.SendMessage(dlg, win32con.WM_LBUTTONUP, 0)

    SapGuiAuto = win32com.client.GetObject("SAPGUI")
    if not type(SapGuiAuto) == win32com.client.CDispatch:
        return

    application = SapGuiAuto.GetScriptingEngine
    if not type(application) == win32com.client.CDispatch:
        SapGuiAuto = None
        return

    connection = application.Children(0)
    if not type(connection) == win32com.client.CDispatch:
        application = None
        SapGuiAuto = None
        return
    time.sleep(2)

    flag = 0
    while flag == 0:
        try:
            session = connection.Children(0)
            flag = 1
        except:
            time.sleep(0.5)

    if not type(session) == win32com.client.CDispatch:
        connection = None
        application = None
        SapGuiAuto = None
        return

  # SSO no need # session.findById("wnd[0]/usr/txtRSYST-BNAME").text = "username" #此次放入您的SAP登陆用户名 # session.findById("wnd[0]/usr/pwdRSYST-BCODE").text = "password" #此次放入您的SAP登陆密码 session.findById("wnd[0]").sendVKey(0) return session def actions(session): """下面演示了使用mm03查看物料1000000000000的状态后再退回sap首页的过程""" session.findById("wnd[0]/tbar[0]/okcd").text = "mm03" session.findById("wnd[0]").sendVKey(0) session.findById("wnd[0]/usr/ctxtRMMG1-MATNR").text = "1000000000000" session.findById("wnd[0]").sendVKey(0) session.findById("wnd[1]").sendVKey(0) session.findById("wnd[0]/tbar[0]/okcd").text = "/n" session.findById("wnd[0]").sendVKey(0) # >Insert your SAP GUI Scripting code here< if __name__ == "__main__": session = Login() actions(session)

  

 

 

v2 ok

前提: 设置EN, 所有界面.

def Login():
    logger.info('开始登录')
    sap_app = r"C:\Program Files (x86)\SAP\FrontEnd\SAPgui\saplogon.exe"
    subprocess.Popen(sap_app)
    time.sleep(7)
    flt = 0
    while flt == 0:
        try:
            hwnd = win32gui.FindWindow(None, "SAP Logon 770")
            flt = win32gui.FindWindowEx(hwnd, None, "Edit", None)
        except:
            time.sleep(0.5)
    logger.info('SAP窗口句柄: %s' % hwnd)
    logger.info('输入BOT_LOGIN查找')
    win32gui.SendMessage(flt, win32con.WM_SETTEXT, None, "BOT_LOGIN")
    win32gui.SendMessage(flt, win32con.WM_KEYDOWN, win32con.VK_RIGHT, 0)
    win32gui.SendMessage(flt, win32con.WM_KEYUP, win32con.VK_RIGHT, 0)
    time.sleep(1)

    # 点击登录按钮登录
    dlg = win32gui.FindWindowEx(hwnd, None, "Button", None)  # 登陆(0)
    win32gui.SendMessage(dlg, win32con.WM_SETFOCUS, 0, 0)  # 设置焦点到按钮
    time.sleep(0.1)  # 等待焦点设置完成
    win32gui.SendMessage(dlg, win32con.BM_CLICK, 0, 0)  # 直接发送点击消息  BM_CLICK比下面的down/up方式更有效.
    # win32gui.SendMessage(dlg, win32con.WM_LBUTTONDOWN, 0)
    # time.sleep(0.1)
    # win32gui.SendMessage(dlg, win32con.WM_LBUTTONUP, 0)

    time.sleep(0.4)
    SapGuiAuto = win32com.client.GetObject("SAPGUI")
    if not type(SapGuiAuto) == win32com.client.CDispatch:
        return

    time.sleep(0.4)
    application = SapGuiAuto.GetScriptingEngine
    if not type(application) == win32com.client.CDispatch:
        SapGuiAuto = None
        return

    time.sleep(0.4)
    connection = application.Children(0)
    if not type(connection) == win32com.client.CDispatch:
        application = None
        SapGuiAuto = None
        return

    flag = 0
    while flag == 0:
        try:
            session = connection.Children(0)
            flag = 1
        except:
            time.sleep(0.5)

    if not type(session) == win32com.client.CDispatch:
        connection = None
        application = None
        SapGuiAuto = None
        return
    
    # time.sleep(2)
    # session.findById("wnd[0]/usr/txtRSYST-LANGU").text = "EN"
    # session.findById("wnd[0]").sendVKey(0)
    time.sleep(1)
    try:
        if session.findById('/app/con[0]/ses[0]/wnd[1]'):
            session.findById("wnd[0]").sendVKey(0)
    except:
        pass
    session.findById("wnd[0]").sendVKey(0)
    logger.info('登录成功')
    return session

  

posted @ 2023-08-24 11:47  CrossPython  阅读(50)  评论(0)    收藏  举报