如何在Katalon Studio中获取元素的所有子元素

时间:2019-03-18 17:55:19

标签: selenium katalon-studio

我想在根div元素中找到所有元素。

这就是我在做什么:

@Keyword
public boolean verifySlotsOrder(int numOfSlots){
WebDriver driver = DriverFactory.getWebDriver()
WebElement slotsGrid =  driver.findElement(By.id('js-' + numOfSlots + '-grid'))
List<WebElement> children = slotsGrid.findElements(By.xpath('//*[@id="js-' + numOfSlots + '-slot"]'))
for(int i = 0; i < children.size; i++){
    KeywordUtil.logInfo(children[i].getText())
    }
 //return true or false once the slots order is validated
}

此代码的问题是该方法无法正常工作,我认为它会工作。我的xpath会匹配每个子WebElement的xpath的一部分,因此它将被添加到我的列表中。我在根div中元素的id序列是:

js-numOfSlots-slot <slotNum>

其中1 <= slotNum <= numOfSlots

如何正确生成遵循此ID序列并具有公共父WebElement的WebElement列表。 Katalon TestObjects也可能吗?

这是HTML。请注意,我只希望直系子女,而不是所有后裔。

HTML

更新

通过执行以下操作,我可以获取root div的所有后代:

List<WebElement> children = slotsGrid.findElements(By.xpath("//*[contains(@id, 'js-8-slot')]"))

如果我在xpath的末尾添加/div/div/div,我会得到某些子元素,但是我仍然不确定如何仅正确获得第一层子元素(直接子元素)。

2 个答案:

答案 0 :(得分:2)

这是获取所有插槽div的xpath。

CSS:

div[id^='js-8-grid'] >div[id^='js-8-slot']

xpath:

//div[contains(@id,'js-8-slot') and parent::div[@id='js-8-grid']]

实施:

@Keyword
public boolean verifySlotsOrder(int numOfSlots){
    WebDriver driver = DriverFactory.getWebDriver()
    # don't need the grid here, we can access the slots directly
    List<WebElement> children = slotsGrid.findElements(By.xpath("//div[contains(@id,'js-" +Integer.toString(numOfSlots) +"-slot') and parent::div[@id='js-" +Integer.toString(numOfSlots) +"-grid']]"))

    for(int i = 0; i < children.size; i++){
        KeywordUtil.logInfo(children[i].getText())
        }
}

答案 1 :(得分:1)

更简单的方法是使用("*"),它提供了上下文节点的所有直接子元素。

实施:

WebDriver driver = DriverFactory.getWebDriver()
//get the parent element
WebElement slotsGrid =  driver.findElement(By.id('js-' + numOfSlots + '-grid'))
//use the parent element to get all the immediate children
List<WebElement> children = slotsGrid.findElements(By.xpath("*"))