Удаленка для jenkins+selenide+selenoid+allure+docker спецов на 2-3 часа в день. 100% remote! Присоединиться к проекту

Как выбрать в списке один первый объект?

xpath
css-selectors
java
webdriver
Теги: #<Tag:0x00007fedb65ca700> #<Tag:0x00007fedb65ca548> #<Tag:0x00007fedb65ca368> #<Tag:0x00007fedb65ca1b0>

(Алина) #3

Спасибо, только не совсем поняла, если я дела тоже что и Вы, то у меня выдаётся совсем другой id, который каждый раз разный, может я что то не то делаю в firebug? Я заметила что у вас над блоком написано new listing, может в этом дело? Но как Вы его открыли, я вроде туда же “тыкаю”. )


(Stan) #4

я лично предпочитаю css локаторы: [id*=item]:first-child .lvtitle a


#5

Вам не нужно менять id у себя. Эта конструкция будет работать для любого запроса.
id='ListViewInner' это блок с результатами для которого вы ищите потомков (ось descendant) у которых тег h3[1] - первый потомок, у которого берем тег a

Вы почитайте про XPath все же


(Алина) #6

Спасибо, пошла читать про Xpath :slight_smile: А подскажите пожалуйста ещё, а что делать если нет родительского эллемента с id. А Xpath получается слишком большой и некоторые его эллементы иногда могут меняться. Например письма на mail.yandex.ru, как можно получить например первое письмо в списке? Никак не получается :frowning:


(Vitaliy Romantsov) #7

Вам не нужно ходить в письма яндекс уверяюю Вас. Почитайте про JavaMail Api если хотите ходить имменно на какой-то ящик. Ну или спросите у гугла что-то типа how to receive email in java - так будет правильно


#8

Ну если вам уж очень приспичило, то
//*[@class='b-datalist__body']/descendant::a[1]

На одном id локаторы не заканчиваются

Мастрид

ЗЫ. Сорри, это с мейл ру, не досмотрел. На яндексе почты нет


(Stan) #9

Правильно выше сказали что лучше получать через нужный протокол напрямую, а не веб интерфейс. Но если смотреть чисто по локаторам:

.b-messages [data-id]:nth-child(1)

ну или немного понятнее, все на любителя:

.b-messages [data-action="mail.message.show-or-select"]:nth-child(1)


(Алина) #10

Извините, вроде бы понятно и должно работать, но не работает :frowning:

driver.findElement(By.cssSelector(".b-messages [data-id]:nth-child(1)")).click();

Вижу что находит нужный блок, но когда запускаю полностью тест, он не открывает первое писмо в яндек.почте. :frowning:
Подскажите пожалуйста, что я только не перепробывала…

Ещё пробовала через xPath, получалось длинное выражение, но там проблема в том, что иногда получается рзное колличество вложений div

.//*[@id='js-page']/div/div[5]/div/div[3]/div/div[3]/div/div/div/div[1]/div[3]/div[3]/div/div[1]/div[2]/div/span/a[1]
т.е. в одном месте вместо div[3] иногда получается div[11], поэтому работает через раз


(Stan) #11

а вы дожидаетесь загрузки вссех писем на странице? или загрузки самих элемментов? какая ошибка в первом случае?
насчет xpath - не зацикливайтесь на повторении ВСЕХ тэгов, выше советовали что почитать


(rom4ikkk) #12

мой вариант
element = driver.find_element_by_xpath(’(//ul[@id=‘ListViewInner’]//a[@class=‘vip’])[1]’)
element.click()


(Алина) #13

К сожалению в яндекс.почте не присвоены id (


(rom4ikkk) #14

а просто найти первую ссылку с классом vip: (//a[@class=‘vip’])[1]
можете показать скрин фаербага?


(Алина) #15

Я пытаюсь открыть это письмо, в fireBug его находит, но когда я пишу код

driver.findElement(By.cssSelector(".b-messages [data-id]:nth-child(1)")).click();

письмо не открыватется (


(rom4ikkk) #16

попробуйте сл. xpath:
(//div[@class=‘b-messages b-messages_threaded’]//a[@class=‘b-messages__message__link daria-action’])[1]


(Алина) #17

написала

'     driver.findElement(By.xpath("//div[@class='b-messages b-messages_threaded']//a[@class='b-messages__message__link daria-action'])[1]")).click();


тоже почему то не работает, хотя по лигике должно работать (


(rom4ikkk) #18

у Вас скобка пропущена, попробуйте так:
element = driver.findElement(By.xpath("(//div[@class=‘b-messages b-messages_threaded’]//a[@class=‘b-messages__message__link daria-action’])[1]"));
element.click();

или

element = driver.findElement(By.xpath("(//div[@class=‘b-messages b-messages_threaded’]//a[@class=‘b-messages__message__link daria-action’])[1]"));
element.click();


(Алина) #19

Пишу Ваш код
WebElement element; element = driver.findElement(By.xpath("(//div[@class=\'b-messages b-messages_threaded\']//a[@class=\'b-messages__message__link daria-action\'])[1]")); element.click();
Всё равно ничего не открывается (


(rom4ikkk) #20

хм…Вы правы…(а) элемент не виден…написал быстрый тест на питоне для теста яндекс почты. Следующий код 100% рабочий и первое письмо открывается
element = driver.find_element_by_xpath("(//div[@class=‘b-messages b-messages_threaded’]//span[@class=‘b-messages__message__left__wrapper’])[1]");
element.click();

отсюда, правильный xpath:
(//div[@class=‘b-messages b-messages_threaded’]//span[@class=‘b-messages__message__left__wrapper’])[1]
п.с. скобки обьязательны.


(Алина) #21

Вы будете смеятся, но наверно я что то не то делаю делаю

Я вставляю Ваш код

WebElement element; element = driver.findElement(By.xpath("(//div[@class='b-messages b-messages_threaded']//span[@class='b-messages__message__left__wrapper'])[1]")); element.click();
и… ничго (


(Stan) #22

Предоставьте полный код теста, как вы все это делаете.