Automating SAP Login and Data Update with Selenium and Python

Caio Sanches

from datetime import datetime, date
import selenium
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from openpyxl import Workbook, load_workbook
import datetime as dt
import sys
import io
import xlwings as xw
import os
import time
import pandas as pd

# Verificando o dia de Hoje para criar a data da pasta

data_da_pasta = str(date.today())

# Aplicando as formatações necessárias

data_da_pasta = data_da_pasta.replace('-','')

# Caminho da pasta dos relatórios

caminho_dos_relatorios = 'X:/Gerenciador de relatórios/Bases/' + data_da_pasta

# Criando o caminho feito anteriormente

pasta_do_dia_de_hoje = os.makedirs(caminho_dos_relatorios)

# Criando o caminho para os relatórios do Driver

caminho_dos_relatorios_para_o_driver = 'X:\\Gerenciador de relatórios\\Bases\\' + data_da_pasta

print('Insira o seu login do SAP HANA/ROIMETER : ')
print(' ')

login_do_usuario = input()

print('Insira a sua senha do SAP HANA/ROIMETER : ')
print(' ')

senha_do_usuario = input()

# Abrindo o Workbook da Base de Dados

banco_de_dados = xw.Book('C:\\Users\\\\Banco de Dados - XY.xlsm', read_only = True)

base_consolidada = banco_de_dados.sheets['Base_Consolidada']

dados = base_consolidada.range('A1').expand('down').value

datas = pd.DataFrame(dados)

# Fechando o Excel

banco_de_dados.app.quit()

# Renomeando a coluna e pegando a partir a segunda linha

datas.columns = datas.loc[0]
datas = datas.loc[1:]

# Ordenando pelos valores mais recentes

datas.sort_values(by = 'Data', ascending = False, inplace = True)

# Selecionando o último de atualização e transformando em string

data_de_atualizacao = str(datas.iloc[0])

# Transformando o intervalo da data em string

ultimo_dia_de_atualizacao_bruto = data_de_atualizacao[10:20]

# Transformando a string em Date Time

ultimo_dia_de_atualizacao_datetime = datetime.strptime(ultimo_dia_de_atualizacao_bruto, '%Y-%m-%d' )

# Adicionando um dia à data de atualização, assim conseguimos pegar a data que o relatorio deve ser atualizado

data_de_ser_atualizado_bruto = ultimo_dia_de_atualizacao_datetime + dt.timedelta(days= 1)

# Transformando o dia da atualização em string

data_de_ser_atualizado_bruto = str(data_de_ser_atualizado_bruto)
data_de_ser_atualizado_bruto

# Desmembrando os componentes da data

dia_de_ser_atualizado = data_de_ser_atualizado_bruto[8:10]
mes_de_ser_atualizado = data_de_ser_atualizado_bruto[5:7]
ano_de_ser_atualizado = data_de_ser_atualizado_bruto[0:4]

# Transformando a data no formato aceito pelo SAP

data_de_ser_atualizado = dia_de_ser_atualizado + '.' + mes_de_ser_atualizado + '.' + ano_de_ser_atualizado

# Selecionando cada um dos componentes da data

dia = ultimo_dia_de_atualizacao_bruto[8:10]
mes = ultimo_dia_de_atualizacao_bruto[5:7]
ano = ultimo_dia_de_atualizacao_bruto[0:4]

# Formatando o dia, mês e ano para o formato aceito no ROI METER

ultimo_dia_de_atualizacao = dia + '.' + mes + '.' + ano

# Adicionando uma etapa para a atualização do Relatório do Bot e Televendas

primeiro_campo_do_intervalo_de_data = '01.' + mes + '.' + ano

# Puxando o dia de ontem não formatado

dia_de_ontem_bruto = date.today() - dt.timedelta(days=1)
dia_de_ontem_bruto = str(dia_de_ontem_bruto)

# Separando os elementos da data

dia_bruto = dia_de_ontem_bruto[8:]
mes_bruto = dia_de_ontem_bruto[5:7]
ano_bruto = dia_de_ontem_bruto[0:4]

# Formatando o dia, mês e ano para o formato aceito no ROI METER

dia_de_ontem = dia_bruto + '.' + mes_bruto + '.' + ano_bruto

# Configurando as opções para a pasta de destino desejada

chrome_options = webdriver.ChromeOptions()
prefs = {'download.default_directory' : caminho_dos_relatorios_para_o_driver}
chrome_options.add_experimental_option("prefs", prefs)
driver = webdriver.Chrome(executable_path= 'C:/UD/chromedriver.exe', chrome_options=chrome_options)

# Abrindo a página

driver.get("https://bi-hana.uolcorp.intranet:8001/")

time.sleep(5)

# Mazimizando e minimizando a janela

driver.maximize_window()

# Desta maneira, o Selenium consegue identificar corretamente a disposição dos elementos

# Inserindo o perfil de usuário

usuario = WebDriverWait(driver, 30, 1).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="sap-user"]')))
usuario.click()
usuario.send_keys(login_do_usuario)

# Usando o Web Driver Wait, em conjunto com outras funções, conseguimos esperar carregar o elemento a ser clicado

# Inserindo a senha

senha = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="sap-password"]')))
senha.click()
senha.send_keys(senha_do_usuario)

# Entrando no SAP

entrar = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="LOGON_BUTTON-txt"]/span')))
entrar.click()

# Encerrando outras seções, caso a págin atual possua outras seções em aberto

url_atual = driver.current_url

if url_atual != 'https://20190404A&sap-client=450&sap-language=PT#' :
avancar_para_proxima_pagina = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="SESSION_QUERY_CONTINUE_BUTTON-txt"]/span')))
avancar_para_proxima_pagina.click()
time.sleep(7)

# Inserindo a data da última atualização no formulário do ROI METER

inserindo_ultimo_dia_de_atualizacao = WebDriverWait(driver, 30).until(EC.element_to_be_clickable((By.XPATH, '/html/body/table/tbody/tr/td/div/div[1]/table/tbody/tr[3]/td/div/table/tbody/tr/td[3]/div/div/table/tbody/tr/td/div/div/table/tbody/tr[1]/td/div/table/tbody/tr/td/div/table/tbody/tr/td/div/table/tbody/tr[3]/td/table/tbody/tr[2]/td/div/table/tbody/tr[3]/td[3]/table/tbody/tr/td[1]/input')))
inserindo_ultimo_dia_de_atualizacao.click()
inserindo_ultimo_dia_de_atualizacao.send_keys(data_de_ser_atualizado)

time.sleep(10)

# Passo antes do iniciar seleção

clique_antes_de_salvar = WebDriverWait(driver, 15).until(EC.element_to_be_clickable((By.XPATH, '/html/body/table/tbody/tr/td/div/div[1]/table/tbody/tr[3]/td/div/table/tbody/tr/td[3]/div/div/table/tbody/tr/td/div/div/table/tbody/tr[1]/td/div/table/tbody/tr/td/div/table/tbody/tr/td/div/table/tbody/tr[1]/td/table/tbody/tr/td/div/table/tbody/tr/td[2]/span/input')))
clique_antes_de_salvar.click()

time.sleep(2)

To view the rest, please get in touch, as this project is better visualized in Jupyter Notebook. The platform does not allow uploading this type of file
Like this project
0

Posted Jan 25, 2025

Automates SAP HANA login, retrieves and formats data from Excel, inputs update date, and saves reports in a specific folder using Selenium and Python