Technology Blog Posts by Members
Explore a vibrant mix of technical expertise, industry insights, and tech buzz in member blogs covering SAP products, technology, and events. Get in the mix!
cancel
Showing results for 
Search instead for 
Did you mean: 
Stefan-Schnell
Active Contributor
33,480
More and more loses the SAP GUI for Windows his unique position as primary UI and also more and more are desktop applications replaced with web applications. The SAP GUI for Windows offers for automation approaches the SAP GUI Scripting, a consolidated and technical reliable way. For web browser wrotes Former Member in his great blog about START (Simple Test Automation for Regression Tests) an UI Automation Framework to automate the testing of application. START bases on Selenium WebDrivers. So I think it could be advantageous to combine SAP GUI Scripting and Selenium.

 

Java


So I advanced my Scripting Tracker to create also Java code, to offer the possibilty to combine SAP GUI Scripting on this language platform. To use SAP GUI Scripting with Java you need the Java COM Bridge (JaCoB).

For the web activities I use in my context the chrome web driver, an x86 application, because I use the Chrome browser. So it is necessary to use the x86 (i586) version of the JDK, also for the SAP GUI for Windows. To record the activities on the web browser I use Firefox with Selenium IDE. You see it is a very heterogeneous development environment. But after all, it works. Here an example code how to combine SAP GUI for Windows activities with any activities in a web browser. In the example I combine information from the TAC SE16 from the table DEMO_CR_CUSTOMRS with a web dynpro application DEMO_WD_CAR_RENTAL - this is not really useful but shows the horizons.
//-Begin----------------------------------------------------------------

package de.stschnell;

//-Import-------------------------------------------------------------
import com.jacob.activeX.*;
import com.jacob.com.*;
import java.util.HashMap;
import java.util.Map;
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.remote.*;

public class SAPGUIScriptingWithSelenium {

public static void main(String[] args) {

//-Variables--------------------------------------------------------
ActiveXComponent SAPROTWr, GUIApp, Connection, Session, Obj;
Dispatch ROTEntry;
Variant Value, ScriptEngine;
String cnt = "0";

ComThread.InitSTA();

//-Set SapGuiAuto = GetObject("SAPGUI")-----------------------------
SAPROTWr = new ActiveXComponent("SapROTWr.SapROTWrapper");
try {
ROTEntry = SAPROTWr.invoke("GetROTEntry", "SAPGUI").toDispatch();
//-Set application = SapGuiAuto.GetScriptingEngine----------------
ScriptEngine = Dispatch.call(ROTEntry, "GetScriptingEngine");
GUIApp = new ActiveXComponent(ScriptEngine.toDispatch());

//-Set connection = application.Children(0)-----------------------
Connection = new ActiveXComponent(
GUIApp.invoke("Children", 0).toDispatch()
);
//-Set session = connection.Children(0)---------------------------
Session = new ActiveXComponent(
Connection.invoke("Children", 0).toDispatch()
);

//-Open SE16------------------------------------------------------
Obj = new ActiveXComponent(Session.invoke("findById",
"wnd[0]/tbar[0]/okcd").toDispatch());
Obj.setProperty("text", "/nse16");
Obj = new ActiveXComponent(Session.invoke("findById",
"wnd[0]").toDispatch());
Obj.invoke("sendVKey", 0);

//-Open selection view for table DEMO_CR_CUSTOMRS-----------------
Obj = new ActiveXComponent(Session.invoke("findById",
"wnd[0]/usr/ctxtDATABROWSE-TABLENAME").toDispatch());
Obj.setProperty("text", "DEMO_CR_CUSTOMRS");
Obj = new ActiveXComponent(Session.invoke("findById",
"wnd[0]/tbar[1]/btn[7]").toDispatch());
Obj.invoke("press");

//-Open dialog "Number of Entries"--------------------------------
Obj = new ActiveXComponent(Session.invoke("findById",
"wnd[0]/tbar[1]/btn[31]").toDispatch());
Obj.invoke("press");

//-Get the number of entries--------------------------------------
Obj = new ActiveXComponent(Session.invoke("findById",
"wnd[1]/usr/txtG_DBCOUNT").toDispatch());
Value = Obj.getProperty("text");
cnt = Value.toString();

} catch (Exception e) {
System.out.println(
e.getMessage().toString()
);
} finally {
ComThread.Release();
}


//-If number of entries > 0-----------------------------------------
if (cnt != "0") {

//-Set path to chromedriver---------------------------------------
System.setProperty(
"webdriver.chrome.driver",
"C:/Program Files/Selenium/chromedriver.exe");

//-Set path to chrome browser-------------------------------------
Map<String, Object> chromeOptions = new HashMap<String, Object>();
chromeOptions.put("binary", "C:/Program Files/Google/Chrome/Application/chrome.exe");
DesiredCapabilities capabilities = DesiredCapabilities.chrome();
capabilities.setCapability(ChromeOptions.CAPABILITY, chromeOptions);

//-Opens a web browser window-------------------------------------
WebDriver driver = new ChromeDriver(capabilities);

//-Do your activities in the browser------------------------------
driver.get("http://nsp.stschnell.de:8630/sap/bc/webdynpro/sap/demo_wd_car_rental");
driver.findElement(By.id("WD1C")).clear();
driver.findElement(By.id("WD1C")).sendKeys("00000001");
driver.findElement(By.cssSelector("span.urBtnCntTxt")).click();

driver.close();
driver.quit();

}

System.exit(0);

}

}

//-End------------------------------------------------------------------

Here Scripting Tracker which  records Java code from the SAP GUI for Windows activities:



Here Firefox with Selenium IDE to record web activities:



Here the SAP GUI for Windows with SAP GUI Scripting and Eclipse in debug mode side by side:



Here Chrome with Eclipse in debug mode side by side:



 

PowerShell


A longer time ago I wrote here about the possibility to use PowerShell with SAP GUI Scripting. Selenium offers, besides Java, also dotNET libraries. On this way it is possible to combine SAP GUI Scripting with the WebDriver also on the base of PowerShell.

Here the same example in PowerShell.
#-Begin-----------------------------------------------------------------

#-Includes------------------------------------------------------------
."$PSScriptRoot\COM.ps1"

#-Set SapGuiAuto = GetObject("SAPGUI")--------------------------------
$SapGuiAuto = Get-Object( , "SAPGUI")
If ($SapGuiAuto -isnot [__ComObject]) {
Exit
}

#-Set application = SapGuiAuto.GetScriptingEngine---------------------
$application = Invoke-Method $SapGuiAuto "GetScriptingEngine"
If ($application -isnot [__ComObject]) {
Free-Object $SapGuiAuto
Exit
}

#-Set connection = application.Children(0)----------------------------
$connection = Get-Property $application "Children" @(0)
If ($connection -eq $Null) {
Free-Object $SapGuiAuto
Exit
}

#-Set session = connection.Children(0)--------------------------------
$session = Get-Property $connection "Children" @(0)
If ($session -eq $Null) {
Free-Object $SapGuiAuto
Exit
}

#-Open SE16-----------------------------------------------------------
$ID = Invoke-Method $session "findById" @("wnd[0]/tbar[0]/okcd")
Set-Property $ID "text" @("/nse16")
$ID = Invoke-Method $session "findById" @("wnd[0]")
Invoke-Method $ID "sendVKey" @(0)

#-Open selection view for table DEMO_CR_CUSTOMRS----------------------
$ID = Invoke-Method $session "findById" @("wnd[0]/usr/ctxtDATABROWSE-TABLENAME")
Set-Property $ID "text" @("DEMO_CR_CUSTOMRS")
$ID = Invoke-Method $session "findById" @("wnd[0]/tbar[1]/btn[7]")
Invoke-Method $ID "press"

#-Open dialog "Number of Entries"-------------------------------------
$ID = Invoke-Method $session "findById" @("wnd[0]/tbar[1]/btn[31]")
Invoke-Method $ID "press"

#-Get the number of entries-------------------------------------------
$ID = Invoke-Method $session "findById" @("wnd[1]/usr/txtG_DBCOUNT")
$Value = Get-Property $ID "text"

#-If number of entries > 0--------------------------------------------
If ($Value -ne 0) {

#-Load libraries----------------------------------------------------
[System.Reflection.Assembly]::LoadFrom("C:\Program Files\Selenium\Selenium.WebDriverBackedSelenium.dll")
[System.Reflection.Assembly]::LoadFrom("C:\Program Files\Selenium\WebDriver.dll")
[System.Reflection.Assembly]::LoadFrom("C:\Program Files\Selenium\WebDriver.Support.dll")

#-Set path to chrome browser----------------------------------------
$Options = New-Object OpenQA.Selenium.Chrome.ChromeOptions
$Options.BinaryLocation = "C:/Program Files/Google/Chrome/Application/chrome.exe"

#-Opens a web browser window----------------------------------------
$WebDriver = New-Object OpenQA.Selenium.Chrome.ChromeDriver("C:\Program Files\Selenium", $Options)
$WebDriver.Url = "http://nsp.stschnell.de:8630/sap/bc/webdynpro/sap/demo_wd_car_rental"

#-Do your activities in the browser---------------------------------
$WebDriver.FindElementById("WD1C").Clear()
$WebDriver.FindElementById("WD1C").SendKeys("00000001")
$WebDriver.FindElementByCssSelector("span.urBtnCntTxt").click()

$WebDriver.Close()
$WebDriver.Quit()

}

#-End-------------------------------------------------------------------

 

On this ways is it possible to combine SAP GUI Scripting with e.g. WebDynpro or UI5 applications. So you can reach a higher integration level in your automation approaches.
51 Comments