Selenium Python – Finding Elements by Class Name With Spaces

Question:

I’m writing a Python program that uses Selenium to navigate to and enter information into search boxes on an advanced search page. This website uses Javascript, and the IDs and Names for each search box change slightly each time the website is loaded, but the Class Names remain consistent. Class names are frequently reused though, so my goal is to use find_elements_by_class_name(classname) and then index through that list.

One box, for example, has the class name x-form-text x-form-field x-form-num-field x-form-empty-field, but I can’t use this because selenium considers it a compound class name and throws an error. If I use just a portion of it, such as x-form-text, it can’t find the element. My hope is to either find a way to allow the spaces or, if that can’t be done, find a way to search for all elements whose class name contains a section of text without spaces, such as x-form-text.

Any help or thoughts would be greatly appreciated!

Edit:

I tried this code:

quantminclass = 'x-form-text.x-form-field.x-form-num-field.x-form-empty-field'
quantmin = '25'
browser.find_elements_by_css_selector(quantminclass)[0].send_keys(quantmin)

But got an error that the list index was out of range, implying that it can’t find anything. I inspected the element and that is definitely its class name, so I’m not sure how to proceed.

Asked By: Andrew Kerrigan

||

Answers:

Those are multiple classes, not a single class with spaces, just use all the classes together.

driver.find_element(By.CSS_SELECTOR, '.class1.class2.class3')

In CSS selector a dot . is a class, you can concatenate any number class names

Answered By: Dalvenjia

Try converting class name to a CSS selector.
With a CSS selector, a class named x-form-text x-form-field x-form-num-field
turns into .x-form-text.x-form-field.x-form-num-field
So basically just replace spaces with dots and you’re good to go.

Answered By: Evya

If you have class name (or another attrs) with spaces, for example:

<div class="target with space or maybe another-long-text">Test 123</div>

This will work:

driver.find_element_by_xpath("//div[@class='target with space or maybe another-long-text']")
Answered By: Jackssn

Since Selenium 4 find_element_by_* is depricated, so you need to use
find_element() [Selenium-doc]

from selenium.webdriver.common.by import By

# By CLASS_NAME
driver.find_element(By.CLASS_NAME, "x-form-text.x-form-field.x-form-num-field.x-form-empty-field")

# By CSS_SELECTOR
driver.find_element(By.CSS_SELECTOR, ".x-form-text.x-form-field.x-form-num-field.x-form-empty-field")

# By XPATH
driver.find_element(By.XPATH, "//*[@class='x-form-text x-form-field x-form-num-field x-form-empty-field']")
Answered By: weAreStarsDust
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.