Selenium - Login raises ElementNotVisibleException
Question: I am using Selenium Webdriver to login to a site. I've tried multiple
different selectors, and have tried implicit waits, but cannot locate the
element.

    
    
        from selenium import webdriver
        from selenium.webdriver.common.by import By
    
        browser = webdriver.Firefox()
        url = "https://www.example.com"
        login_page = browser.get(url)
    
        username = browser.find_element_by_id("Email")
        # Also tried:
        # username = browser.find_element_by_xpath('//*[@id="Email"]')
        # username = browser.find_element_by_css_selector('#Email')
        username.send_keys("email")
    

This is the html

    
    
    <div class="form-group">
        <label for="Email">Email address</label>
        <div class="input-group" style="width: 100%">
            <input class="form-control email" data-val="true" data-val-length="Maximum length is 50" data-val-length-max="50" data-val-regex="Provided email address is not valid" data-val-regex-pattern="^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$" data-val-required="Email is required" id="Email" name="Email" type="email" value=""><br>
            <span class="field-validation-valid" data-valmsg-for="Email" data-valmsg-replace="true"></span>
        </div>
    </div>
    

Here is the error message

    
    
    Traceback (most recent call last):
      File "seleniumloginpi.py", line 12, in <module>
        email.send_keys('email')
      File "/Users/greg/anaconda/envs/trade/lib/python2.7/site-packages/selenium/webdriver/remote/webelement.py", line 320, in send_keys
        self._execute(Command.SEND_KEYS_TO_ELEMENT, {'value': keys_to_typing(value)})
      File "/Users/greg/anaconda/envs/trade/lib/python2.7/site-packages/selenium/webdriver/remote/webelement.py", line 461, in _execute
        return self._parent.execute(command, params)
      File "/Users/greg/anaconda/envs/trade/lib/python2.7/site-packages/selenium/webdriver/remote/webdriver.py", line 236, in execute
        self.error_handler.check_response(response)
      File "/Users/greg/anaconda/envs/trade/lib/python2.7/site-packages/selenium/webdriver/remote/errorhandler.py", line 192, in check_response
        raise exception_class(message, screen, stacktrace)
    selenium.common.exceptions.ElementNotVisibleException: Message: Element is not currently visible and so may not be interacted with
    Stacktrace:
        at fxdriver.preconditions.visible (file:///var/folders/2h/3nnr94wx0f9g9bjcl0ks_g1w0000gn/T/tmpfAR5E7/extensions/fxdriver@googlecode.com/components/command-processor.js:10092)
        at DelayedCommand.prototype.checkPreconditions_ (file:///var/folders/2h/3nnr94wx0f9g9bjcl0ks_g1w0000gn/T/tmpfAR5E7/extensions/fxdriver@googlecode.com/components/command-processor.js:12644)
        at DelayedCommand.prototype.executeInternal_/h (file:///var/folders/2h/3nnr94wx0f9g9bjcl0ks_g1w0000gn/T/tmpfAR5E7/extensions/fxdriver@googlecode.com/components/command-processor.js:12661)
        at DelayedCommand.prototype.executeInternal_ (file:///var/folders/2h/3nnr94wx0f9g9bjcl0ks_g1w0000gn/T/tmpfAR5E7/extensions/fxdriver@googlecode.com/components/command-processor.js:12666)
        at DelayedCommand.prototype.execute/< (file:///var/folders/2h/3nnr94wx0f9g9bjcl0ks_g1w0000gn/T/tmpfAR5E7/extensions/fxdriver@googlecode.com/components/command-processor.js:12608)
    

Any help would be greatly appreciated.


Answer: Actually you are locating element, problem with the `send_keys`, here could
not be set value on the email input due to invisibility of element. But as I
see in provided HTML no style attribute property exists on email input element
which could make it invisible.

May be possible there are more elements with the same id and you are
interacting with other element, you should try with some different locator as
below :-

    
    
    username = browser.find_element_by_css_selector('div.input-group input#Email.form-control.email')
    username.send_keys("email") 
    

Or try to find all elements with the Id `Email` and perform `send_keys()` on
visible element as below :

    
    
    usernames = browser.find_elements_by_id('Email')
    
    for username in usernames:
       if username.is_displayed():
            username.send_keys("email") 
            break
    

