selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable when clicking on an element using Selenium Python

前端 未结 4 1070
情深已故
情深已故 2020-11-22 15:29

I understand this question has been asked but I need some solution for this error:

 Traceback (most recent call last):
 File \"goeventz_automation.py\", line         


        
相关标签:
4条回答
  • 2020-11-22 16:01

    Instead of using login.send_keys(Keys.ENTER) you should use selenium click() method which would work fine for you.

    You can check first if the element is clickable first and then you can click on it. Like:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//a[@track-element='header-login']"))).click()
    
    0 讨论(0)
  • 2020-11-22 16:07

    Overview

    It seems like you're having an XPATH problem finding the "Submit" button or your Submit button is not clickable, or your Submit button has some client side events attached to it (javascript/etc) that are required in order to effectively submit the page.

    Calling the pw.submit() method in most cases should get rid of the need to wait for the submit button to become clickable and avoid any issues in locating the button in most cases. On many other websites, some of the necessary back-end processes are primed by client-side activities that are performed after the "submit" button is actually clicked (although on a side-note this is not considered best-practice because it makes the site less accessible, etc, I digress). Above all, it's important to watch your script execute and make sure that you're not getting any noticeable errors displayed on the webpage about the credentials that you're submitting.

    Also, however, some websites require that you add a certain minimum amount of time between the entry of the username, password, and submitting the page in order for it to be considered a valid submitting process. I've even run in to websites that require you to use send_keys 1 at a time for usernames and passwords to avoid some anti-scraping technologies they employ. In these cases, I usually use the following between the calls:

    from random import random, randint
    
    def sleepyTime(first=5, second=10):
        # returns the value of the time slept (as float)
        # sleeps a random amount of time between the number variable in first
        # and the number variable second (in seconds)
        sleepy_time = round(random() * randint(first, second), 2)
        sleepy_time = sleepy_time if sleepy_time > first else (first + random())
        sleep(sleepy_time)
        return sleepy_time
    

    I don't see what use you have for making the _email and _password variables global, unless they are being changed somewhere in the login function and you want that change to be precipitated out to the other scopes.

    How I would try to solve it

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.common.exceptions import NoSuchElementException, TimeoutException
    
    TIME_TIMEOUT = 20 # Twenty-second timeout default
    
    def eprint(*args, **kwargs):
        """ Prints an error message to the user in the console (prints to sys.stderr), passes
        all provided args and kwargs along to the function as usual. Be aware that the 'file' argument
        to print can be overridden if supplied again in kwargs.
        """
        print(*args, file=sys.stderr, **kwargs)
    
    
    def login(driver):
        global _email, _password
        try:
            email = WebDriverWait(driver, TIME_TIMEOUT).until(EC.presence_of_element_located((By.XPATH, "//input[@id='user_email']")))
            pw = WebDriverWait(driver, TIME_TIMEOUT).until(EC.presence_of_element_located((By.XPATH, "//input[@id='password']"))
            pw.submit()
            # if this doesn't work try the following:
            # btn_submit = WebDriverWait(driver, TIME_TIMEOUT).until(EC.element_to_be_clickable((By.XPATH, "//button[@track-element='click-for-login']"))
            # btn_submit.click() 
            # if that doesn't work, try to add some random wait times using the 
            # sleepyTime() example from above to add some artificial waiting to your email entry, your password entry, and the attempt to submit the form.
    
    except NoSuchElementException as ex:
        eprint(ex.msg())
    
    except TimeoutException as toex:
        eprint(toex.msg)
    
    if __name__ == '__main__':
        driver = webdriver.Chrome('/usr/bin/chromium/chromedriver',chrome_options=chrome_options)
        #d.get('https://www.google.nl/')
        #driver = webdriver.Chrome()
        driver.maximize_window()
        driver.get('https://www.goeventz.com/')
        if login(driver) is not None:
            print(create_event(driver))
    
    0 讨论(0)
  • 2020-11-22 16:15

    For headless chrome browser you need to provide window size as well in chrome options.For headless browser selenium unable to know what your window size.Try that and let me know.

    chrome_options = webdriver.ChromeOptions()
    chrome_options.add_argument('--headless')
    chrome_options.add_argument('--no-sandbox')
    chrome_options.add_argument('--disable-dev-shm-usage')
    chrome_options.add_argument('window-size=1920x1480')
    
    0 讨论(0)
  • 2020-11-22 16:19

    This error message...

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

    ...implies that the desired element was not interactable when you tried to invoke click() on it.

    A couple of facts:

    • When you initialize the Chrome browser always in maximized mode.
    • You can disable-extensions.
    • You need to disable-infobars as well.

    I have used the same xpath which you have constructed and you can use the following solution:

    • Code Block:

      from selenium import webdriver
      from selenium.webdriver.support.ui import WebDriverWait
      from selenium.webdriver.support import expected_conditions as EC
      from selenium.webdriver.common.by import By
      
      options = webdriver.ChromeOptions()
      options.add_argument("start-maximized");
      options.add_argument("disable-infobars")
      options.add_argument("--disable-extensions")
      driver = webdriver.Chrome(chrome_options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
      driver.get("https://www.goeventz.com/")
      WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//a[@track-element='header-login']"))).click()
      
    • Browser Snapshot:

    0 讨论(0)
提交回复
热议问题