Как в Selenide искать внутренние элементы через родительский элемент?

Здравствуйте коллеги! Смотря документацию Selenide у меня сложилось впечатления что можно искать child элементы в parent элементе указывая только адрес child элемента, как показано тут:

image

т.е., как я понимаю, данная строка ищет ‘menu’ и ‘.item’ только внутри ‘header’, а все прочие ‘menu’ и ‘.item’ элементы на странице, не являющиеся child’ами ‘header’ будут проигнорированы?

Пробую применить у себя:

на странице есть блоки у которых есть child элементы с одинаковым названием html классов в каждом блоке:

image

Хочу скажем проверить наличие каждого блока и текст заголовка в нем:

// check Abstarct section
$(byId("abstract")).$x("//*[@class='doc-view-section-name']")
.shouldBe(visible)
.shouldHave(text("Abstract"))
.shouldHave(cssValue("font-size", "15px"));
	
// check Relevant Text section
$(byId("relevant-text")).$x("//*[@class='doc-view-section-name']")
.shouldBe(visible)
.shouldHave(text("Relevant Text"))
.shouldHave(cssValue("font-size", "15px"));

первая строчка еще сработает т.к. блок Abstract идет первым и $x("//[@class=‘doc-view-section-name’]") берет значение у первого найденного элемента, а вот вторая уже даст fail т.к. $x("//[@class=‘doc-view-section-name’]") по-прежнему возвращет значение первого найденного элемента на странице а не элемента внутри $(byId(“relevant-text”)).

Вот хочется понять, я неправильно понимаю как это работает или не правильно делаю?

а почему не брать


$("#relevant-text .doc-view-section-name").shouldBe(visible).shouldHave(text("Relevant Text")).shouldHave(cssValue("font-size", "15px")); 

1 лайк

[dzyof], спасибо!
Идея была еще и в том чтобы разделить parent и child элементы например для случая когда parent’у тоже нужны какие-то проверки. Да, с css локаторами все работает:

// check Abstract section
$("#div[@id='abstract").shouldBe(visible).$(".doc-view-section-name")
		.shouldBe(visible)
		.shouldHave(text("Abstract"))
		.shouldHave(cssValue("font-size", "15px"));
				
// check Relevant Text section		
$("#relevant-text").shouldBe(visible).$(".doc-view-section-name")
		.shouldBe(visible)
		.shouldHave(text("Relevant Text"))
		.shouldHave(cssValue("font-size", "15px"));

интересно почему не работает с xPath’ми?

Sergei точку пробовали добавлять ?

".//*[@class='doc-view-section-name']"
3 лайка

Вы всё делаете правильно, за исключением XPath.
Если XPath начинается со слэша, он ищет от начала документа.

См. Вышла Selenide 5.4.1

5. Добавили защиту от одной типичной ошибки с регуляркой

1 лайк

Всем большое спасибо!! Про точку перед слэшом для child элементов я забыл ) Вопрос снят.