Parameterized Test Object on the fly


#1

I have made a demo here:

Problem to solve

Let’s imagine you have a target Web page which contains a menu with 20 <ul> elements each of which contains 10 <li><a href="..">label</a></li>. The way how

    and
  • elements are marked up is uniform. You want to verify the label texts against some expected data. You will use Katalon Studio to do the test.

    Katalon’s documents would suggest to you to create a set of Test Objects in the Object Repository using the Spy Object. However, nobody would like to create 20 * 10 = 200 entries in the Object Repository with the Spy Object tool.


    My solution

    The demo shows you :

    1. Test case creates a Test Object instance on the fly without storing it into the Object Repository
    2. Test case reuses the Test Object instance multiple times to get access to multiple elements in the target Web page
    3. Test case makes the selector of the Test Object parameterized — it interpolates the place holder ${index} in the selector expression with concrete values: 1,2,3…,10

    I would call this method Parameterized Test Object on the fly. This method works well. Provided that a tester has sound knowledge of XPath or CSS selector, this method is easy to implement.

    I was inspired by the discussion by Katalon enthusiasts in the Katalon forum:

    What the demo does

    The demo verifies the texts displayed as the label of TABs in the target Web pages.

    My Test Case is as follows:

    import com.kms.katalon.core.model.FailureHandling as FailureHandling
    import com.kms.katalon.core.testobject.ConditionType as ConditionType
    import com.kms.katalon.core.testobject.TestObject as TestObject
    import com.kms.katalon.core.webui.keyword.WebUiBuiltInKeywords as WebUI
    WebUI.openBrowser('')
    WebUI.navigateToUrl('http://automationpractice.com/index.php?')
    def headerLogo = new TestObject('header_logo')
    headerLogo.addProperty('xpath', ConditionType.EQUALS, '//div[@id="header_logo"]')
    WebUI.verifyElementPresent(headerLogo, 10, FailureHandling.STOP_ON_FAILURE)
    WebUI.verifyElementVisible(headerLogo, FailureHandling.STOP_ON_FAILURE)
    def expected = ['WOMEN', 'DRESSES', 'T-SHIRT']
    def engine = new groovy.text.SimpleTemplateEngine()
    String template = '//div[@id="block_top_menu"]/ul/li[${index}]/a'
    TestObject blockTopMenu = new TestObject('block_top_menu')
    for (int i = 0; i < expected.size(); i++) {
    	String expr = engine.createTemplate(template).make(['index':i+1]).toString()	WebUI.comment("expr=${expr}")
    	blockTopMenu.addProperty('xpath', ConditionType.EQUALS, expr)
    	String text = WebUI.getText(blockTopMenu, FailureHandling.STOP_ON_FAILURE)
    	WebUI.comment("text=${text}")
    	// check if displayed as expected
    	WebUI.verifyEqual(text, expected[i], FailureHandling.CONTINUE_ON_FAILURE)
    }
    WebUI.closeBrowser()
    

    When I run the test case I got the following output in the log:

    [PASSED] - Actual object 'WOMEN' and expected object 'WOMEN' are equal
     ...[PASSED] - Actual object 'DRESSES' and expected object 'DRESSES' are equal
     ...[FAILED] - Unable to verify equal between actual object 'T-SHIRTS' and expected object 'T-SHIRT'
    

    WOMEN_DRESS_T-SHIRTS.png


How to handle dynamic xpath ?
#2

Great work!


#3

Upvoted. Sweet!


#4

Upvoted. Nice job!


#5

I could not find com.kms.katalon.core.testobject.TestObject#setProperty(). So I wrote as this:

        blockTopMenu.addProperty('xpath', ConditionType.EQUALS, expr)

addProperty ? It worked but looks strange.


#6

Hi,

I tested your code sample and it works great. I tried to adapt it to my script but I always get this message error:

2019-08-16 10:20:11.995 ERROR c.k.katalon.core.main.TestCaseExecutor - :x: Test Cases/Reto_ComprobanteContable/TC_EditarComprobante FAILED.
Reason:
groovy.lang.MissingPropertyException: No such property: ConditionType for class: Script1565725786672
at TC_EditarComprobante.run(TC_EditarComprobante:46)

I debbuged my script and it always fail at this line:

              blockTopMenu.addProperty('xpath', ConditionType.EQUALS, expr)

I don’t know what am I doing wrong and I’ve tried everything to work with dynamic objects in Katalon. If you could help me, I’d appreciate that so much.


#7

@melissaQA

Please check if your test case script has the following line.

import com.kms.katalon.core.testobject.ConditionType 

#8

Hi @kazurayam, I had that line in my code but I replaced it for this one (as in your sample code):
import com.kms.katalon.core.testobject.ConditionType as ConditionType
After that, the error message just disappeared (I didn’t understand why).

Thanks for your help! :slight_smile:


#9

(I didn’t understand why).

You should.

http://www.groovy-lang.org/structure.html tells:

Imports
In order to refer to any class you need a qualified reference to its package. Groovy follows Java’s notion of allowing import statement to resolve class references.

Simple import
A simple import is an import statement where you fully define the class name along with the package. For example the import statement import groovy.xml.MarkupBuilder in the code below is a simple import which directly refers to a class inside a package.

// importing the class MarkupBuilder
import groovy.xml.MarkupBuilder

// using the imported class to create an object
def xml = new MarkupBuilder()

assert xml != null