Здравствуйте, помогите пожалуйста :). Пишу на Java+Selenium+WebDriver, нужно зайти на сайт ebay.com, вбить любое название товара и открыть первую ссылку с товаром. К примеру на картинке я выделила красным что нужно открыть. Но проблемы в том что id у этих объектов постоянно разный, и соответственно он не подойдёт для селектора. Подскажите, пожалуйста, как правильно поступать в таких случаях? Если у меня длинный список и нет вообще id?
Спасибо, только не совсем поняла, если я дела тоже что и Вы, то у меня выдаётся совсем другой id, который каждый раз разный, может я что то не то делаю в firebug? Я заметила что у вас над блоком написано new listing, может в этом дело? Но как Вы его открыли, я вроде туда же “тыкаю”. )
я лично предпочитаю css локаторы: [id*=item]:first-child .lvtitle a
Вам не нужно менять id у себя. Эта конструкция будет работать для любого запроса.
id='ListViewInner'
это блок с результатами для которого вы ищите потомков (ось descendant
) у которых тег h3[1] - первый потомок, у которого берем тег a
Вы почитайте про XPath все же
Спасибо, пошла читать про Xpath А подскажите пожалуйста ещё, а что делать если нет родительского эллемента с id. А Xpath получается слишком большой и некоторые его эллементы иногда могут меняться. Например письма на mail.yandex.ru, как можно получить например первое письмо в списке? Никак не получается
Вам не нужно ходить в письма яндекс уверяюю Вас. Почитайте про 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)
Извините, вроде бы понятно и должно работать, но не работает
driver.findElement(By.cssSelector(".b-messages [data-id]:nth-child(1)")).click();
Вижу что находит нужный блок, но когда запускаю полностью тест, он не открывает первое писмо в яндек.почте.
Подскажите пожалуйста, что я только не перепробывала…
Ещё пробовала через 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]
п.с. скобки обьязательны.