-1

I am trying to auto-login with my GMail account with Selenium in Python, but I am getting this error:

selenium.common.exceptions.ElementNotVisibleException: Message: Element is not currently visible and so may not be interacted with

My code looks like this:

#!/usr/bin/python
# coding: utf8

import scrapy

from selenium import webdriver
from scrapy.selector import Selector
from selenium.webdriver.common.action_chains import ActionChains
from scrapy.contrib.spiders import CrawlSpider
from scrapy.selector import HtmlXPathSelector
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.http import Request, FormRequest
from scrapy import log
from scrapy.exceptions import DropItem
from scrapy import signals
from selenium.webdriver.common.by import By
import scrapy
from scrapy import signals
from scrapy.http import TextResponse 
from scrapy.xlib.pydispatch import dispatcher
from selenium import webdriver
from selenium.webdriver.common.keys import Keys


class googleplay(CrawlSpider):
    name = "selenium"
    flag = True

    def __init__(self):
        self.driver = webdriver.Firefox()
        self.driver.get('http://gmail.com')
        action = webdriver.ActionChains(self.driver)
        #User name input field identification and data entered
        usernametext = self.driver.find_element_by_name('Email')
        usernametext.send_keys("myemailaddress@gmail.com") #put your actual username
        self.driver.find_element_by_name('signIn').click()
        time.sleep(2)
        #Password input field identification and data entered
        passwordtext = self.driver.find_element_by_name('Passwd')
        passwordtext.send_keys("password") #put your actual password
        key = self.driver.find_element_by_name('signIn')
        print "----------------------"
        key.click()
        print "----------------------"
        start_urls = ["https://www.mywebsite.com"]    

    def parse(self, reponse):
        #Loading the gmail URL
        print "toto"

How I can fix my problem?

tckmn
  • 57,719
  • 27
  • 114
  • 156
pi-2r
  • 1,259
  • 4
  • 27
  • 52
  • You sure you don't want to use a [API](https://github.com/charlierguo/gmail) for this? – K DawG Nov 14 '15 at 13:24
  • Have you tried changing the url ? Use `https://accounts.google.com/ServiceLogin?service=mail#identifier` instead of `http://gmail.com` – Rahul Nov 14 '15 at 13:54
  • I need to use selenium in order to scrap some information, after will be authenticated.... – pi-2r Nov 14 '15 at 14:02

1 Answers1

1

Try changing the url. Use https://accounts.google.com/ServiceLogin?service=mail#identifier instead of http://gmail.com.

Make sure you use your original email and password. And change self.driver.find_element_by_name to self.driver.find_element_by_id for every element.

Your code will be:

#!/usr/bin/python
# coding: utf8

import scrapy
import time
from selenium import webdriver
from scrapy.selector import Selector
from selenium.webdriver.common.action_chains import ActionChains
from scrapy.contrib.spiders import CrawlSpider
from scrapy.selector import HtmlXPathSelector
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.http import Request, FormRequest
from scrapy import log
from scrapy.exceptions import DropItem
from scrapy import signals
from selenium.webdriver.common.by import By
from scrapy import signals
from scrapy.http import TextResponse 
from scrapy.xlib.pydispatch import dispatcher
from selenium import webdriver
from selenium.webdriver.common.keys import Keys


class googleplay(CrawlSpider):
    name = "selenium"
    flag = True

    def __init__(self):
        self.driver = webdriver.Firefox()
        self.driver.get('http://gmail.com')
        action = webdriver.ActionChains(self.driver)
        #User name input field identification and data entered
        usernametext = self.driver.find_element_by_name('Email')
        usernametext.send_keys("myemail@gmail.com") #put your actual username
        self.driver.find_element_by_name('signIn').click()
        #Password input field identification and data entered
        passwordtext = self.driver.find_element_by_id('Passwd')
        passwordtext.send_keys("mypassword") #put your actual password
        self.driver.find_element_by_id('signIn').click()
        print "----------------------"
        #key.click()
        print "----------------------"
        start_urls = ["https://www.mywebsite.com"]    

    def parse(self, reponse):
        #Loading the gmail URL
        print "toto" 
Rahul
  • 3,208
  • 8
  • 38
  • 68
  • It's working fine for me. You need to import time module as well: `import time`. You can also try changing this line `usernametext = self.driver.find_element_by_id('Email')` – Rahul Nov 14 '15 at 14:07
  • And make sure you use your original email and password. And change `self.driver.find_element_by_name` to `self.driver.find_element_by_id` for every element. – Rahul Nov 14 '15 at 14:31
  • yes, my email and my password are good ... If I change`self.driver.find_element_by_name('signIn').click()` by `self.driver.find_element_by_id('signIn').click()` I've got the same error: ` selenium.common.exceptions.ElementNotVisibleException: Message: Element is not currently visible and so may not be interacted with` – pi-2r Nov 14 '15 at 15:27