def my_input2(driver, a, res, inp): for pole in a: if res[pole] != None: if res[pole] != '': elem = p(d=driver, f='p', **inp[pole]) # elem.send_keys(' ') # elem.clear() elem.send_keys(' ') # elem.send_keys(res[pole]) for iq in range(1, 200): elem.send_keys(Keys.BACKSPACE) for fucked_char in res[pole]: elem.send_keys(fucked_char) wj(driver) elem = p(d=driver, f='p', **inp['ЩелчокДляСброса']) wj(driver) elem.click() wj(driver)
def my_input(driver, a, res, inp): for pole in a: if res[pole] != None: if res[pole] != '': elem = p(d=driver, f='c', **inp[pole]) # wj(driver) # elem.click() # wj(driver) # elem.clear() wj(driver) if pole in [ 'УлицаРАБ', 'УлицаРЕГ', 'УлицаФАКТ', 'НазвДолжности', 'НасПунктРАБ', 'НасПунктРЕГ', 'НасПунктФАКТ' ]: res[pole] = s_minus(res[pole]).replace('.', ' ').replace( ',', ' ').replace(';', ' ').replace(' ', ' ') if pole in [ 'ДомРАБ', 'ДомРЕГ', 'ДомФАКТ', 'КорпусРАБ', 'КорпусРЕГ', 'КорпусФАКТ' ]: res[pole] = res[pole].replace(' ', '') if pole in ['РегионРАБ', 'РегионРЕГ', 'РегионФАКТ']: res[pole] = s_minus(res[pole]).replace('.', ' ').upper() if res[pole].find('РЕСП') > -1: if res[pole].find('УДМУРТСКАЯ') == -1: res[pole] = 'РЕСП ' + res[pole].replace( 'РЕСП', '').strip() elif res[pole].find('ОКРУГ') > -1 or res[pole].find('ОБЛ') > -1 or res[pole].find('КРАЙ') > -1 \ or res[pole].find('РАЙОН') > -1: q = 0 elif res[pole].find('Г') > -1: # if res[pole].find('МОСКВА') > -1: # res[pole] = res[pole].replace('Г', '').strip() # else: res[pole] = 'Г. ' + res[pole].replace('Г', '').strip() for fucked_char in s(res[pole]): elem.send_keys(fucked_char) wj(driver) elem = p(d=driver, f='p', **inp['ЩелчокДляСброса']) wj(driver) elem.click() wj(driver)
elem = p(d=driver, f='p', **inputtity['ФИО']) wj(driver) elem.send_keys('.') wj(driver) lang_check = p(d=driver, f='p', **inputtity['ФИОЗнач']) wj(driver) if lang_check == 'Ю': ActionChains(driver).key_down(Keys.LEFT_ALT).key_down(Keys.LEFT_SHIFT)\ .click(elem).key_up(Keys.LEFT_ALT).key_up(Keys.LEFT_SHIFT).perform() wj(driver) elem.send_keys(Keys.BACK_SPACE) wj(driver) """ my_input(driver, ['ФИО', 'МобТелефон', 'Email', 'КредЛимит'], res_inp, inputtity) if p(d=driver, f='p', **clicktity['СоглашенКонфиденцСостояние'] ) == 'ui-checkbox app-form-action-agreement': wj(driver) elem = p(d=driver, f='p', **clicktity['СоглашенКонфиденц']) wj(driver) elem.click() wj(driver) wj(driver) elem = p(d=driver, f='c', **clicktity['Далее']) wj(driver) elem.click() wj(driver) if not chk(d=driver, f='c', **clicktity['Шаг2']): error = p(d=driver, f='p', **clicktity['Ошибки']) wj(driver) continue
def use_order(self, order, ajson): fromSQL = '' if order.get('SQL'): # "Разворачиваем" любой уровень вложенности json fromSQL = ajson for stepSQL in order['SQL']: fromSQL = fromSQL[stepSQL] # проверяем на наличие элемента, если нет - пропускаем цикл if order.get('check'): data4send = {'t': 'x', 's': order['check']} elem = p(d=self.driver, f='p', **data4send) wj(self.driver) if not elem: return if elem.get_attribute('value'): return # проверяем есть ли доставка курьером, если нет - исключение if order.get('check-delivery'): data4send = {'t': 'x', 's': order['check-delivery']} elem = p(d=self.driver, f='p', **data4send) wj(self.driver) if not elem: raise NoDeliveryException if order.get('check-absence'): data4send = {'t': 'x', 's': order['check-absence']} elem = p(d=self.driver, f='p', **data4send) wj(self.driver) if elem: return if order.get('pre-click'): data4send = {'t': 'x', 's': order['pre-click']} elem = p(d=self.driver, f='c', **data4send) wj(self.driver) elem.click() if order.get('check-has-menu'): data4send = { 't': 'x', 's': order['check-has-menu'] + str(fromSQL) + '")]/..' } elem = p(d=self.driver, f='p', **data4send) wj(self.driver) if not elem: raise NoDeliveryException # проверяем на наличие элемента, если нет - ждем пока не появится if order.get('check-until'): data4send = {'t': 'x', 's': order['check-until']} elem = p(d=self.driver, f='p', **data4send) wj(self.driver) while not elem: pass # проверяем заполненность поля input, если текст есть - пропускаем цикл if order.get('check-value'): data4send = {'t': 'x', 's': order['check-value']} elem = p(d=self.driver, f='p', **data4send) wj(self.driver) if elem.get_attribute('value'): return # проверяем наличие если текста нет - переходим к следующему order (пропускаем цикл) if order.get('check-text'): wj(self.driver) current_html = self.driver.find_element_by_xpath( order['check-text']).get_attribute('innerHTML') current_reactid = str( int(current_html.split('data-reactid="')[1].split('"')[0]) - 1) wj(self.driver) data4send = { 't': 'x', 's': '//DIV[@data-reactid="' + current_reactid + '"]' } elem = p(d=self.driver, f='p', **data4send) wj(self.driver) if elem.get_attribute('class').find('part_hidden') > -1: return # проверяем на наличие элемента в списке, если ни одного нет - RequiredDocumentException if order.get('check-with-name'): elems = self.driver.find_elements_by_xpath( order['check-with-name']) wj(self.driver) has_name = False documents = '' for elem in elems: if elem.text and elem.text != 'Не могу предоставить': documents += ', ' + elem.text if fromSQL: if elem.text.find(fromSQL) > -1: has_name = True documents = documents.strip(',').strip() if fromSQL == None and len(elems): raise RequiredDocumentException if len(elems) and not has_name: raise RequiredDocumentException if order.get('pre-wait'): time.sleep(order['pre-wait']) if order.get('click'): data4send = {'t': 'x', 's': order['click']} elem = p(d=self.driver, f='c', **data4send) wj(self.driver) elem.click() if fromSQL and order.get('input'): data4send = {'t': 'x', 's': order['input']} elem = p(d=self.driver, f='p', **data4send) wj(self.driver) # elem.send_keys(' ') # elem.clear() elem.send_keys(fromSQL) wj(self.driver) if fromSQL and order.get('input-tel'): data4send = {'t': 'x', 's': order['input-tel']} elem = p(d=self.driver, f='p', **data4send) wj(self.driver) elem.send_keys(' ') elem.clear() elem.send_keys(' ') elem.send_keys(fromSQL[1:]) wj(self.driver) if fromSQL and order.get('char-input'): data4send = {'t': 'x', 's': order['char-input']} elem = p(d=self.driver, f='c', **data4send) wj(self.driver) for char in s(fromSQL): elem.send_keys(char) wj(self.driver) if str(fromSQL) != 'None' and str(order.get('select')) != 'None': if len(order['select']) >= int(fromSQL): data4send = {'t': 'x', 's': order['select'][int(fromSQL)]} elem = p(d=self.driver, f='c', **data4send) wj(self.driver) elem.click() if fromSQL and order.get('click-text'): data4send = { 't': 'x', 's': order['click-text'] + str(fromSQL) + '"]' } elem = p(d=self.driver, f='c', **data4send) wj(self.driver) elem.click() if fromSQL and order.get('click-text-up'): data4send = { 't': 'x', 's': order['click-text-up'] + str(fromSQL) + '")]/..' } elem = p(d=self.driver, f='c', **data4send) wj(self.driver) elem.click() if l(fromSQL) == 1 and order.get('checkbox'): data4send = {'t': 'x', 's': order['checkbox']} elem = p(d=self.driver, f='c', **data4send) wj(self.driver) elem.click() # stamp = self.aid + '(' + str(self.pid) + ')' + datetime.now().strftime("%d-%H:%M:%S") # self.driver.save_screenshot(LOG_PATH + stamp + '.png') if fromSQL and order.get('radio-select'): sel = -1 for j, select in enumerate(order['radio-select-input']): if fromSQL == select: sel = j if sel > -1: data4send = {'t': 'x', 's': order['radio-select'][sel]} elem = p(d=self.driver, f='c', **data4send) wj(self.driver) elem.click() if order.get('pre-wait-post-click'): time.sleep(order['pre-wait-post-click']) if order.get('post-click'): data4send = {'t': 'x', 's': order['post-click']} elem = p(d=self.driver, f='c', **data4send) wj(self.driver) elem.click() if order.get('post-wait'): time.sleep(order['post-wait']) # import ipdb; ipdb.set_trace() if order.get('loaded'): post_status(self.post_url, self.aid, 1, 'передано ' + order['loaded'], self.log, self.bad_log)
def base(self): webconfig = read_config(filename='alfa.ini', section='web') fillconfig = read_config(filename='alfa.ini', section='fill') self.pid = os.getpid() post_api = read_config(filename='alfa.ini', section='postAPI') self.post_url = post_api['url'] if DEBUG_JSON: with open(DEBUG_JSON) as f: inp = f.read() else: inp = sys.stdin.readline().rstrip() ajson = json.loads(inp) self.aid = ajson['click_id'] if ajson['__landing_url']: self.driver.get(url=land2cc_short(ajson['__landing_url']) + '&afclick=' + ajson['click_id']) else: raise RequiredPartnerLinkException loading = ajson['__command']['type'] == 'queue' complete_orderity = False cycles_orderity = 0 formatting_error = '' tek_i = 0 while (not complete_orderity ) and cycles_orderity <= CYCLES_ORDERITY and loading: documents = '' try: # Начинаем заполнять writelog( self.log, self.aid, 'Начинаем заполнять по ссылке' + ajson['__landing_url'] + '&afclick=' + ajson['click_id'] + str(ajson), self.pid) if not tek_i: post_status(self.post_url, self.aid, 1, 'Начинаем выгрузку на сервер', self.log, self.bad_log) for i in range(tek_i, len(orderity)): order = orderity[i] tek_i = i # Проверяем stdin ready, x, y = check_select([sys.stdin], [], [], 0) if ready: self.current_stdin = sys.stdin.readline().rstrip() if self.current_stdin: bjson = json.loads(self.current_stdin) if bjson['__command']['type'] == 'kill': self.current_stdin = '' raise KillException wj(self.driver) # Проверяем на всякие неожиданности current_html = self.driver.find_element_by_xpath( '//HTML').get_attribute('innerHTML') if current_html.find( 'Ваша заявка на кредитную карту устала ждать :)' ) > -1: raise ServerTimeOutException if current_html.find('Ваши дальнейшие шаги') > -1: writelog( self.log, self.aid, 'Банк прервал транcфер заявки, чтобы уточнить некоторые данные ' 'лично у Вас. Ожидайте звонка из Альфа-Банка', self.pid) post_status( self.post_url, self.aid, 11, 'Банк прервал транcфер заявки, чтобы уточнить ' 'некоторые данные лично у Вас. Ожидайте звонка из Альфа-Банка', self.log, self.bad_log) raise UspehException elif current_html.find( 'вы можете подать заявку повторно через 30 дней' ) > -1: raise RejectException if current_html.find('Хотите ускорить заполнение?') > -1: elem = self.driver.find_element_by_xpath( '//SPAN[@class="link__text"][text()="Продолжить заполнение"]' ) wj(self.driver) elem.click() if current_html.find( 'Введите одноразовый пароль из SMS' ) > -1: complete_orderity = True continue self.use_order(order, ajson) complete_orderity = True except ServerTimeOutException: raise except RequiredPartnerLinkException: writelog( self.log, self.aid, 'Необходимо указать партнерскую ссылку - обратитесть к Вашему куратору', self.pid) post_status( self.post_url, self.aid, 5, 'Необходимо указать партнерскую ссылку - обратитесть к ' 'Вашему куратору', self.log, self.bad_log) raise except NoDeliveryException: writelog( self.log, self.aid, 'Для Вашего города доставка курьером невозможна. После ' 'поступления СМС от банка, пройдите по ссылке, указанной в нем и выберите удобное Вам место' ' получения карты', self.pid) post_status( self.post_url, self.aid, 11, 'Этого города нет в списке доставки курьером. Решение - ' 'сказать клиенту: Для Вашего города доставка курьером ' 'невозможна. Мы для Вас заполнили заявку. В течении часа Вам придет СМС со ссылкой на ' 'заполненную заявку. Пройдите по ссылке, выберите удобное Вам место ' 'получения карты и отправьте заявку в Альфа-Банк', self.log, self.bad_log) raise except RequiredDocumentException: writelog( self.log, self.aid, 'Для Вашего региона необходимо предоставить один из документов: ' + documents + '.\n Исправьте заявку и отправьте её заново', self.pid) post_status( self.post_url, self.aid, 11, 'Для Вашего региона необходимо предоставить один из ' 'документов: ' + documents + '.\n Исправьте заявку и отправьте её заново', self.log, self.bad_log) raise except KillException: raise except UspehException: raise except RejectException: raise except Exception as e: time.sleep(1) current_html = self.driver.find_element_by_xpath( '//HTML').get_attribute('innerHTML') if current_html.find( 'Ваша заявка на кредитную карту устала ждать :)') > -1: raise ServerTimeOutException elif current_html.find('Ваши дальнейшие шаги') > -1: writelog( self.log, self.aid, 'Банк прервал транcфер заявки, чтобы уточнить некоторые данные ' 'лично у Вас. Ожидайте звонка из Альфа-Банка', self.pid) post_status( self.post_url, self.aid, 11, 'Банк прервал транcфер заявки, чтобы уточнить ' 'некоторые данные лично у Вас. Ожидайте звонка из Альфа-Банка', self.log, self.bad_log) raise UspehException elif current_html.find( 'вы можете подать заявку повторно через 30 дней') > -1: raise RejectException elif current_html.find('Хотите ускорить заполнение?') > -1: elem = self.driver.find_element_by_xpath( '//SPAN[@class="link__text"]' '[text()="Продолжить заполнение"]') wj(self.driver) elem.click() else: cycles_orderity += 1 data4send = { 't': 'x', 's': '//SPAN[contains(@class,"input_invalid")]//SPAN[@class="input__sub"]/..', 'a': 'text' } input_errors = p(d=al.driver, f='ps', **data4send) errors_nulled = [] data4send = { 't': 'x', 's': '//SPAN[contains(@class,"textarea_invalid")]//SPAN[@class="textarea__sub"]/..', 'a': 'text' } other_errors = p(d=al.driver, f='ps', **data4send) formatting_error = '' if len(input_errors): for i, input_error in enumerate(input_errors): if input_error.strip(' ').strip('\n').strip( ' ').strip('\n').strip(' '): errors_nulled.append( input_error.replace('\n', ': ')) formatting_error = 'Ошибки ввода:' for i, input_error in enumerate(errors_nulled): formatting_error += '\n' + str( i + 1) + ') ' + input_error errors_nulled = [] if len(input_errors): for i, other_error in enumerate(other_errors): if other_error.strip(' ').strip('\n').strip( ' ').strip('\n').strip(' '): if other_error == 'Кем выдан\nПоле обязательно для заполнения': errors_nulled.append( 'Возможно ошибка в Коде подразделения УФМС. ' 'Проверьте код подразделения и заполните поле "Кем выдан"' ) else: errors_nulled.append( other_error.replace('\n', ': ')) for i, other_error in enumerate(errors_nulled): formatting_error += '\n' + str( i + 1) + ') ' + other_error formatting_error += '\n. Исправьте ошибки, сохраните и отправьте заявку заново' nowtime = datetime.now() stamp = self.aid + '(' + str( self.pid) + ')' + nowtime.strftime("%d-%H:%M:%S") if formatting_error: writelog(self.bad_log, self.aid, orderity[tek_i]['alfa'] + formatting_error, self.pid, nowtime) post_status(self.post_url, self.aid, 1, formatting_error, self.log, self.bad_log) raise DecodedErrorException else: writelog( self.bad_log, self.aid, 'Ошибка транспорта: Отправьте заявку заново.\n' 'информация для отладки:' + orderity[tek_i]['alfa'] + '\n' + str(ajson) + '\n * * * \n' + str(e), self.pid, nowtime) html_log = open(LOG_PATH + stamp + '.html', 'w') html_elem = self.driver.find_element_by_xpath('//HTML') html_log.write(html_elem.get_attribute('innerHTML')) html_log.close() self.driver.save_screenshot(LOG_PATH + stamp + '.png') writelog( self.log, self.aid, 'Ошибка - см. лог ошибок, скриншот, файл html', self.pid, nowtime) raise TrasferErrorException # Пока выключил повторную отправку ------------------------------------------ #self.driver.execute_script('window.open("' + ajson['__landing_url'] + '&afclick=' + ajson['click_id'] + # '","_blank");') #self.driver.switch_to.window(self.driver.window_handles[0]) #self.driver.close() #self.driver.switch_to.window(self.driver.window_handles[0]) #tek_i = 0 #----------------------------------------------------------------------------- if complete_orderity: sms_start_time = datetime.now() server_timeout = False uspeh = False last_state = 0 client_timeout = False time.sleep(1) while datetime.now() - sms_start_time < timedelta( minutes=ALOADER_TIMEOUT ) and not server_timeout and not uspeh: while datetime.now() - sms_start_time < timedelta(minutes=ALOADER_TIMEOUT) and not self.current_stdin \ and not server_timeout and not uspeh: time.sleep(1) current_html = self.driver.find_element_by_xpath( '//HTML').get_attribute('innerHTML') if current_html.find('Неправильно введен код смс') > -1 or \ current_html.find('Некорректные данные.\n Пожалуйста, попробуйте ещё раз.') > -1: if last_state != 1: last_state = 1 post_status(self.post_url, self.aid, 5, 'Неправильная СМС, введите заново', self.log, self.bad_log) elif current_html.find( 'Вы превысили количество попыток. ' 'Просьба повторить попытку через 15 минут') > -1: writelog( self.log, self.aid, 'Вы превысили количество возможных SMS за период, ' 'отправьте заявку заново', self.pid) post_status( self.post_url, self.aid, 3, 'Вы превысили количество возможных SMS за период, ' 'отправьте заявку заново через 15 минут', self.log, self.bad_log) raise DecodedErrorException elif current_html.find( 'Ваша заявка на кредитную карту устала ждать :)' ) > -1: raise ServerTimeOutException elif current_html.find( 'вы можете подать заявку повторно через 30 дней' ) > -1: raise RejectException elif (current_html.find('Ваши следующие шаги') > -1) or ( current_html.find('Информация по заявке') > -1): raise UspehException elif (current_html.find(' сек<!-- /react-text --></p>') > -1 or current_html.find('Запросить ' 'повторно можно через 0') > -1) and current_html.find( '60 сек<!-- /react-text --></p>') == -1: if last_state != 2: last_state = 2 writelog(self.log, self.aid, 'Ждем СМС', self.pid) post_status(self.post_url, self.aid, 2, 'Ждем СМС', self.log, self.bad_log) elif (current_html.find('Запросить пароль повторно') > -1 or current_html.find('Превышено ' 'количество попыток ввода пароля.\n Пожалуйста, запросите пароль повторно')) and \ current_html.find('60 сек<!-- /react-text --></p>') == -1: if last_state != 3: last_state = 3 writelog(self.log, self.aid, 'Ждем запроса на СМС', self.pid) post_status(self.post_url, self.aid, 3, 'Ждем запроса на СМС', self.log, self.bad_log) else: if last_state != 6: last_state = 6 writelog( self.log, self.aid, 'Непонятно чего ждем, похоже aloader сбился', self.pid) stamp = self.aid + '(' + str( self.pid) + ')' + datetime.now().strftime( "%d-%H:%M:%S") html_log = open(LOG_PATH + stamp + '.html', 'w') html_elem = self.driver.find_element_by_xpath( '//HTML') html_log.write( html_elem.get_attribute('innerHTML')) html_log.close() self.driver.save_screenshot(LOG_PATH + stamp + '.png') raise TrasferErrorException ready, x, y = check_select([sys.stdin], [], [], 0) if ready: self.current_stdin = sys.stdin.readline().rstrip() if self.current_stdin: bjson = json.loads(self.current_stdin) if bjson['__command']['type'] == 'confirm': try: self.current_stdin = '' writelog(self.log, self.aid, 'Получено СМС: ' + str(bjson), self.pid) data4send = {'t': 'x', 's': smsity['Ввести СМС']} elem = p(d=self.driver, f='p', **data4send) wj(self.driver) for k in range(6): elem.send_keys(Keys.BACKSPACE) wj(self.driver) elem.send_keys(bjson['__command']['value']) wj(self.driver) last_state = 0 except Exception as e: writelog( self.log, self.aid, 'Ошибка при отправлении СМС: ' + str(bjson), self.pid) # data4send = {'t': 'x', 's': '//DIV[@class="confirmation-modal__body"]'} # sms_window = p(d=self.driver, f='p', **data4send) # sms_window_htm = '\n-------- окошко запроса пароля --------\n' +\ # sms_window.get_attribute('innerHTML') sms_window_htm = '' writelog( self.bad_log, self.aid, 'Ошибка при отправлении СМС: ' + str(bjson) + sms_window_htm, self.pid) post_status( self.post_url, self.aid, 5, 'Ошибка при отправлении СМС, повторите отправку ' 'той же СМС', self.log, self.bad_log) elif bjson['__command']['type'] == 'retry': try: self.current_stdin = '' writelog( self.log, self.aid, 'Получена заявка на запрос СМС: ' + str(bjson), self.pid) data4send = { 't': 'x', 's': smsity['Запросить пароль повторно'] } elem = p(d=self.driver, f='c', **data4send) wj(self.driver) elem.click() time.sleep(2) except Exception as e: writelog( self.log, self.aid, 'Ошибка при запросе повторной СМС: ' + str(bjson), self.pid) # data4send = {'t': 'x', 's': '//DIV[@class="confirmation-modal__body"]'} # sms_window = p(d=self.driver, f='p', **data4send) # sms_window_htm = '\n-------- окошко запроса пароля --------\n' +\ # sms_window.get_attribute('innerHTML') sms_window_htm = '' writelog( self.bad_log, self.aid, 'Ошибка при запросе повторной СМС: ' + str(bjson) + sms_window_htm, self.pid) post_status( self.post_url, self.aid, 5, 'Ошибка при запросе повторной СМС, повторите запрос', self.log, self.bad_log) elif bjson['__command']['type'] == 'kill': self.current_stdin = '' raise KillException if datetime.now() - sms_start_time > timedelta( minutes=ALOADER_TIMEOUT): raise ServerTimeOutException else: if loading: raise TrasferErrorException else: post_status(self.post_url, self.aid, 5, 'Ошибка, повторите отправку', self.log, self.bad_log) writelog(self.log, self.aid, 'Вылетел с неизвестной ошибкой', self.pid)
'Мы надеемся на сотрудничество в будущем: вы можете подать заявку повторно ' 'через 30 дней', al.log, al.bad_log) except UspehException as e: writelog(al.log, al.aid, 'Заявка выгружена', al.pid) post_status(al.post_url, al.aid, 4, 'Заявка выгружена', al.log, al.bad_log) except DecodedErrorException: # Если уже все сообщения вывели pass except Exception as e: writelog(al.log, al.aid, 'Вылетел с ошибкой: ' + str(e), al.pid) data4send = { 't': 'x', 's': '//SPAN[contains(@class,"input_invalid")]//SPAN[@class="input__sub"]/..', 'a': 'text' } input_errors = p(d=al.driver, f='ps', **data4send) errors_nulled = [] data4send = { 't': 'x', 's': '//SPAN[contains(@class,"textarea_invalid")]//SPAN[@class="textarea__sub"]/..', 'a': 'text' } other_errors = p(d=al.driver, f='ps', **data4send) formatting_error = '' if len(input_errors): for i, input_error in enumerate(input_errors): if input_error.strip(' ').strip('\n').strip(' ').strip('\n').strip( ' '): errors_nulled.append(input_error.replace('\n', ': ')) formatting_error = 'Ошибки ввода:'