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

webdriver
java
css-selectors
xpath
Теги: #<Tag:0x00007fedc45d9a80> #<Tag:0x00007fedc45d98a0> #<Tag:0x00007fedc45d95a8> #<Tag:0x00007fedc45d9468>

(Алина) #1

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


#2

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

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


(Алина) #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 :smile: А подскажите пожалуйста ещё, а что делать если нет родительского эллемента с id. А Xpath получается слишком большой и некоторые его эллементы иногда могут меняться. Например письма на mail.yandex.ru, как можно получить например первое письмо в списке? Никак не получается :(


(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]
п.с. скобки обьязательны.