我想在根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。请注意,我只希望直系子女,而不是所有后裔。
更新:
通过执行以下操作,我可以获取root div的所有后代:
List<WebElement> children = slotsGrid.findElements(By.xpath("//*[contains(@id, 'js-8-slot')]"))
如果我在xpath的末尾添加/div/div/div
,我会得到某些子元素,但是我仍然不确定如何仅正确获得第一层子元素(直接子元素)。
答案 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("*"))