Automating SAP Login and Data Update with Selenium and Python

Caio Sanches

0

Automation Engineer

pandas

Python

Selenium

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

Likes

0

Views

0

Tags

Automation Engineer

pandas

Python

Selenium