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

Добрый день.Столкнулся с проблемой подбора локатора для 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.

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

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

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


Отправить

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

1 лайк

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

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

1 лайк

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

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

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

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

1 лайк

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

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

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

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

1 лайк

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

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

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

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

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

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

1 лайк