Selenium Python. Как получить ссылки из уведомлений на Ютубе?

Авторизовался скриптом и кликнул на уведомления. Но как вывести все ссылки с этой формы? Использовал модуль htmldom, но результатов никаких. Вот код метода:

    def authorization(self):
    driver = './geckodriver'
    browser = webdriver.Firefox(executable_path=driver)
    browser.get('https://www.livejournal.com/identity/login.bml?type=google&auto_forwhat=wwws%24/')
    enterFirst = browser.find_element_by_class_name('RveJvd')
    login = browser.find_element_by_id('identifierId')
    time.sleep(2)
    login.send_keys('mylogin')
    enterFirst.click()
    time.sleep(2)
    password = browser.find_element_by_name('password')
    enterSecond = browser.find_element_by_id('passwordNext')
    password.send_keys('mypassword')
    enterSecond.click()
    browser.get('https://www.youtube.com')
    time.sleep(5)
    notifications = browser.find_element_by_class_name('ytd-notification-topbar-button-renderer')
    notifications.click()
    urls = []
    dom = htmldom.HtmlDom("https://www.youtube.com")  
    dom = dom.createDom()
    p_links = dom.find('a class="yt-simple-endpoint style-scope ytd-notification-renderer"')  
    for link in p_links:
      print ("URL: " +link.attr("href"))
    time.sleep(100)

Что неправильно?


Ответы (2 шт):

Автор решения: Wairua

Без претензии на ответ. Просто раз уж автор заморочился с selenium поделюсь тем, чем пользуюсь сам. Мне так удобней:

from distutils.util import get_platform
from os import mkdir, path

from selenium.common.exceptions import *
from selenium.webdriver import Firefox
from selenium.webdriver import FirefoxOptions
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.firefox.firefox_profile import FirefoxProfile
from selenium.webdriver.firefox.webelement import FirefoxWebElement
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.ui import WebDriverWait

class FirefoxBrowser(Firefox):
    def __init__(self,
                 silent_mode: bool = False,
                 driver: str = 'geckodriver',
                 close_timeout: int = 0,
                 max_window: bool = True,
                 no_images: bool = True):

        """

        :param silent_mode: логическое, по умолчанию False отвечает за отображение окна браузера. Если запуск происходит
        из под Windows можно применить значение, True (отобразить окно), при запуске в Linux окно всегда скрыто;

        :param driver: указывает расположение файла `geckodriver`. Если файл находится не в дериктории проекта,
        необходимо указать полный путь к файлу, или добавить путь к файлу в переменную PATH;

        :param close_timeout: время задержки до закрытия окна браузера после завершения работы. По умолчани 0 сек.;

        :param max_window: параметр отвечающий за развертывание окна браузера до максимального размера при запуске
        :param no_images: блокировка изобращений на сайтах.
        """

        self.__close_timeout = close_timeout

        if get_platform().partition('-')[0] == 'linux':
            silent_mode = True
            max_window = False

        opt = FirefoxOptions()
        opt.headless = silent_mode

        profile = FirefoxProfile()

        if no_images:
            profile.set_preference('permissions.default.image', 2)

        if not path.exists('./logs/'):
            mkdir('./logs/')

        super().__init__(options=opt,
                         executable_path=driver,
                         firefox_profile=profile,
                         service_log_path='./logs/geckodriver.log')
        if max_window:
            self.maximize_window()

    def scroll_to_element(self, element: FirefoxWebElement):
        self.execute_script("arguments[0].scrollIntoView();", element)

    def wait_for_element(self, by: By, ident: str, timeout: int = 5):
        try:
            WebDriverWait(self, timeout).until(
                expected_conditions.presence_of_all_elements_located(
                    (by, ident)
                )
            )
            return self.find_element(by, ident)
        except TimeoutException:
            return None

    @property
    def action(self):
        return ActionChains(self)

→ Ссылка
Автор решения: Никита Климов

Проблема была решена отбросом всех костылей типа htmldom и bs4. Были использованы регулярные выражения (модуль re). А для просмотра исходника веб-страницы - простая функция:

    element = browser.page_source

Далее:

    urls = re.findall(r'(?:<a class="yt-simple-endpoint style-scope ytd-notification-renderer" tabindex="0" role="link" href=")(.*)">', element)
    print(urls)

Всем спасибо.

Обратите внимание на мой код: он полностью решает проблему автоматической авторизации на Гугле.

→ Ссылка