Как получить все дочерние элементы в Студии Каталон - PullRequest
1 голос
/ 18 марта 2019

Я хотел бы найти все элементы в корневом элементе 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 будет соответствовать части xpath каждого дочернего WebElement и, следовательно, он будет добавлен в мой список. Моя последовательность идентификаторов для элементов в корневом элементе div:

JS-numOfSlots слот <slotNum>

, где 1 <= slotNum <= numOfSlots </p>

Как правильно создать список веб-элементов, которые следуют этой последовательности идентификаторов и имеют общий родительский веб-элемент. Также возможно ли это с Katalon TestObjects?

Вот HTML. Обратите внимание, что я хочу только непосредственных детей, а не всех потомков.

HTML

Обновление:

Я могу получить всех потомков моего корневого div, выполнив это:

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

и если я добавлю /div/div/div в конце моего xpath, я получу определенные дочерние элементы, но я все еще не уверен, как правильно получить только дочерние элементы первого слоя (непосредственные дочерние элементы).

Ответы [ 2 ]

2 голосов
/ 18 марта 2019

Вот xpath для получения всех div слотов.

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 голос
/ 19 марта 2019

Более простой способ сделать это - использовать ("*"), который дает все прямые дочерние элементы узла контекста.

Реализация:

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("*"))
...