t.me/atinfo_chat Telegram группа по автоматизации тестирования

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

locators
java
selenide
webdriver
Теги: #<Tag:0x00007fb2f56eb3d8> #<Tag:0x00007fb2f56eb298> #<Tag:0x00007fb2f56eb158> #<Tag:0x00007fb2f56eb018>

(Сергей) #1

Здравствуйте коллеги! Смотря документацию 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”)).

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


(Dmitro) #2

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


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


(Сергей) #3

[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’ми?


(Сергей Кузьмин) #4

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

".//*[@class='doc-view-section-name']"

(asolntsev) #5

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

См. https://ru.selenide.org/2019/10/16/selenide-5.4.0/

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


(Сергей) #6

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