Как автоматизировать 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();
}
}
}
}
Как вы можете видеть, я могу создать соединение, но я не знаю, как создать сеанс для графического интерфейса и начать вводить текст в полях. Любые примеры и образцы будут оценены.
Ответы
Ответ 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='#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, использовать их бок о бок и выбрать тот, который лучше подходит вашим потребностям.