Подтвердить что ты не робот

Как автоматизировать SAP GUI с помощью С#

Я хотел бы автоматизировать окно SAP GUI с использованием языка С#. Я могу сделать это в VBScript, но повторное использование кода ужасно. Кроме того, Id нравится использовать потоки вместо 80 или более запущенных процессов. Где я могу найти документацию и образцы того, как это сделать? Вот код, с которым я работаю. В основном, проблема, с которой я столкнулся, - это как создать соединение с SAP GUI, а затем создать графический интерфейс SAP "на лету", а затем начать делать транзакции и вводить текст в некоторых полях.

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();


            }
        }
    }
}

Как вы можете видеть, я могу создать соединение, но я не знаю, как создать сеанс для графического интерфейса и начать вводить текст в полях. Любые примеры и образцы будут оценены.

4b9b3361

Ответ 1

Это может быть некрополя, но я был в похожей ситуации, когда я работаю. Нам понадобилась SAP GUI Automation для целей тестирования, которые могли бы интегрироваться с остальной частью нашей встроенной платформы автоматизации, написанной на С#. Я помог создать предложение для одного решения, которое использовало предоставленную SAP библиотеку для автоматизации графического интерфейса, которая могла бы использоваться в качестве основы для уровня автоматизации для SAP.

Имеет ли следующий файл в вашей файловой системе SAP? x:\Program Files\SAP\FrontEnd\SAPGui\sapfewse.ocx?

Если это так, добавьте его в Visual Studio (или любую другую IDE, которую вы используете) в качестве ссылки. Это в основном библиотека классов, которая содержит кучу конкретных объектов SAP, которые позволят вам взаимодействовать. Он очень эффективен, потому что он предоставляет большую часть того, что вам нужно из SAP GUI. В других попытках мы обнаружили, что многие объекты в SAP недоступны.

Это раннее доказательство того, что я сделал. Запустите SAP с помощью строки подключения, введите учетные данные, перейдите к коду транзакции.

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");
    }

Вы правы, документации по этому вопросу недостаточно. Ниже приведены несколько источников, которые помогли мне начать работу

-Оригинальный источник нашего плана http://scn.sap.com/thread/1729689

-Документация по API (для VB и javascript, но общие правила и объекты идентичны). Определенно прочитайте часть иерархии Runtime SAP GUI. Это ответит на множество вопросов. http://www.synactive.com/download/sap%20gui%20scripting/sap%20gui%20scripting%20api.pdf

Ответ 2

Здесь очень важно понять, что может сделать UI Automation и каковы его ограничения. Он был разработан для автоматизации возможностей пользовательского интерфейса. Вы можете нажимать кнопки, вводить текст в текстовое поле, перемещать окна и т.д., Независимо от того, что пользователь может делать с помощью мыши и клавиатуры.

Что это может сделать не - это мост высокой стены, который операционная система создает между процессами. Стена, которая препятствует процессу доступа к памяти другого процесса. Это очень важная функция безопасности и безопасности. Это позволяет предотвратить процесс доступа к данным, которые должны быть приватными для процесса. Как пароль. А для другого он останавливает процесс сбоя, влияя на другие процессы, которые запускаются на машине. Вы можете убить процесс с помощью диспетчера задач, и все хорошо двигается по дороге, как будто ничего не произошло.

Следствием этого является то, что создание объекта SAPConnection в вашей программе - это соединение, которое может использовать только ваша программа. Не существует механизма, чтобы каким-то образом передать этот объект другому процессу с помощью UI Automation. В лучшем случае вы можете использовать данные, которые вы извлекаете из соединения, чтобы повлиять на то, какие кнопки вы нажимаете.

Тип взаимодействия между процессами, позволяющий обмениваться данными между процессами, хорошо поддерживается в .NET. Подходы низкого уровня - это сокеты и именованные каналы, на высоком уровне - Remoting и WCF. Более старые программы поддерживают COM Automation, и это хороший пример. Для этого требуется два танго, обе программы должны быть написаны, чтобы воспользоваться им.

Итак, если вы пытаетесь автоматизировать существующее приложение SAP, и это приложение явно не поддерживает автоматизацию, такую, какую поддерживает программа Office, то вы в значительной степени застряли в заполнении текстовых полей и нажатий кнопок.

Ответ 3

Вы можете автоматизировать любое приложение (браузер, рабочий стол, java и т.д.) с помощью UiPath. Здесь учебник о том, как автоматизировать ввод данных, навигацию по меню и скрипинг экрана в SAP.

Вы можете

  • используйте его из кода (SDK). У него есть инструмент, который автоматически генерирует код С#.
  • создавать и запускать рабочие процессы (визуальная автоматизация) непосредственно из UiPath Studio.

Вот пример кода сгенерированного С#:

        // 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);

Вот как выглядит автоматизация рабочего процесса в меню SAP Business One, кнопках или набрав:

enter image description here

И наконец, документация SDK находится здесь... в случае, если вы не хотите использовать рабочие процессы.

Примечание: Я работаю в UiPath. Вы также должны попробовать другие инструменты автоматизации, такие как Automation Anywhere, WinAutomation, Jacada, Selenium, Ranorex, использовать их бок о бок и выбрать тот, который лучше подходит вашим потребностям.