Python Selenium: Click element by custom attributes

Question:

I am trying to click this button with Selenium:

<button class="MuiButtonBase-root MuiButton-root jss38 MuiButton-contained MuiButton-containedPrimary" tabindex="0" type="button" data-test="unifiedCrazyButton"><span class="MuiButton-label">Let's get crazy</span><span class="MuiTouchRipple-root"></span></button>

I can’t do it by the class name, because there are other buttons with the same class name, and also the xpath value in this format:

/html/body/div[10]/div[3]/div/div[3]/button[2]

keeps changing which is unfortunate.

The only identifying factor seems to be

data-test="unifiedCrazyButton"

How can I click this button with Selenium?

Asked By: Long John

||

Answers:

The desired element is a dynamic element, so to click on the clickable element you need to induce WebDriverWait for the element_to_be_clickable() and you can use either of the following locator strategies:

  • Using CSS_SELECTOR:

    WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button[data-test='unifiedCrazyButton'] span.MuiButton-label"))).click()
    
  • Using XPATH:

    WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//button[@data-test='unifiedCrazyButton']//span[@class='MuiButton-label' and contains(., 'get crazy')]"))).click()
    
  • 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
    
Answered By: undetected Selenium