5

I want to find all the elements that contain a certain class name but skip the ones the also contain another class name beside the one that i am searching for

I have the element <div class="examplenameA"> and the element <div class="examplenameA examplenameB">

At the moment i am doing this to overcome my problem:

items = driver.find_elements_by_class_name('examplenameA')
for item in items:
    cname = item.get_attribute('class')
    if 'examplenameB' in cname:
        pass
    else:
        rest of code

I only want the elements that have the class name examplenameA and i want to skip the ones that also contain examplenameB

undetected Selenium
  • 183,867
  • 41
  • 278
  • 352
Rius2
  • 347
  • 2
  • 6
  • 17

2 Answers2

6

To find all the elements with class attribute as examplenameA leaving out the ones with class attribute as examplenameB you can use the following solution:

  • css_selector:

    items = driver.find_elements_by_css_selector("div.examplenameA:not(.examplenameB)")
    
  • xpath:

    items = driver.find_element_by_xpath("//div[contains(@class, 'examplenameA') and not(@class='examplenameB')]")
    
undetected Selenium
  • 183,867
  • 41
  • 278
  • 352
2

You can use xpath in this case. So as per your example you need to use something like driver.find_elements_by_xpath('//div[@class='examplenameA'). This will give you only the elements whose class is examplenameA

So how xpath works is : Xpath=//tagname[@attribute='value']

Hence the class is considered as the attribute & xpath will try to match the exact given value, in this case examplenameA, so <div class="examplenameA examplenameB"> will be ignored

In case of find_elements_by_class_name method, it will try to match the element which has the class as examplenameA, so the <div class="examplenameA examplenameB"> will also be matched

Hope this helps

Dev
  • 2,739
  • 2
  • 21
  • 34
SnR
  • 319
  • 1
  • 7