C# 如何使用c实现SAP GUI的自动化#
我想使用C语言自动化SAP GUI窗口。我可以用VBScript来做,但是代码重用是可怕的。此外,我喜欢使用线程,而不是让80个或更多进程运行。我在哪里可以找到如何做到这一点的文档和样本?这是我正在使用的代码。基本上,我面临的问题是-如何连接到SAP GUI,然后动态创建SAP GUI,然后开始进行事务处理并在某些字段中输入文本C# 如何使用c实现SAP GUI的自动化#,c#,sap-gui,C#,Sap Gui,我想使用C语言自动化SAP GUI窗口。我可以用VBScript来做,但是代码重用是可怕的。此外,我喜欢使用线程,而不是让80个或更多进程运行。我在哪里可以找到如何做到这一点的文档和样本?这是我正在使用的代码。基本上,我面临的问题是-如何连接到SAP GUI,然后动态创建SAP GUI,然后开始进行事务处理并在某些字段中输入文本 using System; using System.Collections; using System.Collections.Generic; using Syst
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();
}
}
}
}
正如您所见,我可以创建一个连接,但我不知道如何创建到GUI的会话并开始在字段中输入文本。任何示例和示例都将不胜感激。了解UI自动化的功能及其局限性非常重要。它被设计成自动化用户界面的功能。您可以单击按钮、在文本框中输入文本、移动窗口等,用户可以使用鼠标和键盘执行任何操作 它所能做的是在操作系统在进程之间架起的高墙上架起一座桥梁。阻止进程访问另一进程内存的墙。这是一个非常重要的安全功能。例如,它阻止进程访问应该是进程私有的数据。就像密码一样。另一方面,它阻止崩溃进程影响机器上运行的其他进程。您可以使用任务管理器终止一个进程,而所有事情都会像什么都没发生一样愉快地进行着 这样做的结果是,在程序中创建SAPConnection对象是一个只有程序才能使用的连接。没有任何机制可以通过UI自动化将此对象传递给另一个进程。充其量,您可以使用从连接检索的数据来影响您单击的按钮 允许在进程之间共享数据的进程互操作在.NET中得到了很好的支持。低级方法是套接字和命名管道,高级方法是远程处理和WCF。旧的程序有COM自动化支持,Office就是一个很好的例子。然而,这需要两个探戈,两个程序都必须编写来利用它
因此,如果您试图自动化现有的SAP应用程序,而该应用程序没有明确支持自动化,即Office程序支持的自动化,那么您几乎只能填写文本框并单击按钮。这可能是necro线程,但我的工作环境与此类似。我们需要SAP GUI自动化来进行测试,以便与我们用C#编写的国产自动化平台的其余部分集成。我帮助创建了一个利用SAP提供的GUI自动化库的解决方案提案,该库可作为SAP自动化层的基础 SAP文件安装中是否存在以下文件?x:\Program Files\SAP\FrontEnd\SAPGui\sapfewse.ocx 如果是这样,请将其添加到VisualStudio(或您正在使用的任何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");
}
你是对的,关于这个问题没有很多文档。下面是一些帮助我开始学习的资料
-我们计划的原始来源
-API文档(用于VB和javascript,但一般规则和对象相同)。请务必阅读SAP GUI运行时层次结构上的部分。它会回答很多问题。
您可以使用自动化任何类型的应用程序(浏览器、桌面、java等)。 这里有一个 你可以
- 从代码(SDK)中使用它。它有一个自动生成C代码的工具
- 直接从创建和运行工作流(可视化自动化)
// 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);
//附加窗口菜单
UiNode wnd3=UiFactory.Instance.NewUiNode().FromSelector(“”);
//单击“商务文件…”菜单
UiNode uiClickBusinessPamenu_3=wnd3.FindFirst(UiFindScope.UI_FIND_substands,“”);
uiClickBusinessPamenu\u 3.单击(88,9,UiClickType.UI\u单击单个,UiMouseButton.UI\u BTN\u左侧,UiInputMethod.UI\u硬件\u事件);
//附加窗口“SAP业务”
UiNode wnd4=UiFactory.Instance.NewUiNode().FromSelector(“”);
//单击“添加”按钮
UiNode uiClickAddbutton_4=wnd4.FindFirst(UiFindScope.UI_FIND_substands,“”);
uiClickAddbutton_4.单击(13,24,UiClickType.UI_Click_SINGLE,UiMouseButton.UI_BTN_LEFT,UiInputMethod.UI_HARDWARE_EVENTS);
以下是SAP Business One菜单、按钮或键入的工作流自动化:
最后,SDK文档位于。。。以防您不想使用工作流
注意:我在UiPath工作。您还应该尝试其他自动化工具,如automation Anywhere、WinAutomation、Jacada、Selenium、Ranorex,将它们并排使用,并选择更适合您需要的工具。我很幸运地为第三方程序转换了VBScript代码,该程序在工作时通过COM进行通信。在很大程度上,当考虑到语言差异时,我能够直接从一个转换到另一个。您已经尝试过了吗?是的,我们有很多自动化SAP的VBScript代码。但是,我们无法建立到SAPGUI的连接。此VB代码不可翻译为c#。互联网上没有哪一个地方能给出这样的例子@Hans-是的,启用了脚本,我们能够自动化某些部分,但w