Sending keys via Selenium to Google Auth fails (using Python and Firefox)

I am following a Django Tutorial by Marina Mele, which is pretty good but a bit outdated since it was last updated in 2016, I believe. I am now trying the Selenium testing and ran into the problem that I can send my e-mail address via Selenium but not the password. My code is

    self.get_element_by_id("identifierId").send_keys(credentials["Email"])
    self.get_button_by_id("identifierNext").click()

    self.get_element_by_tag('input').send_keys(credentials["Passwd"])
    self.get_button_by_id("passwordNext").click()

with these functions being defined as:

 def get_element_by_id(self, element_id):
    return self.browser.wait.until(EC.presence_of_element_located(
            (By.ID, element_id)))

def get_element_by_tag(self, element_tag):
    return self.browser.wait.until(EC.presence_of_element_located(
            (By.TAG_NAME, element_tag)))

def get_button_by_id(self, element_id):
    return self.browser.wait.until(EC.element_to_be_clickable(
            (By.ID, element_id)))

Most advices that I read to this issue circled around waiting until the element appears. However, this is covered through these functions. And I am using by_tag since the current version of Google Authentication is using an input for the password field that has not an ID but is a div/div/div child of the div with the "passwordIdentifier"-id. I have also tried using Xpath but it seems that this does not make a difference.

Also, it seems like Selenium is capable of finding the elements...at least when I check with print commands. So, locating the element seems not to be the problem. However, Selenium fails to send the keys from what I can see when I look at what happens in the Firefox browser, while Selenium is testing. What could be the issue? Why is Selenium struggling to send the password keys to the Authentication form?

Thanks to everyone in advance!

1 answer

  • answered 2018-01-14 11:06 Nathan Ripert

    When you search an input on google registration page, you will find 8 WebElements. I think it is the origin of your problem.

    I would use another localizer such as an xpath = //input[@name='password'] or a By on the name instead of the tag name, as implemented below:

    def get_element_by_name(self, element_tag):
        return self.browser.wait.until(EC.presence_of_element_located(
            (By.NAME, element_tag)))
    

    and:

    self.get_element_by_id("identifierId").send_keys(credentials["Email"])
    self.get_button_by_id("identifierNext").click()
    
    self.get_element_by_name('password').send_keys(credentials["Passwd"])
    self.get_button_by_id("passwordNext").click()