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

Здравствуйте, помогите пожалуйста :). Пишу на Java+Selenium+WebDriver, нужно зайти на сайт ebay.com, вбить любое название товара и открыть первую ссылку с товаром. К примеру на картинке я выделила красным что нужно открыть. Но проблемы в том что id у этих объектов постоянно разный, и соответственно он не подойдёт для селектора. Подскажите, пожалуйста, как правильно поступать в таких случаях? Если у меня длинный список и нет вообще id?

Вот так:
//*[@id='ListViewInner']/descendant::h3[1]/a

Почитайте что такое оси в XPath

1 лайк

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

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

3 лайка

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

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

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

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

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

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

Мастрид

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

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

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

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

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

2 лайка

Извините, вроде бы понятно и должно работать, но не работает :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], поэтому работает через раз

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

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

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

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

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

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

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

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

написала

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


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

у Вас скобка пропущена, попробуйте так:
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();

Пишу Ваш код
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();
Всё равно ничего не открывается (

хм…Вы правы…(а) элемент не виден…написал быстрый тест на питоне для теста яндекс почты. Следующий код 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]
п.с. скобки обьязательны.