How to automate Zerodha using Selenium

#!/usr/local/bin/python

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
import json
import pdb
import os
os.chdir(os.path.dirname(os.path.abspath(__file__)))

class ZerodhaSelenium( object ):

   def __init__( self ):
      self.timeout = 5
      self.loadCredentials()
      self.driver = webdriver.Chrome()

   def getCssElement( self, cssSelector ):
      '''
      To make sure we wait till the element appears
      '''
      return WebDriverWait( self.driver, self.timeout ).until( EC.presence_of_element_located( ( By.CSS_SELECTOR, cssSelector ) ) )

   def loadCredentials( self ):
      self.username = "Your_username_here"
      self.password = "Your_password_here"
      self.security = "Your_pin_here"

   def doLogin( self ):
      #let's login
      self.driver.get( "https://kite.zerodha.com/")
      try:
         passwordField = self.getCssElement( "input[placeholder=Password]" )
         print(passwordField)
         passwordField.send_keys( self.password )
         userNameField = self.getCssElement( "input[placeholder='User ID']" )
         print(userNameField)
         userNameField.send_keys( self.username )
         loginButton = self.getCssElement( "button[type=submit]" )
         loginButton.click()

         # 2FA
         form2FA = self.getCssElement( "form.twofa-form" )
         print(form2FA)
         fieldAnswer1 = form2FA.find_element_by_css_selector( "div:nth-child(2) > div > input[type=password]" )
         print(fieldAnswer1)
         buttonSubmit = self.getCssElement( "button[type=submit]" )

         fieldAnswer1.send_keys( self.security)
         buttonSubmit.click()

      except TimeoutException:
         print( "Timeout occurred" )

      pdb.set_trace()
      # close chrome
      self.driver.quit()

if __name__ == "__main__":
   obj = ZerodhaSelenium()
   obj.doLogin()
2 Likes

Download the chromedriver from chromedriver.storage.googleapis.com/index.html?path=78.0.3904.105/ and put it to the same folder where the program is and run the program.

That’s it.

but this only does the login part right? how about placing an order? I know coding myself so if you could guide me, I could do that

I recently made a change which logs in, clicks on “Positions” tab and then take screenshot.

import os,sys
os.chdir(os.path.dirname(os.path.abspath(__file__)))
from selenium import webdriver

#Download ChromeDriver from https://chromedriver.chromium.org/downloads and Put on Same Folder
chromedriver = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'chromedriver.exe')
os.environ["webdriver.chrome.driver"] = chromedriver

username=""
password=""
pin=""

driver = webdriver.Chrome(chromedriver)
driver.get("https://kite.zerodha.com")
driver.maximize_window()
time.sleep(5)

username_input = '//*[@id="userid"]'
driver.find_element_by_xpath(username_input).send_keys(username)

password_input = '//*[@id="password"]'
driver.find_element_by_xpath(password_input).send_keys(password)

submit_input = '//*[@id="container"]/div/div/div/form/div[4]/button'
driver.find_element_by_xpath(submit_input).click()
time.sleep(5)

#Pin Part
driver.find_element_by_xpath('//*[@id="pin"]').send_keys(pin)
driver.find_element_by_xpath('//*[@id="container"]/div/div/div/form/div[3]/button').click()
time.sleep(3)

#Click on Postions Page
driver.find_element_by_xpath('//*[@id="app"]/div[1]/div/div[2]/div[1]/a[4]').click()
time.sleep(5)

#Take Screenshot of the Positions Page
element = driver.find_element_by_xpath('//*[@id="app"]/div[2]/div[2]')
element_png = element.screenshot_as_png
element_png_url =os.path.join(os.path.dirname(os.path.realpath(__file__)), username+'_ss.png')
with open(element_png_url, "wb") as file:
  file.write(element_png) 

You can just see tutorials of Selenium and Python on Internet. Its pretty easy. Here is starter - https://medium.com/swlh/get-started-with-selenium-webdriver-in-under-5-minutes-f9b91e2e9539