0

I am trying to check new notification, but selenium can't find it.

This is part of page code:

<div class="notifications">
    <a class="site_notification privateMessage" href="/inbox/Zhigalko_Sergei">
        <i data-icon=""></i>
        <span class="content">
            <span><strong>GM Zhigalko_Sergei</strong><time class="set" title="03.12.2021, 18:14:12" datetime="1638544452664">9 минут назад</time></span>
            <span>Дорогие Друзья!! NEW!! Сегодня 3 ДЕКАБРЯ…</span>
        </span>
    </a>
    <a class="site_notification privateMessage" href="/inbox/EternalDance">
        <i data-icon=""></i>
        <span class="content">
            <span><strong>EternalDance</strong><time class="set" title="03.12.2021, 04:24:13" datetime="1638494653285">13 часов назад</time></span>
            <span>si</span>
        </span>
    </a>
    <a class="site_notification privateMessage" href="/inbox/EternalDance">
        <i data-icon=""></i>
        <span class="content">
            <span><strong>EternalDance</strong><time class="set" title="03.12.2021, 04:23:52" datetime="1638494632534">13 часов назад</time></span>
            <span>fu</span>
        </span>
    </a>
    <a class="site_notification privateMessage" href="/inbox/EternalDance">
        <i data-icon=""></i>
        <span class="content">
           <span><strong>EternalDance</strong><time class="set" title="03.12.2021, 04:22:22" datetime="1638494542415">14 часов назад</time></span>
           <span>f</span>
        </span>
    </a>
    <a class="site_notification privateMessage" href="/inbox/EternalDance">
        <i data-icon=""></i>
        <span class="content"><span><strong>EternalDance</strong><time class="set" title="03.12.2021, 04:14:20" datetime="1638494060965">14 часов назад</time></span>
            <span>Hi</span>
        </span>
    </a>
    <a class="site_notification privateMessage" href="/inbox/Zhigalko_Sergei">
        <i data-icon=""></i>
        <span class="content">
            <span><strong>GM Zhigalko_Sergei</strong><time class="set" title="30.11.2021, 19:17:27" datetime="1638289047224">2 дня назад</time></span>
            <span>Дорогие Друзья!! Сегодня 30 Ноября в 23:…</span>
        </span>
    </a>
    <a class="site_notification privateMessage" href="/inbox/Zhigalko_Sergei">
        <i data-icon=""></i>
        <span class="content">
            <span><strong>GM Zhigalko_Sergei</strong><time class="set" title="27.11.2021, 19:05:46" datetime="1638029146777">5 дней назад</time></span>
            <span>Дорогие Друзья!! Сегодня 27 Ноября в 22:…</span>
        </span>
    </a>
</div>

I tried this way:

if __name__ == '__main__':
    warnings.filterwarnings("ignore")
    option = Options()

    option.add_argument("--disable-infobars")
    option.add_argument("start-maximized")
    option.add_argument("--disable-extensions")

    option.add_experimental_option("prefs", {
        "profile.default_content_setting_values.notifications": 1
    })

    driver = webdriver.Chrome(ChromeDriverManager().install(), chrome_options=option)
    driver.get('https://lichess.org/login')
    username_form = driver.find_element_by_id('form3-username')
    password_form = driver.find_element_by_id('form3-password')
    username_form.send_keys('Mylogin')
    password_form.send_keys('Mypassword')
    driver.find_element_by_xpath("//div[@class='one-factor']/button").click()
    WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, 'notify-toggle'))
    ).click()

    new_inventation = WebDriverWait(driver, 100).until(
        EC.presence_of_element_located((By.CLASS_NAME, "site_notification privateMessage"))
    )

But Selenium can't find it. I would appreciate any hints.

undetected Selenium
  • 183,867
  • 41
  • 278
  • 352
LightM
  • 11
  • 5

1 Answers1

0

By.CLASS_NAME accepts a single classname. So you can't pass multiple classnames. Moreover, the notification seems to be a visible element.

To locate a visible element instead of presence_of_element_located() you need to induce WebDriverWait for the visibility_of_element_located() and you can use either of the following Locator Strategy:

  • Using XPATH:

    new_inventation = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//div[@class='notifications']//a[@class='site_notification privateMessage']//span[@class='content'][./span[contains(., 'NEW')]]")))
    
  • Note : You have to add the following imports :

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
undetected Selenium
  • 183,867
  • 41
  • 278
  • 352