How can I resolve this issue - find_elements_by_xpath?

186    Asked by ananyaPawar in QA Testing , Asked on May 6, 2022

I'm trying to complete the basic python Selenium demo (https://selenium-python.readthedocs.io/getting-started.html) but I'm attempting to do that same procedure on https://www.ncbi.nlm.nih.gov/. However, it seems to be returning an empty list/it can't find the element. I tried to use the class_name but that also gave me an error because the class name has a space in it.

elem = driver.find_elements_by_class_name("typeahead tt-hint")
elem2 = driver.find_elements_by_xpath('//*[@id="main_content"]/section[1]/div/div[2]/div/form/div/span/input[1]')

Also, when doing the tutorial and trying the find_elements command on the different options <input id="id-search-field" name="q" type="search" role="textbox" class="search-field" placeholder="Search" value="" tabindex="1"> I don't quite understand why I seemed to get a type if I used elem = driver.find_element_by_name('q') and a if I used anything else (xpath, id, class_name, etc).

Answered by Andrea Bailey

For find_elements_by_xpath -

First of all, regarding your question about the return types of the "find" commands, it's quite straightforward:
find_element_by_*() methods return a WebElement instance - or, in other words, a single element
find_elements_by_*() methods return a list of WebElement instances - or, on other words, a list of elements
Now, let's look at what specific problems you have.
I am assuming you are working with this search page as I do see the text box you are talking about on this page. Let's look at this attempt you had to find the text box:
elem = driver.find_elements_by_class_name("typeahead tt-hint")
First of all, you need to use find_element_by_class_name() as you are looking for a single element only. Also, this locator only accepts single class values - so, you could use either driver.find_element_by_class_name("typeahead"), or driver.find_element_by_class_name("tt-hint").
If you need to check both of the class values, you could use a CSS selector:
driver.find_element_by_css_selector(".typeahead.tt-hint")
And, as we are looking for an input element, we could add the tag name check here as well:
driver.find_element_by_css_selector("input.typeahead.tt-hint")
But, as this element has an id element, you should just use "find element by id" strategy:
search_box = driver.find_element_by_id("search_term")
search_box.send_keys("my search query")

Your Answer

Interviews

Parent Categories