def change_date(browser, absentee_date): wait_for_id(browser, "advFindEFGRP0FFLD2CCVALLBL") masked_date = browser.find_element_by_id("advFindEFGRP0FFLD2CCVALLBL") hover = ActionChains(browser).move_to_element(masked_date) hover.perform() date = browser.find_element_by_id("DateInput") date.click() date.clear() date.send_keys(absentee_date)
def find_allotment(driver, dt=None, mecd=None): #P - PURHCASE, R - REDEMPTION if dt: dt = dt else: dt = datetime.now().strftime('%d-%b-%Y') url = settings.BSESTAR_ALLOTMENT_PG[settings.LIVE] driver.get(url) print("Navigated to order status page") date = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, 'txtToDate'))) date.clear() date.send_keys(dt) sleep(2) # needed as page refreshes after setting date submit = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "btnSubmit"))) submit.click() sleep(2) ## parse the table- find orders for this date table = WebDriverWait(driver, 10).until( EC.presence_of_element_located( (By.XPATH, "//table[@class='glbTableD']/tbody"))) print('html loading done') rows = table.find_elements(By.XPATH, "tr[@class='tblERow'] | tr[@class='tblORow']") allotment_recs = [] for row in rows: fields = row.find_elements(By.XPATH, "td") recs = { 'order_id': fields[1].text, 'order_dt': fields[4].text, 'scheme_code': fields[5].text, 'member_id': fields[10].text, 'folio_num': fields[12].text, 'client_code': fields[15].text, 'client_name': fields[16].text, 'alloted_nav': fields[18].text, 'alloted_unt': fields[19].text, 'alloted_amt': fields[20].text, 'remarks': fields[22].text, 'order_type': fields[25].text, 'order_subtype': fields[33].text, 'sipreg_num': fields[26].text, 'sipreg_dt': fields[27].text, 'dp_typ': fields[32].text, } allotment_recs.append(recs) print("line 262:", allotment_recs) return allotment_recs, driver
def find_order_status(driver, dt=None, tran_type='P',frmclntcd = None,toclntcd = None): #P - PURHCASE, R - REDEMPTION if dt: dt = dt else: dt = datetime.now().strftime('%d-%m-%Y')) url = settings.BSESTAR_ORDER_STATUS_PG[settings.LIVE] driver.get(url) print("Navigated to order status page") date = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, 'txtToDate'))) date.clear() date.send_keys(date_dict['date'].strftime("%d-%b-%Y")) sleep(2) # needed as page refreshes after setting date # make_ready(driver) if frmclntcd == None or frmclntcd == '' or toclntcd == None or toclntcd == '': pass else: frmcltcd = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, 'txtFromCltCode'))) date.clear() date.send_keys(frmclntcd) tocltcd = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, 'txtToCltCode'))) date.clear() date.send_keys(toclntcd) element = driver.find_element_by_xpath('//*[@id="ddlBuySell"]') all_options = element.find_elements_by_tag_name("option") for option in all_options: print("Value is: %s" % option.get_attribute("value")) if option.get_attribute("value") == tran_type: #selected option purcharse or redemption as per tran_type option.click() submit = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "btnSubmit"))) submit.click() sleep(2) ## parse the table- find orders for this date table = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//table[@class='glbTableD']/tbody"))) print ('html loading done') rows = table.find_elements(By.XPATH, "tr[@class='tblERow'] | tr[@class='tblORow']") order_status_recs = [] for row in rows: fields = row.find_elements(By.XPATH, "td") recs = { 'order_id' : fields[3].text, 'status' : fields[18].text, 'client_code' : fields[5].text, 'scheme_code' : fields[7].text, 'buy_sell' : fields[10].text }
html.send_keys(Keys.PAGE_DOWN) time.sleep(1) # Pelaksanaan (PART OF LOOP) element_click(mark, 1) # Media Mark element_click(mark, mediaA[i]) if i == 0: element_click(mark, mediaB[i]) #tanggal (PART OF LOOP?) if i == 6: dateNow = str(yesterday).split('-') date = driver.find_element_by_xpath("%s[%s]" % (inputan, 3)) date.send_keys(dateNow[1], dateNow[2][0:1], dateNow[0]) else: # jam (PART OF LOOP) element_fill(hoursE[i], hoursV[i]) element_fill(minutesE[i], minutesV[i]) # materi, import from txt files. (PART OF LOOP OFC) if i == 6: element_fill(4, materiKuliah[i]) else: element_fill(materiE[i], materiKuliah[i]) html.send_keys(Keys.PAGE_DOWN) time.sleep(10) # confirmation box
def update_order_status(self, driver): ''' Updates status (see field status in Transaction model in transactions) of transactions BSEStar hasn't implemented this as an API endpoint so it needs crawling of bsestarmf.in ''' ## fetch the transactions that need to be updated tr_queryset = Transaction.objects.filter( Q(status__in=('2','4','5')) | Q(status='6', order_type='2') ).order_by( 'created' ) tr_list = [] for tr in tr_queryset: ## remove sip transactions whose instalment is not under process if tr.order_type == '2' and tr.sip_num_inst_done == len(tr.sip_dates.split(',')): pass else: tr_list.append(tr) ## process transaction time to find order date date_dict_list = [] date_dict = None prev_order_d = date(2016, 1, 1) for tr in tr_list: ## get date of order order_dt = tr.created.replace(tzinfo=timezone('UTC')).astimezone(timezone('Asia/Calcutta')) if tr.order_type == '1': ## get order_id of the transaction order_id = TransResponseBSE.objects.get(trans_no=tr.bse_trans_no).order_id else: order_ids = tr.sip_order_ids.split(',') if len(order_ids) > tr.sip_num_inst_done: order_id = order_ids[tr.sip_num_inst_done] if len(order_ids) > 1: ## update order_dt because its a sip instalment order_dt = datetime(*(strptime(tr.sip_dates.split(',')[tr.sip_num_inst_done], "%d%m%y")[0:3])) print order_dt else: ## problem in sip_order_ids field raise Exception( "Update order status: order id not found in Transaction table" ) ## dont check for orders/instalments which will be placed in future if order_dt.date() > date.today(): continue order_d = self.calculate_order_date(order_dt) ## raise exception as no order date found if not order_d: raise Exception( "Update order status: order date could not be found" ) ## dont check for orders/instalments which are offline currently elif order_d > date.today(): continue ## save order id and date if prev_order_d != order_d: date_dict = { 'date': order_d, 'ids': [tr.id], 'order_ids': [order_id], 'status': ['0'], 'folio': [''], } date_dict_list.append(date_dict) prev_order_d = order_d else: date_dict['ids'].append(tr.id) date_dict['order_ids'].append(order_id) date_dict['status'].append('0') date_dict['folio'].append('') ## crawl to get orders by date for date_dict in date_dict_list: ## navigate to page line = "https://www.bsestarmf.in/RptOrderStatusReportNew.aspx" driver.get(line) print (driver.title) date = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, 'txtToDate'))) date.clear() date.send_keys(date_dict['date'].strftime("%d-%b-%Y")) sleep(2) # needed as page refreshes after setting date # make_ready(driver) submit = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "btnSubmit"))) submit.click() sleep(2) # make_ready(driver) ## parse the table- find orders for this date table = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//table[@class='glbTableD']/tbody"))) print ('html loading done') rows = table.find_elements(By.XPATH, "tr[@class='tblERow'] | tr[@class='tblORow']") for row in rows: fields = row.find_elements(By.XPATH, "td") order_id = fields[3].text status = fields[18].text if status == "ALLOTMENT DONE": status = '6' elif status == "SENT TO RTA FOR VALIDATION": status = '5' elif status == "ORDER CANCELLED BY USER": status = '1' elif status == "PAYMENT NOT RECEIVED TILL DATE": status = '-1' # match with list of order ids for i in range(0, len(date_dict['ids'])): if order_id == date_dict['order_ids'][i]: date_dict['status'][i] = status date_dict['folio'][i] = fields[15].text print "found", order_id, status break ## save status in db for date_dict in date_dict_list: for i in range(0, len(date_dict['ids'])): if date_dict['status'][i] != '0': tr = Transaction.objects.get(id=date_dict['ids'][i]) ## one-time or 1st isnt of sip transaction if tr.status in ['2','4','5']: ## update status and status_comment if date_dict['status'][i] == '-1': if tr.status == '2': tr.status_comment = 'Failed due to no payment' else: tr.status_comment = 'Failed due to error in payment' tr.status = '1' ## update status, folio, datetime elif date_dict['status'][i] == '6': tr.status = date_dict['status'][i] if date_dict['folio'][i] != '': tr.folio_number = date_dict['folio'][i] if tr.order_type == '2': tr.sip_num_inst_done = 1 tr.datetime_at_mf = datetime(date_dict['date'].year, date_dict['date'].month, date_dict['date'].day, 12, 0, 0, tzinfo=timezone('UTC')) else: tr.status = date_dict['status'][i] ## 2nd or later inst of sip transaction elif tr.status == '6' and tr.order_type == '2': if date_dict['status'][i] == '6': ## update sip_num_inst_done as instalment successful tr.sip_num_inst_done += 1 if tr.sip_num_inst_done == tr.sip_num_inst: ## update to sip concluded tr.status = '8' elif date_dict['status'][i] in ['-1', '1']: ## update sip_dates and sip_order_ids as instalment was unsuccessful last_pos = tr.sip_dates.rfind(',') tr.sip_dates = tr.sip_dates[:last_pos] last_pos = tr.sip_order_ids.rfind(',') tr.sip_order_ids = tr.sip_order_ids[:last_pos] tr.save()
from datetime import date from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.by import By from selenium.webdriver.common.action_chains import ActionChains driver = webdriver.Chrome('F:\chromedriver.exe') driver.get('https://formy-project.herokuapp.com/scroll'); name = driver.find_element_by_id('name') actions = ActionChains(driver) actions.move_to_element(name) name.send_keys('Sam Warren') date = driver.find_element_by_id('date') date.send_keys('01/13/1992') # Consider adding code to fill today's date driver.quit()