Groovy: SoapUI: SoapUiAdb.groovy

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

    }
}

Tags