Can't find element with Selenium/Python

I’m trying to write my first script for Selenium/Python, so no doubt this is a very silly question. I’m trying to find the element that says “Club Pilot Airmanship” in the following HTML:

This is my Python:

quiz_title = driver.find_element_by_class_name(‘css-api-card-header__title’)

It gives the error: File “C:\Users\RowanB\AppData\Roaming\Python\Python38\site-packages\selenium\w ebdriver\remote\errorhandler.py”, line 242, in check_response raise exception_class(message, screen, stacktrace) selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {“method”:“css selector”,“selector”:".css-api-card-header __title"} (Session info: chrome=84.0.4147.125)

Why is it not finding the element? What do I have to do to fix this?

Thanks - Rowan

Welcome, rowan.

I’ve edited your post for readability. When you enter a code block into a forum post, please precede it with a separate line of three backticks and follow it with a separate line of three backticks to make it easier to read.

You can also use the “preformatted text” tool in the editor (</>) to add backticks around text.

See this post to find the backtick on your keyboard.
Note: Backticks (`) are not single quotes (’).

As for your question, I cannot see any element within the HTML you have pasted with a class of css-api-card-header__title. Can you point this element out?

I’m sorry, something has removed double underscores from my code. Here is the actual code:

<body class="widget">
  <div id="widget-page">
    <div class="os-widget-wrapper quiz layout-booklet open_sans_he color-palette-opinionstage state-opening" dir="ltr" id="css-api">
      <div class="os-widget-content css-api-widget-body">
        <div class="widget-opening-card" data-widget-opening-card="" style="opacity: 1;">
          <div class="header-area css-api-card-header css-api-card-header--opening">
            <h1 class="css-api-card-header__title">Club Pilot Airmanship</h1>
            <div class="description-text css-api-card-header__description">Fly right!</div>
          </div>
          <div class="media-area css-api-widget-media image" style=""><img class="cld-responsive css-api-widget-media__image" data-src="https://opinionstage-res.cloudinary.com/image/upload/c_lfill,dpr_auto,f_auto,fl_lossy,q_auto:good,w_auto/v1/polls/pcntjhqxa3ehx3jier4s" src="https://opinionstage-res.cloudinary.com/image/upload/c_lfill,dpr_1.0,f_auto,fl_lossy,q_auto:good,w_1100/v1/polls/pcntjhqxa3ehx3jier4s"></div>
          <div class="start-engagement-area">
            <div class="button start-engagement-button css-api-widget-btn css-api-widget-btn--start" data-start-timer-up-count="">START</div>
          </div>
        </div>
etc.

Rowan

When I do webscraping, I use one of two things:

  1. XPath
  • find_element_by_xpath
  1. CSS Selectors
  • find_element_by_css_selector

With Selenium, I remember having best success with using the XPath. If you are using Chrome, the element XPath is as easy to find as right-clicking an HTML element in the element tree -> Copy -> By XPath.

Hope this helps