160

I'm trying to get text using Selenium WebDriver and here is my code. Please note that I don't want to use XPath, because in my case the ID gets changed on every relaunch of the web page.

My code:

text = driver.find_element_by_class_name("current-stage").getText("my text")

HTML:

<span class="current-text" id="yui_3_7_0_4_1389185744113_384">my text</span>

How can I fix this?

1
  • 1
    If done interactively, the result may be something like the error message "AttributeError: 'current-stage' object has no attribute 'getText'" Commented Nov 22, 2020 at 6:11

9 Answers 9

275

You want just .text.

You can then verify it after you've got it, don't attempt to pass in what you expect it should have.

Sign up to request clarification or add additional context in comments.

11 Comments

Im getting this error - 'WebDriver' object has no attribute 'getText'
@user3121891, it's .text.
@user3121891 driver.find_element_by_class_name("current-stage").text ....just text on it's own. Nothing else.
You are going to want to loop through the list of selenium objects and apply the .text on each item of the for loop.
Yes @Arran, when I inspect the element it shows the complete text but when I try to scrape it, I can only retrieve the abbreviated version which is the one actually displayed in the website (the designers of the site did that because some text can be too long for the intended style)
|
114

Python

element.text

Java

element.getText()

C#

element.Text

Ruby

element.text

7 Comments

I can't find any documentation on this for Python, where are you guys finding this?
@CharlesSmith if you put a . after the element in VSCode, you'll be given a list of suggestions based on what the class accepts. That's how I found this.
Yes I noticed the same in IntelliJ, was just wondering why it's not in the docs
@Charles Smith: It is on Web element, sub section "Get Element Text" (at the bottom of the page). There are six different languages and the default is for JavaScript. Click on "Python" to see the Python code example.
(User "Charles Smith" seems to have changed name to "Amon".)
|
26

To print the text my text you can use either of the following Locator Strategies:

  • Using class_name and get_attribute("textContent"):

    print(driver.find_element(By.CLASS_NAME, "current-stage").get_attribute("textContent"))
    
  • Using css_selector and get_attribute("innerHTML"):

    print(driver.find_element(By.CSS_SELECTOR, "span.current-stage").get_attribute("innerHTML"))
    
  • Using xpath and text attribute:

    print(driver.find_element(By.XPATH, "//span[@class='current-stage']").text)
    

Ideally you need to induce WebDriverWait for the visibility_of_element_located() and you can use either of the following Locator Strategies:

  • Using CLASS_NAME and get_attribute("textContent"):

    print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CLASS_NAME, "current-stage"))).get_attribute("textContent"))
    
  • Using CSS_SELECTOR and text attribute:

    print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "span.current-stage"))).text)
    
  • Using XPATH and get_attribute("innerHTML"):

    print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//span[@class='current-stage']"))).get_attribute("innerHTML"))
    
  • Note : You have to add the following imports :

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

You can find a relevant discussion in How to retrieve the text of a WebElement using Selenium - Python


References

Link to useful documentation:

1 Comment

Very well documented and very detailed. Top answer +1
11

The answer is:

driver.find_element_by_class_name("ctsymbol").text

Comments

7

You can use:

element = driver.find_element_by_class_name("class_name").text

This will return the text within the element and will allow you to verify it after that.

Comments

3

This is the correct answer. It worked!!

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait

driver = webdriver.Chrome("E:\\Python\\selenium\\webdriver\\chromedriver.exe")
driver.get("https://www.tatacliq.com/global-desi-navy-embroidered-kurta/p-mp000000000876745")
driver.set_page_load_timeout(45)
driver.maximize_window()
driver.implicitly_wait(2)
driver.get_screenshot_as_file("E:\\Python\\Tatacliq.png")
print ("Executed Successfully")
driver.find_element_by_xpath("//div[@class='pdp-promo-title pdp-title']").click()
SpecialPrice = driver.find_element_by_xpath("//div[@class='pdp-promo-title pdp-title']").text
print(SpecialPrice)

Comments

1

A heads up for anyone finding this thread after the Selenium 4 update. The driver.find_element_by_* has been deprecated and using it will give a "deprecationwarning". The replacement method is: driver.find_element(By.X,"name") Please look up Selenium 4 info.

1 Comment

Yes. E.g., from a comment: "find_element_by_* and find_elements_by_* are removed in Selenium 4.3.0. Use find_element instead.". Though it doesn't really answer the question what can be done if the number of elements is different from exactly one (e.g., thrown exceptions if an element is absent. The only solution may be to catch the exception (no way to prevent it)).
1

to get a text from the element:

url=driv.find_element(By.whatDoYouWant, "ClassNameOrwhatDoYouWant").text
print(url)

ex:

url = web.find_element(By.TAG_NAME, "a").text
print(url)

to get a text from the elements:

ex:

for i in range(6):
    var = web.find_elements(By.TAG_NAME, "input")[i].text
    print(var)

1 Comment

I'd suggest using the formatting options available in the editor and mark source code properly, so that your answer is more readable and easier to understand.
0

I've found this absolutely invaluable when unable to grab something in a custom class or changing id's:

driver.find_element_by_xpath("//*[contains(text(), 'Show Next Date Available')]").click()
driver.find_element_by_xpath("//*[contains(text(), 'Show Next Date Available')]").text
driver.find_element_by_xpath("//*[contains(text(), 'Available')]").text
driver.find_element_by_xpath("//*[contains(text(), 'Avail')]").text

3 Comments

Can you explain why it is absolutely invaluable?
Why is .click() necessary? Why are there three lines with .text?
The question said "Please note that I don't want to use XPath".

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.