Search code examples
pythonhtmlseleniumlistboxchrome-web-driver

Python script that uses Selenium webdriver for Chrome, trying (and failing) to print elements contained in a listbox


The script I am running is as follows:

    #import necessary packages
    from selenium import webdriver


    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.chrome.options import Options

    #run on headless browser
    chrome_options = Options()
    chrome_options.add_argument("--headless")
    driver = webdriver.Chrome(options=chrome_options)
    ####

    #driver = webdriver.Chrome()
    # Open the website
    driver.get('https://euclid.eba.europa.eu/register/pir/search')
    driver.set_window_size(1200, 800)
    driver.maximize_window()

    #find element using the link text
    xpath_institution_search = "//a[@href='/register/pir/search' and contains(text(), 'InstitutionSearch')]"                        
    try:
        element = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.XPATH, xpath_institution_search))
)
    finally: 
        institution_search = driver.find_element_by_xpath(xpath_institution_search)
        driver.execute_script("return arguments[0].scrollIntoView();", institution_search)
        institution_search.click()

    #select all appropriate National Competent Authorities
    xpath_nca_list_new = '(//p-listbox[@class="col-md-9 ng-untouched ng-pristine ng-valid" and @name="ncaList"])'                   
    #find the listbox element using it's xpath
    nca_listbox = driver.find_element_by_xpath(xpath_nca_list_new)
    #find elements within list box using tag names
    nca_div_tags = nca_listbox.find_elements_by_tag_name("div")
    #find element representing "select all" checkbox
    select_all_ncas = nca_div_tags[5]
    #find all list content (National Competent Authorities)
    nca_content_list = nca_div_tags[0].find_elements_by_tag_name("ul")
    #store list content in an ordered list 
    ncas = nca_content_list[0].find_elements_by_tag_name("li")

    #make web driver wait until element is visible before further action
    try:
        element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.XPATH, xpath_nca_list_new)))
    finally:
        count = 1
        #print out list of ncas
        for item in ncas:
            text = item.text
            print(str(count) + ". " + text)
            count=count+1

I'm very new to Python so please excuse any terrible code. The code sometimes prints a list of all the listbox elements like so:

  1. AT - Austrian Financial Market Authority
  2. BE - National Bank of Belgium
  3. BG - Bulgarian National Bank
  4. CY - Central Bank of Cyprus
  5. CZ - Czech National Bank
  6. DE - Federal Financial Supervisory Authority
  7. DK - Danish Financial Supervisory Authority
  8. EE - Estonian Financial Supervision Authority
  9. ES - Bank of Spain
  10. FI - Finnish Financial Supervisory Authority
  11. FR - Prudential Supervisory and Resolution Authority
  12. GB - Financial Conduct Authority (FCA)
  13. GR - Bank of Greece
  14. HR - Croatian National Bank
  15. HU - Central Bank of Hungary
  16. IE - Central Bank of Ireland
  17. IS - Financial Supervisory Authority
  18. IT - Bank of Italy
  19. LI - Financial Market Authority Liechtenstein
  20. LT - Bank of Lithuania
  21. LU - Commission for the Supervision of Financial Sector
  22. LV - Financial and Capital Market Commission
  23. MT - Malta Financial Services Authority
  24. NL - The Netherlands Bank
  25. NO - The Financial Authority of Norway
  26. PL - Polish Financial Supervision Authority
  27. PT - Bank of Portugal
  28. RO - National Bank of Romania
  29. SE - Swedish Financial Supervisory Authority
  30. SI - Bank of Slovenia
  31. SK - National Bank of Slovakia

But sometimes the list that is returned is empty. There are two other listboxes on the same webpage and this very same code works consistently for these elements.

Can anyone shed some light on why this is happening? Thanks in advance. Below is the HTML code for the listbox element I am trying to work with.

<p-listbox class="col-md-9 ng-untouched ng-pristine ng-valid" name="ncaList" optionlabel="CodeDisplayValue" _ngcontent-bwu-c7="">
<div class="ui-listbox ui-inputtext ui-widget ui-widget-content ui-corner-all" style="width: 100%;">
    <div class="ui-helper-hidden-accessible">
        <input type="text" readonly="readonly">
    </div>
    <!---->
    <!---->
    <div class="ui-widget-header ui-corner-all ui-listbox-header ui-helper-clearfix ui-listbox-header-w-checkbox ng-star-inserted">
        <!---->
        <div class="ui-chkbox ui-widget ng-star-inserted">
            <div class="ui-helper-hidden-accessible">
                <input type="checkbox" readonly="readonly">
            </div>
            <div class="ui-chkbox-box ui-widget ui-corner-all ui-state-default"><span class="ui-chkbox-icon ui-clickable"></span></div>
        </div>
        <!---->
    </div>
    <div class="ui-listbox-list-wrapper" style="max-height: 250px;">
        <ul class="ui-listbox-list">
            <!---->
            <li tabindex="0" class="ui-listbox-item ui-corner-all ng-star-inserted" style="display: block;">
                <!---->
                <div class="ui-chkbox ui-widget ng-star-inserted">
                    <div class="ui-chkbox-box ui-widget ui-corner-all ui-state-default"><span class="ui-chkbox-icon ui-clickable"></span></div>
                </div>
                <!----><span class="ng-star-inserted">AT - Austrian Financial Market Authority</span>
                <!---->
            </li>
            <li tabindex="0" class="ui-listbox-item ui-corner-all ng-star-inserted" style="display: block;">
                <!---->
                <div class="ui-chkbox ui-widget ng-star-inserted">
                    <div class="ui-chkbox-box ui-widget ui-corner-all ui-state-default"><span class="ui-chkbox-icon ui-clickable"></span></div>
                </div>
                <!----><span class="ng-star-inserted">BE - National Bank of Belgium</span>
                <!---->
            </li>
            <li tabindex="0" class="ui-listbox-item ui-corner-all ng-star-inserted" style="display: block;">
                <!---->
                <div class="ui-chkbox ui-widget ng-star-inserted">
                    <div class="ui-chkbox-box ui-widget ui-corner-all ui-state-default"><span class="ui-chkbox-icon ui-clickable"></span></div>
                </div>
                <!----><span class="ng-star-inserted">BG - Bulgarian National Bank</span>
                <!---->
            </li>
            <li tabindex="0" class="ui-listbox-item ui-corner-all ng-star-inserted" style="display: block;">
                <!---->
                <div class="ui-chkbox ui-widget ng-star-inserted">
                    <div class="ui-chkbox-box ui-widget ui-corner-all ui-state-default"><span class="ui-chkbox-icon ui-clickable"></span></div>
                </div>
                <!----><span class="ng-star-inserted">CY - Central Bank of Cyprus</span>
                <!---->
            </li>
            <li tabindex="0" class="ui-listbox-item ui-corner-all ng-star-inserted" style="display: block;">
                <!---->
                <div class="ui-chkbox ui-widget ng-star-inserted">
                    <div class="ui-chkbox-box ui-widget ui-corner-all ui-state-default"><span class="ui-chkbox-icon ui-clickable"></span></div>
                </div>
                <!----><span class="ng-star-inserted">CZ - Czech National Bank</span>
                <!---->
            </li>
            <li tabindex="0" class="ui-listbox-item ui-corner-all ng-star-inserted" style="display: block;">
                <!---->
                <div class="ui-chkbox ui-widget ng-star-inserted">
                    <div class="ui-chkbox-box ui-widget ui-corner-all ui-state-default"><span class="ui-chkbox-icon ui-clickable"></span></div>
                </div>
                <!----><span class="ng-star-inserted">DE - Federal Financial Supervisory Authority</span>
                <!---->
            </li>
            <li tabindex="0" class="ui-listbox-item ui-corner-all ng-star-inserted" style="display: block;">
                <!---->
                <div class="ui-chkbox ui-widget ng-star-inserted">
                    <div class="ui-chkbox-box ui-widget ui-corner-all ui-state-default"><span class="ui-chkbox-icon ui-clickable"></span></div>
                </div>
                <!----><span class="ng-star-inserted">DK - Danish Financial Supervisory Authority</span>
                <!---->
            </li>
            <li tabindex="0" class="ui-listbox-item ui-corner-all ng-star-inserted" style="display: block;">
                <!---->
                <div class="ui-chkbox ui-widget ng-star-inserted">
                    <div class="ui-chkbox-box ui-widget ui-corner-all ui-state-default"><span class="ui-chkbox-icon ui-clickable"></span></div>
                </div>
                <!----><span class="ng-star-inserted">EE - Estonian Financial Supervision Authority</span>
                <!---->
            </li>
            <li tabindex="0" class="ui-listbox-item ui-corner-all ng-star-inserted" style="display: block;">
                <!---->
                <div class="ui-chkbox ui-widget ng-star-inserted">
                    <div class="ui-chkbox-box ui-widget ui-corner-all ui-state-default"><span class="ui-chkbox-icon ui-clickable"></span></div>
                </div>
                <!----><span class="ng-star-inserted">ES - Bank of Spain</span>
                <!---->
            </li>
            <li tabindex="0" class="ui-listbox-item ui-corner-all ng-star-inserted" style="display: block;">
                <!---->
                <div class="ui-chkbox ui-widget ng-star-inserted">
                    <div class="ui-chkbox-box ui-widget ui-corner-all ui-state-default"><span class="ui-chkbox-icon ui-clickable"></span></div>
                </div>
                <!----><span class="ng-star-inserted">FI - Finnish Financial Supervisory Authority</span>
                <!---->
            </li>
            <li tabindex="0" class="ui-listbox-item ui-corner-all ng-star-inserted" style="display: block;">
                <!---->
                <div class="ui-chkbox ui-widget ng-star-inserted">
                    <div class="ui-chkbox-box ui-widget ui-corner-all ui-state-default"><span class="ui-chkbox-icon ui-clickable"></span></div>
                </div>
                <!----><span class="ng-star-inserted">FR - Prudential Supervisory and Resolution Authority</span>
                <!---->
            </li>
            <li tabindex="0" class="ui-listbox-item ui-corner-all ng-star-inserted" style="display: block;">
                <!---->
                <div class="ui-chkbox ui-widget ng-star-inserted">
                    <div class="ui-chkbox-box ui-widget ui-corner-all ui-state-default"><span class="ui-chkbox-icon ui-clickable"></span></div>
                </div>
                <!----><span class="ng-star-inserted">GB - Financial Conduct Authority (FCA)</span>
                <!---->
            </li>
            <li tabindex="0" class="ui-listbox-item ui-corner-all ng-star-inserted" style="display: block;">
                <!---->
                <div class="ui-chkbox ui-widget ng-star-inserted">
                    <div class="ui-chkbox-box ui-widget ui-corner-all ui-state-default"><span class="ui-chkbox-icon ui-clickable"></span></div>
                </div>
                <!----><span class="ng-star-inserted">GR - Bank of Greece</span>
                <!---->
            </li>
            <li tabindex="0" class="ui-listbox-item ui-corner-all ng-star-inserted" style="display: block;">
                <!---->
                <div class="ui-chkbox ui-widget ng-star-inserted">
                    <div class="ui-chkbox-box ui-widget ui-corner-all ui-state-default"><span class="ui-chkbox-icon ui-clickable"></span></div>
                </div>
                <!----><span class="ng-star-inserted">HR - Croatian National Bank</span>
                <!---->
            </li>
            <li tabindex="0" class="ui-listbox-item ui-corner-all ng-star-inserted" style="display: block;">
                <!---->
                <div class="ui-chkbox ui-widget ng-star-inserted">
                    <div class="ui-chkbox-box ui-widget ui-corner-all ui-state-default"><span class="ui-chkbox-icon ui-clickable"></span></div>
                </div>
                <!----><span class="ng-star-inserted">HU - Central Bank of Hungary</span>
                <!---->
            </li>
            <li tabindex="0" class="ui-listbox-item ui-corner-all ng-star-inserted" style="display: block;">
                <!---->
                <div class="ui-chkbox ui-widget ng-star-inserted">
                    <div class="ui-chkbox-box ui-widget ui-corner-all ui-state-default"><span class="ui-chkbox-icon ui-clickable"></span></div>
                </div>
                <!----><span class="ng-star-inserted">IE - Central Bank of Ireland</span>
                <!---->
            </li>
            <li tabindex="0" class="ui-listbox-item ui-corner-all ng-star-inserted" style="display: block;">
                <!---->
                <div class="ui-chkbox ui-widget ng-star-inserted">
                    <div class="ui-chkbox-box ui-widget ui-corner-all ui-state-default"><span class="ui-chkbox-icon ui-clickable"></span></div>
                </div>
                <!----><span class="ng-star-inserted">IS - Financial Supervisory Authority</span>
                <!---->
            </li>
            <li tabindex="0" class="ui-listbox-item ui-corner-all ng-star-inserted" style="display: block;">
                <!---->
                <div class="ui-chkbox ui-widget ng-star-inserted">
                    <div class="ui-chkbox-box ui-widget ui-corner-all ui-state-default"><span class="ui-chkbox-icon ui-clickable"></span></div>
                </div>
                <!----><span class="ng-star-inserted">IT - Bank of Italy</span>
                <!---->
            </li>
            <li tabindex="0" class="ui-listbox-item ui-corner-all ng-star-inserted" style="display: block;">
                <!---->
                <div class="ui-chkbox ui-widget ng-star-inserted">
                    <div class="ui-chkbox-box ui-widget ui-corner-all ui-state-default"><span class="ui-chkbox-icon ui-clickable"></span></div>
                </div>
                <!----><span class="ng-star-inserted">LI - Financial Market Authority Liechtenstein</span>
                <!---->
            </li>
            <li tabindex="0" class="ui-listbox-item ui-corner-all ng-star-inserted" style="display: block;">
                <!---->
                <div class="ui-chkbox ui-widget ng-star-inserted">
                    <div class="ui-chkbox-box ui-widget ui-corner-all ui-state-default"><span class="ui-chkbox-icon ui-clickable"></span></div>
                </div>
                <!----><span class="ng-star-inserted">LT - Bank of Lithuania</span>
                <!---->
            </li>
            <li tabindex="0" class="ui-listbox-item ui-corner-all ng-star-inserted" style="display: block;">
                <!---->
                <div class="ui-chkbox ui-widget ng-star-inserted">
                    <div class="ui-chkbox-box ui-widget ui-corner-all ui-state-default"><span class="ui-chkbox-icon ui-clickable"></span></div>
                </div>
                <!----><span class="ng-star-inserted">LU - Commission for the Supervision of Financial Sector</span>
                <!---->
            </li>
            <li tabindex="0" class="ui-listbox-item ui-corner-all ng-star-inserted" style="display: block;">
                <!---->
                <div class="ui-chkbox ui-widget ng-star-inserted">
                    <div class="ui-chkbox-box ui-widget ui-corner-all ui-state-default"><span class="ui-chkbox-icon ui-clickable"></span></div>
                </div>
                <!----><span class="ng-star-inserted">LV - Financial and Capital Market Commission</span>
                <!---->
            </li>
            <li tabindex="0" class="ui-listbox-item ui-corner-all ng-star-inserted" style="display: block;">
                <!---->
                <div class="ui-chkbox ui-widget ng-star-inserted">
                    <div class="ui-chkbox-box ui-widget ui-corner-all ui-state-default"><span class="ui-chkbox-icon ui-clickable"></span></div>
                </div>
                <!----><span class="ng-star-inserted">MT - Malta Financial Services Authority</span>
                <!---->
            </li>
            <li tabindex="0" class="ui-listbox-item ui-corner-all ng-star-inserted" style="display: block;">
                <!---->
                <div class="ui-chkbox ui-widget ng-star-inserted">
                    <div class="ui-chkbox-box ui-widget ui-corner-all ui-state-default"><span class="ui-chkbox-icon ui-clickable"></span></div>
                </div>
                <!----><span class="ng-star-inserted">NL - The Netherlands Bank</span>
                <!---->
            </li>
            <li tabindex="0" class="ui-listbox-item ui-corner-all ng-star-inserted" style="display: block;">
                <!---->
                <div class="ui-chkbox ui-widget ng-star-inserted">
                    <div class="ui-chkbox-box ui-widget ui-corner-all ui-state-default"><span class="ui-chkbox-icon ui-clickable"></span></div>
                </div>
                <!----><span class="ng-star-inserted">NO - The Financial Authority of Norway</span>
                <!---->
            </li>
            <li tabindex="0" class="ui-listbox-item ui-corner-all ng-star-inserted" style="display: block;">
                <!---->
                <div class="ui-chkbox ui-widget ng-star-inserted">
                    <div class="ui-chkbox-box ui-widget ui-corner-all ui-state-default"><span class="ui-chkbox-icon ui-clickable"></span></div>
                </div>
                <!----><span class="ng-star-inserted">PL - Polish Financial Supervision Authority</span>
                <!---->
            </li>
            <li tabindex="0" class="ui-listbox-item ui-corner-all ng-star-inserted" style="display: block;">
                <!---->
                <div class="ui-chkbox ui-widget ng-star-inserted">
                    <div class="ui-chkbox-box ui-widget ui-corner-all ui-state-default"><span class="ui-chkbox-icon ui-clickable"></span></div>
                </div>
                <!----><span class="ng-star-inserted">PT - Bank of Portugal</span>
                <!---->
            </li>
            <li tabindex="0" class="ui-listbox-item ui-corner-all ng-star-inserted" style="display: block;">
                <!---->
                <div class="ui-chkbox ui-widget ng-star-inserted">
                    <div class="ui-chkbox-box ui-widget ui-corner-all ui-state-default"><span class="ui-chkbox-icon ui-clickable"></span></div>
                </div>
                <!----><span class="ng-star-inserted">RO - National Bank of Romania</span>
                <!---->
            </li>
            <li tabindex="0" class="ui-listbox-item ui-corner-all ng-star-inserted" style="display: block;">
                <!---->
                <div class="ui-chkbox ui-widget ng-star-inserted">
                    <div class="ui-chkbox-box ui-widget ui-corner-all ui-state-default"><span class="ui-chkbox-icon ui-clickable"></span></div>
                </div>
                <!----><span class="ng-star-inserted">SE - Swedish Financial Supervisory Authority</span>
                <!---->
            </li>
            <li tabindex="0" class="ui-listbox-item ui-corner-all ng-star-inserted" style="display: block;">
                <!---->
                <div class="ui-chkbox ui-widget ng-star-inserted">
                    <div class="ui-chkbox-box ui-widget ui-corner-all ui-state-default"><span class="ui-chkbox-icon ui-clickable"></span></div>
                </div>
                <!----><span class="ng-star-inserted">SI - Bank of Slovenia</span>
                <!---->
            </li>
            <li tabindex="0" class="ui-listbox-item ui-corner-all ng-star-inserted" style="display: block;">
                <!---->
                <div class="ui-chkbox ui-widget ng-star-inserted">
                    <div class="ui-chkbox-box ui-widget ui-corner-all ui-state-default"><span class="ui-chkbox-icon ui-clickable"></span></div>
                </div>
                <!----><span class="ng-star-inserted">SK - National Bank of Slovakia</span>
                <!---->
            </li>
        </ul>
    </div>
    <!---->
</div>


Solution

  • Improved locators and with wait until visibility_of_all_elements_located of the liist:

    wait = WebDriverWait(driver, 10)
    wait.until(EC.element_to_be_clickable((By.LINK_TEXT, "Institution Search"))).click()
    search_button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "[label=Search] button")))
    driver.execute_script("arguments[0].scrollIntoView()", search_button)
    search_button.click()
    
    nca_list = wait.until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "[name=ncaList] li")))
    for nca in nca_list:
        print(nca.text)