Search code examples
pythonseleniumgetattribute

Selenium + Python: Print the text attribute of an element


I would like to navigate through a website, find an element and print it.

Python version: 3.10; Selenium Webdriver: Firefox; IDE: PyCharm 2021.3.2 (CE); OS: Fedora 35 VM

I am able to navigate to the appropriate page where the text is generated in a drop down menu. When I locate the element by CSS Selector and attempt to print it, the output does print the text "None". I would like it to print the Plan Name which in this case is "Dual Complete Plan 1". The element is not always present so I also need to catch any exceptions.

The relevant HTML code of the element I am trying to print:

<span class="OSFillParent" data-expression="" style="font-size: 12px; margin-top: 5px;">Dual Complete Plan 1</span>

More of the HTML code of the element I am trying to print (element I am trying to capture is below the fourth div):

<td data-header="Plan Name">
    <div id="b8-b40-l1_0-132_0-$b2" class="OSBlockWidget" data-block="Content.AccordionItem">
    <div id="b8-b40-l1_0-132_0-b2-SectionItem" class="section-expandable  open is--open small-accordion" data-container="" data-expanded="true" aria-expanded="true" aria-disabled="false" role="tab">
        <div id="b8-b40-l1_0-132_0-b2-TitleWrapper" class="section-expandable-title" data-container="" style="cursor: pointer;" role+"button" aria-hidden="false" aria-expanmded="true" tabindex="0" aria-controls="b8-b40-l1_0-132_0-b2-Content" EVENT FLEX
            <div id="b8-b40-l1_0-132_0-b2-Title" class="dividers full-width">
                    <span class="OSFillParent" data-expression="" style="font-size: 12px; margin-top: 5px;">Dual Complete Plan 1</span>
            </div>
        <div class="section-expandable-icon" data-container="" aria-hidden="true"
            ::after
        </div>
    </div>
    <div id="b8-b40-l1_0-132_0-b2-ContentWrapper" class="section-expandable-content no-padding is--expanded" data-container="" tabindex="0" aria-hidden="false" aria-labelledby="b8-b40-l1_0-132_0-b2-TitleWrapper"> 
        <div id="b8-b40-l1_0-132_0-b2-Content" role="tabpanel">
            <a data-link="" href="https://www.communityplan.com" target="_blank" title="Click for more information"> EVENT
                <span class="OSFillParent" data-expression="" style="font-size: 12px;">www.CommunityPlan.com</span>
            </a>
            <span class="OSFillParent" data-expression="" style="font-size: 12px:">Phone Number: 8005224700</span>
        </div>
    </div>
</div>
</div>
</td>

My relevant Selenium code:

# Find the Plan Name & if present set it to the variable "Advantage"
        try:
            Advantage = (WebDriverWait(driver, 5).until(
            EC.presence_of_element_located((By.CSS_SELECTOR, "#b8-b40-l1_0-132_0-b2-Title > span:nth-child(1)"))).get_attribute("value"))
        except:
            pass

print('\033[91;46m', Advantage, '\033[0m')

I expect the output to be "Dual Complete Plan 1", which is what I see on the screen and in the HTML. Instead I get the following:

None

Apparently the "Advantage" variable is being set to "None". Why? I can see the text "Dual Complete Plan 1" that I want to print in the HTML code above. What am I doing wrong? I feel like I need a primer on "get attribute"?


Solution

  • To get the text Dual Complete Plan 1 you need to use

    element.text

    or

    element.get_attribute("innerHTML")

    or

    element.get_attribute("textContent")

    Instead of presence_of_element_located() use visibility_of_element_located()

    and following css selector to identify

    div[id*='Title'] > span.OSFillParent

    Or

    div.dividers.full-width > span.OSFillParent

    Code:

            try:
                Advantage = WebDriverWait(driver, 5).until(
                EC.visibility_of_element_located((By.CSS_SELECTOR, "div[id*='Title'] > span.OSFillParent"))).text
            except:
                pass
            print(Advantage )