Локаторы типа "НАПИСАТЬ" и "ОТПРАВИТЬ".Selenium/Python

xpath
locators
css-selectors
python
Теги: #<Tag:0x00007fedb954d040> #<Tag:0x00007fedb954cb90> #<Tag:0x00007fedb954c820> #<Tag:0x00007fedb954c5c8>

(Алексей Цыханский) #1

Добрый день.Столкнулся с проблемой подбора локатора для e-mail, а конкретней елементов типа “НАПИСАТЬ” и “ОТПРАВИТЬ”.
Почта-GMAIL
Локаторов типа ID,NAME-нет!Xpath и СSS-не работают!
НАПИСАТЬ

div class=“T-I J-J5-Ji T-I-KE L3” role=“button” tabindex=“0” gh=“cm” style=“user-select: none;”>НАПИСАТЬ</div

ОТПРАВИТЬ

div id=":8o" class=“T-I J-J5-Ji aoO T-I-atl L3 T-I-JW” role=“button” tabindex=“1” data-tooltip=“Отправить ‪(Ctrl + Enter)‬” aria-label=“Отправить ‪(Ctrl + Enter)‬” data-tooltip-delay=“800” style=“user-select: none;”>Отправить</div

Выбивает ошибку-selenium.common.exceptions.ElementNotVisibleException: Message: element not visible

Прошу помочь сделать рабочий локатор и объяснить почему не работают xpath и СSS.


#2

Вообще, можно попробовать зацепиться за другие элементы, которые идут выше по дереву, возможно там есть более вменяемые атрибуты.
Если не брать это во внимание, то можно привязаться к тексту:

  1. //div[text()=‘Отправить’]
  2. //div[text()=‘НАПИСАТЬ’]

(Алексей Цыханский) #3

Если не трудно, можете написать полную команду.
Например:find_element_by_link_text("//div[text()=‘Отправить’]")(так не работает).
Или попробовать зацепиться за другие элементы.Высылаю HTML
Написать


Отправить


(Ray Romanov) #4

А это че, разве не find_element_by_xpath ???


(rmerkushin) #5

Так ясен же пень, что не будет работать. Читайте мануалы )
http://selenium-python.readthedocs.io/locating-elements.html#locating-hyperlinks-by-link-text

Нужно как-то так: find_element_by_link_text('Отправить') или как написал комрад @RayRom


(Oleksandr Khotemskyi) #6

Вы так ничему не научитесь.

Вы сами придумали себе задачу - автоматизировать Gmail (что вообще очень сложно сделать зная структуру приложения), а теперь хотите чтобы за вас все локаторы написали готовые.

Если вы не работаете в Google - то возьмите для своих тестов сайт со структурой попроще, не мучайтесь.

К тому же это ошибка не из-за кривого локатора, локатор похоже правильный. Ошибка потому что невозможно кликнуть на невидимый элемент.


(Yury) #7

Там нет линка. Там div. Поэтому xpath нужен нормальный, как предложил @JustAlex1, например.
А вообще, зачем автоматизировать Гугл мейл через UI, когда у них есть прекрасный API? Не говря уже, что можно все сделать по обычному почтовому протоколу.


(rmerkushin) #8

Ну это не ко мне вопросы, я просто намекнул что find_element_by_link_text работает не так )


(Алексей Цыханский) #9

JustAlex1… ты просто красавец)))))Работает:scream::sob::grin:
find_element_by_xpath("//div[text()=‘Отправить’]")
СПАСИБО)))))
Подскажи ещё плиз, эта формула работает всегда //div[text()=‘Какой-то текст’]?
Может подскажешь, какой-то ресурс где всё это описано?


(rmerkushin) #10

Читаем на здоровье:


(Ильдар Бекмансуров) #11

мне нравится этот мануал


классная штука


(Алексей Цыханский) #12

Люди, спасибо огромное. Очень помогли.Сhrome копирует какой-то левый xpath. Уже руки опускались.:grinning:


(Ray Romanov) #13

Понимаешь это как в анекдоте, “собирают истребитель, а получается бульдозер”, в итоге приписка в инструкции: Остальное доработать напильником


(Black Box Blues) #14

Не “левый”, а скорее всего абсолютный.


(Maxim Andryushchenkov) #15

Ну и как в дополнение почему вы взяли для обучения не ту страницу:
На таких страницах (почтовый менеджер) полно теневых конструкций, когда вроде бы уникальный локатор должен находить 1 элемент, а их 2 или больше, один из них будет доступен для действий. Это сделано для того, чтобы переход между входящими и отправленными письмами осуществлялся на лету. Поэтому конструкцию xpath пути следует начинать от элемента, свойства которого точно указывает что это письмо находится в папке Входящие. Думаю, логика стала ясна. А также может быть не тривиальным переход между фреймами и возврат назад в поиске элемента. Натолкнетесь один раз и вообще руки опустятся
Найдите страничку попроще, присоединюсь к @xotabu4