Home > Net >  Button click using Selenium not actionable
Button click using Selenium not actionable

Time:05-03

I am trying to fill in a registration form and click submit. But Selenium says the Registration button is not actionable. I have tried using actionchains and a couple of other techniques but generally get the same error.

selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable

My code...

driver.get('https://discover.workato.com/automate-2022/p/1?utm_source=Automate 2022&utm_medium=employee referral&utm_campaign=MCoblentz')
time.sleep(3)

first_name = driver.find_element_by_xpath('//*[@id="FirstName"]')
first_name.send_keys(line[1])

skipping a few more fields to the button click (and neither the by class name or the xpath work)...

Button = driver.find_element(By.class name("mktoButtonWrap"))
#    Button = driver.find_element_by_xpath('//*[@id="mktoForm_3468"]/div[17]/span')

Button.click()

For the life of me, I can't figure out:

  1. Why the button is not actionable and what I need to do to click it. (Major problem)

  2. Why Python won't run with the following find_element line (minor annoyance)

    Button = driver.find_element(By.xpath('//*[@id="mktoForm_3468"]/div[17]/span')
    

Python is throwing an error that

'AttributeError: type object 'By' has no attribute 'xpath' 

But I'm initializing with:

from selenium.webdriver.common.by import By

CodePudding user response:

Your syntax is incorrect. It should be:

Button = driver.find_element(By.XPATH, '//*[@id="mktoForm_3468"]/div[17]/span')

If you import By correctly (from selenium.webdriver.common.by import By), your IDE should autocorrect and show correct options: enter image description here

CodePudding user response:

You need to consider a couple of things here as follows:

  • Instead of:

    Button = driver.find_element(By.class name("mktoButtonWrap"))
    

    It should have been:

    Button = driver.find_element(By.CLASS_NAME, "mktoButtonWrap")
    

    Similarly,

    Button = driver.find_element(By.XPATH, '//*[@id="mktoForm_3468"]/div[17]/span')
    
  • Further, this error message...

    selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable
    

    indicates that the desired element is not interactable.


Solution

To click on Register you need to induce WebDriverWait for the element_to_be_clickable() and you can use either of the following locator strategies:

  • Using XPATH:

    driver.get("https://discover.workato.com/automate-2022/p/1?utm_source=Automate 2022&utm_medium=employee referral&utm_campaign=MCoblentz")
    driver.execute_script("arguments[0].click();", WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//button[@class='mktoButton' and text()='Register']"))))
    
  • 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
    
  • Related