package com.gemalto.mcx.groovy
import org.openqa.selenium.By
import org.openqa.selenium.WebDriver
import org.openqa.selenium.WebElement
import org.openqa.selenium.firefox.FirefoxDriver
import org.openqa.selenium.firefox.FirefoxProfile
import org.openqa.selenium.support.ui.ExpectedCondition
import org.openqa.selenium.support.ui.WebDriverWait
import org.openqa.selenium.Dimension
import org.openqa.selenium.Point
class SoapUiAdb {
def log
def testRunner
WebDriver testBrowser
WebElement element
//def adbexe = "T:\\TestFramework\\EclipseADT\\sdk\\platform-tools\\adb.exe"
def adbexe = testRunner.testCase.testSuite.project.getPropertyValue("pathAdbExe")
def UrlQrCodeGen = testRunner.testCase.testSuite.project.getPropertyValue("UrlQrCodeGen")
/*
* Constructor
*/
def SoapUiAdb(log, testRunner){
this.log = log
this.testRunner = testRunner
log.info "In SoapUiAdb()"
log.info adbexe
}
def GetCoords(request){
log.info "Called: SoapUiAdb.GetCoords with: $request"
def coords
def thisDevice = testRunner.testCase.testSuite.getPropertyValue("C-DeviceModel")
log.info "Phone Model: $thisDevice"
if (thisDevice=='SG2'){
log.info "Coords on SG2"
switch(request){
// Login Screen
case "Login_Email" : coords = "110 360"; break;
case "Login_Password" : coords = "110 450"; break;
case "Login_LogIn" : coords = "235 560"; break;
case "Login_Register" : coords = "240 730"; break;
case "Login_ForgotPass" : coords = "240 680"; break;
case "Login_Help" : coords = "380 85" ; break;
//Passcode
case "Passcode_1" : coords = "85 440" ; break;
case "Passcode_2" : coords = "245 440"; break;
case "Passcode_3" : coords = "400 440"; break;
case "Passcode_4" : coords = "85 540" ; break;
case "Passcode_5" : coords = "245 540"; break;
case "Passcode_6" : coords = "400 540"; break;
case "Passcode_7" : coords = "85 640" ; break;
case "Passcode_8" : coords = "245 640"; break;
case "Passcode_9" : coords = "400 640"; break;
case "Passcode_0" : coords = "245 750"; break;
case "Passcode_DEL" : coords = "400 750"; break;
//ScanQR
case "Main_MyWallet" : coords = "240 240"; break;
case "MyWallet_UseWallet" : coords = "110 75" ; break;
case "MyWallet_Help" : coords = "360 645"; break;
case "MyWallet_SCAN" : coords = "130 760"; break;
case "MyWallet_SCAN_X" : coords = ""; break;
case "MyWallet_SHOW" : coords = "380 760"; break;
case "MyWallet_SHOW_X" : coords = ""; break;
case "MyWallet_CANCEL" : coords = "130 740"; break;
// Select Pocket
case "MyWallet_Pocket1" : coords = "000 000"; break;
case "MyWallet_Pocket2" : coords = "000 000"; break;
case "MyWallet_Pocket3" : coords = "000 000"; break;
case "MyWallet_Pocket4" : coords = "000 000"; break;
case "MyWallet_Pocket5" : coords = "000 000"; break;
//Select Transaction
case "MyWallet_Tx1" : coords = "200 200"; break;
case "MyWallet_Tx2" : coords = "200 320"; break;
case "MyWallet_Tx3" : coords = "200 430"; break;
case "MyWallet_Tx4" : coords = "200 520"; break;
case "MyWallet_Tx5" : coords = "200 640"; break;
case "MyWallet_Tx6" : coords = "200 755"; break;
//Buttons
case "MyWallet_PayNow" : coords = "360 740"; break;
case "MyWallet_Refund" : coords = "360 740"; break;
// Status Messages
case "MyWallet_SuccessOK" : coords = "240 680"; break;
case "MyWallet_GetTxOK" : coords = "360 770"; break;
case "MyWallet_GetWalletOK" : coords = "360 770"; break;
case "MyWallet_TxWaitContinue" : coords = "515 845"; break;
case "MyWallet_TxWaitCancel" : coords = "200 845"; break;
default : coords = "0 0"
}
}
if (thisDevice=='SG3'){
log.info "Coords on SG3"
switch(request){
// Basic Keys
case "Wallet_BACK" : coords = "55 100"; break;
// Login Screen
case "Login_Email" : coords = "170 480"; break;
case "Login_Password" : coords = "160 600"; break;
case "Login_LogIn" : coords = "330 740"; break;
case "Login_Register" : coords = "360 1225"; break;
case "Login_ForgotPass" : coords = "350 840"; break;
case "Login_Help" : coords = "595 110"; break;
//Passcode
case "Passcode_1" : coords = "125 790"; break;
case "Passcode_2" : coords = "360 790"; break;
case "Passcode_3" : coords = "600 790"; break;
case "Passcode_4" : coords = "125 940"; break;
case "Passcode_5" : coords = "360 940"; break;
case "Passcode_6" : coords = "600 940"; break;
case "Passcode_7" : coords = "125 1075"; break;
case "Passcode_8" : coords = "360 1075"; break;
case "Passcode_9" : coords = "600 1075"; break;
case "Passcode_0" : coords = "360 1200"; break;
case "Passcode_DEL" : coords = "600 1200"; break;
//ScanQR
case "Main_MyWallet" : coords = "350 300"; break;
case "MyWallet_UseWallet" : coords = "350 600"; break;
case "MyWallet_Help" : coords = "350 900"; break;
case "MyWallet_SCAN" : coords = "200 1230"; break;
case "MyWallet_SCAN_X" : coords = "635 235"; break;
case "MyWallet_SHOW" : coords = "560 1230"; break;
case "MyWallet_SHOW_X" : coords = "635 235"; break;
// Select Pocket
case "MyWallet_Pocket1" : coords = "300 250"; break;
case "MyWallet_Pocket2" : coords = "300 400"; break;
case "MyWallet_Pocket3" : coords = "300 530"; break;
case "MyWallet_Pocket4" : coords = ""; break;
case "MyWallet_Pocket5" : coords = ""; break;
//Select Transaction
case "MyWallet_Tx1" : coords = "200 200"; break;
case "MyWallet_Tx2" : coords = "200 320"; break;
case "MyWallet_Tx3" : coords = "200 430"; break;
case "MyWallet_Tx4" : coords = "200 520"; break;
case "MyWallet_Tx5" : coords = "200 640"; break;
case "MyWallet_Tx6" : coords = "200 755"; break;
//Buttons
case "MyWallet_PayNow" : coords = "550 1200"; break;
case "MyWallet_Refund" : coords = "550 1200"; break;
case "MyWallet_CANCEL" : coords = "200 1200"; break;
// Status Messages
case "MyWallet_PaySuccessOK" : coords = "365 900"; break;
case "MyWallet_PayErrorOK" : coords = "365 900"; break;
case "MyWallet_GetTxOK" : coords = "360 770"; break;
case "MyWallet_GetWalletOK" : coords = "360 770"; break;
case "MyWallet_AbortedOK" : coords = "360 770"; break;
case "MyWallet_NoPocket" : coords = "360 850"; break;
case "MyWallet_NoMPocket" : coords = "350 900"; break;
case "MyWallet_NoMPocket_ByPOS" : coords = "350 900"; break;
case "MyWallet_NoMPocket_ByWallet" : coords = "365 820"; break;
// Time Out Messages
case "MyWallet_TxWaitContinue" : coords = "515 845"; break;
case "MyWallet_TxWaitCancel" : coords = "200 845"; break;
default : coords = "000 000";
}
}
}
def Login(){
log.info "Called: Login()"
def command
def proc
def coords
def thisEmail = testRunner.testCase.testSuite.getPropertyValue("C-Email")
def thisPassword = testRunner.testCase.testSuite.getPropertyValue("C-Password")
log.info "Attempting Login with Email: $thisEmail, Password: $thisPassword"
log.info "Select Email text field"
coords = GetCoords('Login_Email')
log.info coords
command = """${adbexe} shell input tap ${coords}"""
proc = command.execute()
proc.waitFor()
log.info "Enter email"
command = """${adbexe} shell input text ${thisEmail}"""
proc = command.execute()
proc.waitFor()
log.info "NEXT for Password Field"
command = """${adbexe} shell input keyevent 66""" //4
proc = command.execute()
proc.waitFor()
log.info "Enter Password"
command = """${adbexe} shell input text ${thisPassword}"""
proc = command.execute()
proc.waitFor()
log.info "clear keyboard with BACK"
command = """${adbexe} shell input keyevent 4"""
proc = command.execute()
proc.waitFor()
Thread.sleep(1000)
log.info "Press Login button"
coords = GetCoords('Login_LogIn')
command = """${adbexe} shell input tap ${coords}"""
proc = command.execute()
proc.waitFor()
}
def Passcode(){
log.info "Called: Passcode"
def command
def proc
def coordsList = []
def coord
def thisPasscode = testRunner.testCase.testSuite.getPropertyValue("C-Passcode")
log.info "Attempting login with passcode: $thisPasscode"
// Parse thisPasscode and add coords to list
for (chr in thisPasscode){
switch (chr){
case "1": coord = GetCoords('Passcode_1'); break;
case "2": coord = GetCoords('Passcode_2'); break;
case "3": coord = GetCoords('Passcode_3'); break;
case "4": coord = GetCoords('Passcode_4'); break;
case "5": coord = GetCoords('Passcode_5'); break;
case "6": coord = GetCoords('Passcode_6'); break;
case "7": coord = GetCoords('Passcode_7'); break;
case "8": coord = GetCoords('Passcode_8'); break;
case "9": coord = GetCoords('Passcode_9'); break;
case "0": coord = GetCoords('Passcode_0'); break;
case "D": coord = GetCoords('Passcode_DEL'); break;
default: break;
}
coordsList.add(coord)
}
// Loop list and execute taps
for (tap in coordsList){
command = """${adbexe} shell input tap ${tap}"""
proc = command.execute()
proc.waitFor()
}
}
/*
* Args: POS, Wallet
*/
def ScanQR(scanType){
log.info "Called: ScanQR(${scanType})"
def command
def proc
def coordsList = []
def coords
// Create a new Firefox Profile to allow camera access
FirefoxProfile profile = new FirefoxProfile()
profile.setPreference("media.navigator.permission.disabled", true)
// Create a new instance of the Firefox driver
testBrowser = new FirefoxDriver(profile)
// Set Window position and size
testBrowser.manage().window().setPosition(new Point(20,20))
testBrowser.manage().window().setSize(new Dimension(750,500))
switch(scanType){
case "DisplayOnly":
// Open QRCode Browser
testBrowser.get(UrlQrCodeGen)
element = testBrowser.findElement(By.linkText("Generate"))
element.click()
Thread.sleep(30000)
break
case "ScanOnly":
// Open QRCode Browser
testBrowser.get(UrlQrCodeGen)
element = testBrowser.findElement(By.linkText("Scan"))
element.click()
Thread.sleep(30000)
break
case "POS":
// Payment QRCode on POS
def thisToken = testRunner.testCase.testSuite.getPropertyValue("A-TransactionToken")
// Open QRCode Browser
testBrowser.get(UrlQrCodeGen)
element = testBrowser.findElement(By.linkText("Generate"))
element.click()
// Type TOKEN
element = testBrowser.findElement(By.xpath("//textarea")).sendKeys("MCX.00000.${thisToken}")
Thread.sleep(5000)
coords = GetCoords('Main_MyWallet')
command = """${adbexe} shell input tap ${coords}"""
proc = command.execute()
proc.waitFor()
Thread.sleep(10000)
break
case "Wallet": // Payment QRCode on Wallet
coords = GetCoords('Main_MyWallet')
command = """${adbexe} shell input tap ${coords}"""
proc = command.execute()
proc.waitFor()
Thread.sleep(3000)
// SHOW QR Code on WalletApp
coords = GetCoords('MyWallet_SHOW')
command = """${adbexe} shell input tap ${coords}"""
proc = command.execute()
proc.waitFor()
// Open QRCode Generator
testBrowser.get(UrlQrCodeGen)
element = testBrowser.findElement(By.linkText("Scan"))
element.click()
// let browser enable webcam before looking for resultant Token
Thread.sleep(20000)
// pull token from browser results
element = testBrowser.findElement(By.className("content-text"))
def thisToken = element.getText().substring(10,22)
testBrowser.quit()
log.info thisToken
// push thisToken to the TestSuite properties
testRunner.testCase.testSuite.setPropertyValue( "A-TransactionToken", thisToken.toString() )
break
default: break
}
testBrowser.quit() //Close the browser
}
/*
* Args: Default,1,2,3,4,5
*/
def SelectPocket(pocket=1){
log.info "Called: SelectPocket"
def command
def proc
def coordsList = []
def coords
/*
* @TODO: Add Pocket Selection: If thisPocket=1,2,3,4,5
*
command = """${adbexe} shell input tap ${MyWallet_Pocket1}"""
command = """${adbexe} shell input tap ${MyWallet_Pocket2}"""
command = """${adbexe} shell input tap ${MyWallet_Pocket3}"""
command = """${adbexe} shell input tap ${MyWallet_Pocket4}"""
command = """${adbexe} shell input tap ${MyWallet_Pocket5}"""
*/
/*
* If thisPocket=Default
*/
switch(pocket){
case 1: coords = GetCoords('MyWallet_Pocket1'); break;
case 2: coords = GetCoords('MyWallet_Pocket2'); break;
case 3: coords = GetCoords('MyWallet_Pocket3'); break;
default: coords = GetCoords('MyWallet_Pocket1'); break;
}
command = """${adbexe} shell input tap ${coords}"""
proc = command.execute()
proc.waitFor()
coords = GetCoords('MyWallet_PayNow')
command = """${adbexe} shell input tap ${coords}"""
proc = command.execute()
proc.waitFor()
}
/*
* Args: 1,2,3,4,5,6,7
*/
def SelectTx(thisTx=1){
log.info "Called: SelectTx"
def command
def proc
def coordsList = []
def coords
/*
def MyWallet_Refund = "360 740"
def MyWallet_Tx1 = "200 200"
def MyWallet_Tx2 = "200 320"
def MyWallet_Tx3 = "200 430"
def MyWallet_Tx4 = "200 520"
def MyWallet_Tx5 = "200 640"
def MyWallet_Tx6 = "200 755"
*/
switch (thisTx){
case "1": coords = GetCoords('MyWallet_Tx1'); break;
case "2": coords = GetCoords('MyWallet_Tx2'); break;
case "3": coords = GetCoords('MyWallet_Tx3'); break;
case "4": coords = GetCoords('MyWallet_Tx4'); break;
case "5": coords = GetCoords('MyWallet_Tx5'); break;
default: break;
}
//coords = GetCoords('MyWallet_Tx1')
command = """${adbexe} shell input tap ${coords}"""
proc = command.execute()
proc.waitFor()
Thread.sleep(7000)
coords = GetCoords('MyWallet_Refund')
command = """${adbexe} shell input tap ${coords}"""
proc = command.execute()
proc.waitFor()
}
/*
* Basic UI Parts
*/
def Wallet_Back(){
log.info "Called: Wallet_Back"
def coords = GetCoords('Wallet_BACK')
def command = """${adbexe} shell input tap ${coords}"""
def proc = command.execute()
proc.waitFor()
}
/*
* Acknowledging Messages and Pop-Ups
*/
def PaySuccessOK(){
log.info "Called: PaySuccessOK"
def coords = GetCoords('MyWallet_PaySuccessOK')
def command = """${adbexe} shell input tap ${coords}"""
def proc = command.execute()
proc.waitFor()
}
def PayErrorAck(){
log.info "Called: PayErrorAck"
def coords = GetCoords('MyWallet_PayErrorOK')
def command = """${adbexe} shell input tap ${coords}"""
def proc = command.execute()
proc.waitFor()
}
/*
* Method to control adb actions
* Should replace all other Message methods
* Pass the message constant to this method
* It will get coords and perform action
*
*/
def AckMessage(thisMessage="default"){
log.info "Called AckMessage(${thisMessage})"
def coords = GetCoords(thisMessage)
def command = """${adbexe} shell input tap ${coords}"""
def proc = command.execute()
proc.waitFor()
}
def Navigate(thisButton="default"){
log.info "Called Navigate(${thisButton})"
def coords = GetCoords(thisButton)
def command = """${adbexe} shell input tap ${coords}"""
def proc = command.execute()
proc.waitFor()
}
def Select(thisOption="default"){
log.info "Called Select(${thisOption})"
def coords = GetCoords(thisOption)
def command = """${adbexe} shell input tap ${coords}"""
def proc = command.execute()
proc.waitFor()
}
def AckMessage_TxId(){
log.info "Called: AckMessage_TxId"
def coords = GetCoords('MyWallet_GetTxOK')
def command = """${adbexe} shell input tap ${coords}"""
def proc = command.execute()
proc.waitFor()
}
def AckMessage_WalletId(){
log.info "Called: AckMessage_WalletId"
def coords = GetCoords('MyWallet_GetWalletOK')
def command = """${adbexe} shell input tap ${coords}"""
def proc = command.execute()
proc.waitFor()
}
def AckMessage_TxAborted(){
log.info "Called: AckMessage_TxAborted"
def coords = GetCoords('MyWallet_AbortedOK')
def command = """${adbexe} shell input tap ${coords}"""
def proc = command.execute()
proc.waitFor()
}
def AckMessage_NoMPocket(){
log.info "Called: AckMessage_NoMPocket"
def coords = GetCoords('MyWallet_NoMPocket')
def command = """${adbexe} shell input tap ${coords}"""
def proc = command.execute()
proc.waitFor()
}
def AckMessage_NoMPocket_ByPOS(){
log.info "Called: AckMessage_NoMPocket"
def coords = GetCoords('MyWallet_NoMPocket_ByPOS')
def command = """${adbexe} shell input tap ${coords}"""
def proc = command.execute()
proc.waitFor()
}
def AckMessage_NoMPocket_ByWallet(){
log.info "Called: AckMessage_NoMPocket"
def coords = GetCoords('MyWallet_NoMPocket_ByWallet')
def command = """${adbexe} shell input tap ${coords}"""
def proc = command.execute()
proc.waitFor()
}
def AckMessage_NoPocket(){
log.info "Called: AckMessage_NoPocket"
def coords = GetCoords('MyWallet_NoPocket')
def command = """${adbexe} shell input tap ${coords}"""
def proc = command.execute()
proc.waitFor()
}
def AckMessage_TxWaitContinue(){
log.info "Called: AckMessage_TxWaitContinue"
def coords = GetCoords('MyWallet_TxWaitContinue')
def command = """${adbexe} shell input tap ${coords}"""
def proc = command.execute()
proc.waitFor()
}
def AckMessage_TxWaitCancel(){
def coords = GetCoords('MyWallet_TxWaitCancel')
def command = """${adbexe} shell input tap ${coords}"""
def proc = command.execute()
proc.waitFor()
}
/*
* NOT USED===============================================
*/
def QRCodeBrowser(){
// Create a new instance of the Firefox driver
WebDriver driver = new FirefoxDriver()
driver.manage().window().setPosition(new Point(0,0))
driver.manage().window().setSize(new Dimension(750,500))
//driver.window.setSize(500,500)
//driver.setSize(400,800)
// Open QRCode Generator
driver.get(UrlQrCodeGen)
WebElement element = driver.findElement(By.linkText("Generate"))
element.click()
def thisToken = testRunner.testCase.testSuite.getPropertyValue("A-TransactionToken")
element = driver.findElement(By.xpath("//textarea")).sendKeys("MCX.00000.${thisToken}")
Thread.sleep(5000)
}
/*
* Example usage of ADB SHELL
*/
def AdbShellExec(){
//A string can be executed in the standard java way:
def command = """${adbexe} shell input keyevent 3"""// Create the String
def proc = command.execute() // Call *execute* on the string
proc.waitFor() // Wait for the command to finish
}
}