web-dev-qa-db-fra.com

Comment automatiser SAP GUI avec c #

Je souhaite automatiser une fenêtre SAP GUI en utilisant le langage C #. Je peux le faire dans VBScript mais la réutilisation du code est horrible. En plus, j'aimerais utiliser le filetage au lieu d'avoir 80 processus ou plus en cours d'exécution. Où puis-je trouver de la documentation et des exemples sur la façon de procéder? Voici le code avec lequel je travaille. Fondamentalement, le problème auquel je suis confronté est - comment puis-je me connecter à SAP GUI, puis créer une SAP GUI à la volée, puis commencer à effectuer des transactions et à saisir du texte dans certains champs.

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using White.Core.Factory;
using White.Core.UIItems.Finders;
using White.Core.InputDevices;
using System.Threading;
using System.Diagnostics;
using SAP.Connector;
using SAP;


namespace SAP_Automation
{
    class Program
    {
        public static void Main(string[] args)
        {
            string ExeSourceFile = @"C:\Program Files\SAP\SapSetup\setup\SAL\SapLogon.s8l";
            White.Core.Application _application;
            White.Core.UIItems.WindowItems.Window _mainWindow;

            var c = SAP.Connector.Connection.GetConnection("**");
            var c = new SAPConnection("ASHOST=*; GWHOST=*; GWSERV=*; ASHOST=*; SYSNR=00;USER=user; PASSWD=**;");
            c.Open();


            }
        }
    }
}

Comme vous pouvez le voir, je peux créer une connexion mais je ne sais pas comment créer une session sur l'interface graphique et commencer à saisir du texte dans les champs. Tous les exemples et échantillons seraient appréciés.

23
Luke101

Cela pourrait être du nécro-threading mais j'étais dans une situation similaire où je travaille. Nous avions besoin de SAP GUI Automation à des fins de test qui pourraient s'intégrer au reste de notre plate-forme d'automatisation locale écrite en C #. J'ai aidé à créer une proposition pour une solution qui tirait parti d'une bibliothèque fournie par SAP pour l'automatisation de l'interface graphique qui pourrait être utilisée comme base pour une couche d'automatisation pour SAP.

Le fichier suivant existe-t-il dans votre installation de fichier SAP? x:\Program Files\SAP\FrontEnd\SAPGui\sapfewse.ocx?

Si tel est le cas, ajoutez-le à Visual Studio (ou à tout autre élément IDE que vous utilisez) comme référence. Il s'agit essentiellement d'une bibliothèque de classes qui contient un tas d'objets spécifiques SAP qui vous permettront d'interagir avec. Il est très efficace car il expose la plupart de ce dont vous avez besoin de l'interface graphique SAP. Nous avons découvert dans d'autres tentatives que beaucoup d'objets dans SAP n'étaient pas disponibles.

C'est une première preuve de concept que j'ai faite. Démarrez SAP avec une chaîne de connexion, entrez les informations d'identification, accédez à un code de transaction.

using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
using SAPFEWSELib;

namespace SAPGuiAutomated
{
//created a class for the SAP app, connection, and session objects as well as for common methods. 
    public class SAPActive
    {
        public static GuiApplication SapGuiApp { get; set; }
        public static GuiConnection SapConnection { get; set; }
        public static GuiSession SapSession { get; set; }

        public static void openSap(string env)
        {
            SAPActive.SapGuiApp = new GuiApplication();

            string connectString = null;
            if (env.ToUpper().Equals("DEFAULT"))
            {
                connectString = "1.0 Test ERP (DEFAULT)";
            }
            else
            {
                connectString = env;
            }
            SAPActive.SapConnection = SAPActive.SapGuiApp.OpenConnection(connectString, Sync: true); //creates connection
            SAPActive.SapSession = (GuiSession)SAPActive.SapConnection.Sessions.Item(0); //creates the Gui session off the connection you made
        }

        public void login(string myclient, string mylogin, string mypass, string mylang)
        {
            GuiTextField client  = (GuiTextField)SAPActive.SapSession.ActiveWindow.FindByName("RSYST-MANDT", "GuiTextField");
            GuiTextField login  = (GuiTextField)SAPActive.SapSession.ActiveWindow.FindByName("RSYST-BNAME", "GuiTextField");
            GuiTextField pass  = (GuiTextField)SAPActive.SapSession.ActiveWindow.FindByName("RSYST-BCODE", "GuiPasswordField");
            GuiTextField language  = (GuiTextField)SAPActive.SapSession.ActiveWindow.FindByName("RSYST-LANGU", "GuiTextField");

            client.SetFocus();
            client.text = myclient;
            login.SetFocus();
            login.Text = mylogin;
            pass.SetFocus();
            pass.Text = mypass;
            language.SetFocus();
            language.Text = mylang; 

            //Press the green checkmark button which is about the same as the enter key 
            GuiButton btn = (GuiButton)SapSession.FindById("/app/con[0]/ses[0]/wnd[0]/tbar[0]/btn[0]");
            btn.SetFocus(); 
            btn.Press();

        }
    }
    //--------------------------//
    //main method somewhere else 
    public static void Main(string[] args)
    {
        SAPActive.openSAP("my connection string");
        SAPActive.login("10", "jdoe", "password", "EN");
        SAPActive.SapSession.StartTransaction("VA03");
    }

Vous avez raison, il n'y a pas beaucoup de documentation à ce sujet. Voici quelques sources qui m'ont aidé à démarrer

-Source d'origine de notre plan http://scn.sap.com/thread/1729689

-Documentation sur l'API (Pour VB et javascript mais les règles générales et les objets sont identiques). Lisez certainement la partie sur la hiérarchie SAP GUI Runtime. Cela répondra à beaucoup de questions. - http://www.synactive.com/download/sap%20gui%20scripting/sap%20gui%20scripting%20api.pdf

26
tyh

Vous pouvez automatiser tout type d'application (navigateur, bureau, Java, etc.) avec iPath . Voici un tutoriel sur la façon d'automatiser la saisie de données, la navigation dans les menus et le grattage d'écran sur SAP.

Vous pouvez

  • utilisez-le à partir du code (SDK). Il dispose d'un outil qui génère automatiquement du code C #
  • créer et exécuter des workflows (automatisation visuelle) directement depuis iPath Studio .

Voici un exemple du code généré automatiquement C #:

        // Attach window  menu
        UiNode wnd3 = UiFactory.Instance.NewUiNode().FromSelector("<wnd app='sap business one.exe' cls='&#35;32768' idx='1' />");            
        // Click 'Business Pa...' menu
        UiNode uiClickBusinessPamenu_3 = wnd3.FindFirst(UiFindScope.UI_FIND_DESCENDANTS, "<ctrl name='Business Partners' role='popup menu' /><ctrl automationid='2561' />");
        uiClickBusinessPamenu_3.Click(88, 9, UiClickType.UI_CLICK_SINGLE, UiMouseButton.UI_BTN_LEFT, UiInputMethod.UI_HARDWARE_EVENTS);            
        // Attach window 'SAP Business' 
        UiNode wnd4 = UiFactory.Instance.NewUiNode().FromSelector("<wnd app='sap business one.exe' cls='TMFrameClass' title='SAP Business One 9.0 - OEC Computers' />");            
        // Click 'Add' button
        UiNode uiClickAddbutton_4 = wnd4.FindFirst(UiFindScope.UI_FIND_DESCENDANTS, "<wnd cls='ToolbarWindow32' title='View' /><ctrl name='View' role='tool bar' /><ctrl name='Add' role='Push button' />");
        uiClickAddbutton_4.Click(13, 24, UiClickType.UI_CLICK_SINGLE, UiMouseButton.UI_BTN_LEFT, UiInputMethod.UI_HARDWARE_EVENTS);

Voici à quoi ressemble l'automatisation du workflow des menus, boutons ou saisie de SAP Business One:

enter image description here

Et enfin la documentation du SDK se trouve ici ... au cas où vous ne voudriez pas utiliser de workflows.

Remarque: Je travaille chez UiPath. Vous devriez également essayer d'autres outils d'automatisation comme Automation Anywhere, WinAutomation, Jacada, Selenium, Ranorex les utiliser côte à côte et choisir celui qui convient le mieux à vos besoins.

1
mbadit

Il est très important ici de comprendre ce que l'UI Automation peut faire et quelles sont ses limites. Il a été conçu pour automatiser les capacités d'une interface utilisateur. Vous pouvez cliquer sur des boutons, saisir du texte dans une zone de texte, déplacer des fenêtres, etc., tout ce qu'un utilisateur peut faire à l'aide de la souris et du clavier.

Ce qu'il peut pas faire est de combler le grand mur que le système d'exploitation met en place entre les processus. Un mur qui empêche un processus d'accéder à la mémoire d'un autre processus. Il s'agit d'une caractéristique de sécurité et de sûreté très importante. Pour sa part, il empêche un processus d'accéder à des données qui devraient être privées à un processus. Comme un mot de passe. Et pour un autre, il empêche un processus de plantage d'affecter d'autres processus qui s'exécutent sur la machine. Vous pouvez tuer un processus avec le Gestionnaire des tâches et tout continue à avancer joyeusement comme si de rien n'était.

En conséquence, la création d'un objet SAPConnection dans votre programme est une connexion que seul votre programme peut utiliser. Il n'y a aucun mécanisme pour transmettre cet objet à un autre processus avec UI Automation. Au mieux, vous pouvez utiliser les données que vous récupérez de la connexion pour affecter les boutons sur lesquels vous cliquez.

Le type d'interopérabilité de processus qui permettrait de partager des données entre processus est bien pris en charge dans .NET. Les approches de bas niveau sont les sockets et les canaux nommés, les niveaux supérieurs sont Remoting et WCF. Les programmes plus anciens prennent en charge COM Automation, Office en est un bon exemple. Cela nécessite cependant deux pour tango, les deux programmes doivent être écrits pour en profiter.

Donc, si vous essayez d'automatiser une application SAP existante et que cette application ne prend pas autrement en charge explicitement l'automatisation, le type pris en charge par un programme Office, vous êtes à peu près coincé avec simplement remplir des zones de texte et cliquer sur des boutons.

1
Hans Passant