In my custom keyword, I currently have the following (this does not work):
public void setChoiceSelect(TestObject obj, String value) {
# parent has null and error on following line
TestObject parent = obj.getParentObject().getParentObject()
TestObject dropdown = parent.findXpath('//div[contains(@class, "choices__list") and contains(@class, "choices__list--single")]')
TestObject dropdownlist = parent.findXpath('//div[contains(@class, "choices__list") and contains(@class, "choices__list--dropdown")]')
TestObject item = dropdownlist.findXpath('//div[@data-value="' + value + '"]')
# click on dropdown
# wait for dropdownlist to show
# click on item
}
I need to do the following for my test in my keyword setChoiceSelect:
pass my TestObject, the html select which is hidden
click on the "<div class="choices__list choices__list--single">" with location relative to the passed select
wait for β<div class="choices__list choices__list--dropdown" aria-expanded="false">β to show with location relative to passed select
click on β<div id="choices--code-item-choice-2" data-value="CODE1" ...>β with location relative to passed select
My current error in my keyword setChoiceSelect is: TestObject parent = obj.getParentObject() return null. The passed obj is good, but getParentObject() returns null and I donβt know why.
Using my passed TestObject how do I get my other related elements that I need to click on and wait to be shown?
2023-09-01 08:32:52.742 INFO c.k.katalon.core.main.TestCaseExecutor - --------------------
2023-09-01 08:32:52.745 INFO c.k.katalon.core.main.TestCaseExecutor - START Test Cases/TC1
Test Cases/TC1
[:]
tObj=TestObject - 'Object Repository/sub/a_Make_Appointment'
tObj.getClass().getName()=com.kms.katalon.core.testobject.TestObject
tObj.getParentObject()=null
tObj.getParentObject().getClass().getName()=org.codehaus.groovy.runtime.NullObject
2023-09-01 08:32:53.530 ERROR c.k.katalon.core.main.TestCaseExecutor - β Test Cases/TC1 FAILED.
Reason:
java.lang.NullPointerException: Cannot invoke method getParentObject() on null object
at TC1.printTestObject(TC1:10)
at Script1693523810480$printTestObject.callCurrent(Unknown Source)
at TC1.run(TC1:13)
at com.kms.katalon.core.main.ScriptEngine.run(ScriptEngine.java:194)
at com.kms.katalon.core.main.ScriptEngine.runScriptAsRawText(ScriptEngine.java:119)
at com.kms.katalon.core.main.TestCaseExecutor.runScript(TestCaseExecutor.java:448)
at com.kms.katalon.core.main.TestCaseExecutor.doExecute(TestCaseExecutor.java:439)
at com.kms.katalon.core.main.TestCaseExecutor.processExecutionPhase(TestCaseExecutor.java:418)
at com.kms.katalon.core.main.TestCaseExecutor.accessMainPhase(TestCaseExecutor.java:410)
at com.kms.katalon.core.main.TestCaseExecutor.execute(TestCaseExecutor.java:285)
at com.kms.katalon.core.main.TestCaseMain.runTestCase(TestCaseMain.java:144)
at com.kms.katalon.core.main.TestCaseMain.runTestCase(TestCaseMain.java:135)
at com.kms.katalon.core.main.TestCaseMain$runTestCase$0.call(Unknown Source)
at TempTestCase1693524767255.run(TempTestCase1693524767255.groovy:25)
2023-09-01 08:32:53.574 ERROR c.k.katalon.core.main.TestCaseExecutor - β Test Cases/TC1 FAILED.
Reason:
java.lang.NullPointerException: Cannot invoke method getParentObject() on null object
at TC1.printTestObject(TC1:10)
at Script1693523810480$printTestObject.callCurrent(Unknown Source)
at TC1.run(TC1:13)
at com.kms.katalon.core.main.ScriptEngine.run(ScriptEngine.java:194)
at com.kms.katalon.core.main.ScriptEngine.runScriptAsRawText(ScriptEngine.java:119)
at com.kms.katalon.core.main.TestCaseExecutor.runScript(TestCaseExecutor.java:448)
at com.kms.katalon.core.main.TestCaseExecutor.doExecute(TestCaseExecutor.java:439)
at com.kms.katalon.core.main.TestCaseExecutor.processExecutionPhase(TestCaseExecutor.java:418)
at com.kms.katalon.core.main.TestCaseExecutor.accessMainPhase(TestCaseExecutor.java:410)
at com.kms.katalon.core.main.TestCaseExecutor.execute(TestCaseExecutor.java:285)
at com.kms.katalon.core.main.TestCaseMain.runTestCase(TestCaseMain.java:144)
at com.kms.katalon.core.main.TestCaseMain.runTestCase(TestCaseMain.java:135)
at com.kms.katalon.core.main.TestCaseMain$runTestCase$0.call(Unknown Source)
at TempTestCase1693524767255.run(TempTestCase1693524767255.groovy:25)
Test Cases/TC1
ERROR
2023-09-01 08:32:53.612 INFO c.k.katalon.core.main.TestCaseExecutor - END Test Cases/TC1
Please note that
TestObject.getParentObject() returned null.
TestObject.getParentObject().getParentObject() raised an Exception
public class TestObject implements SelectorCollector, ITestObject {
private TestObject parentObject; // Typically is parent Frame
...
/**
* Get the parent object of this test object
*
* @return the parent object of this test object
*/
public TestObject getParentObject() {
return parentObject;
}
/**
* Set the parent object of this test object
*
* @param parentObject the parent object to set
*/
public void setParentObject(TestObject parentObject) {
this.parentObject = parentObject;
}
Please find that TestObject.getParentObject() will return the setting of the section labeled βHave parent object?β. If you leave this section to be βNoβ, then TestObject.getParentObject() will return null.
Alright, you sent me in the right direction and I am able to make what I need work by doing the following.
I have Object to find the parent element: //form//select[@id="code"]["hidden"]/parent::div/parent::div
I call my custom Keyword with my TestObject: CustomKeywords.'idweb.IdwebCustom.setChoiceSelect'(findTestObject("selectcodeparent"), GlobalVariable.jobcode)
I have my custom Keyword:
public void setChoiceSelect(TestObject obj, String value) {
WebElement codeselect = WebUiCommonHelper.findWebElement(obj, 2)
WebElement dropdown = codeselect.findElement(By.xpath('//div[contains(@class, "choices__list") and contains(@class, "choices__list--single")]'))
WebElement dropdownlist = codeselect.findElement(By.xpath('//div[contains(@class, "choices__list") and contains(@class, "choices__list--dropdown")]'))
WebElement dropdownitem = codeselect.findElement(By.xpath('//div[@data-value="' + value + '"]'))
dropdown.click()
WebUI.delay(1)
dropdownitem.click()
}