Python Algos - abdullahbintahir/Python-Snippet GitHub Wiki

Downloading Receipts from SAP Concur

from selenium import webdriver
from selenium.webdriver.edge.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver import ActionChains
import time
import pandas as pd
import pyautogui

#Setting up webdriver so it dosent close automatically after code ends
options = Options()
options.add_experimental_option("detach", True)
driver = webdriver.Edge(options=options)

# Open Concur
driver.get("https://eu1.concursolutions.com")

#Maximize Window
driver.maximize_window()

#Login
email_input=driver.find_element(By.CSS_SELECTOR, '#username-input')
email_input.send_keys("[email protected]")
Next_Button=driver.find_element(By.ID,'btnSubmit')
Next_Button.click()
deloitte_sso = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//body[1]/div[2]/div[1]/div[1]/div[1]/div[1]/div[1]/section[1]/div[1]/div[1]/div[2]/div[1]/div[1]/button[1]")))
deloitte_sso.click()

#Report search criteria dropdown click
search_dropdown = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "ext-gen257")))
search_dropdown.click()
time.sleep(1)

#Report Key list option click
Report_Key_Criteria = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "/html[1]/body[1]/div[12]/div[1]/div[2]")))
Report_Key_Criteria.click()

#Click on each line item and saving recipt with "Report Key- Amount" naming convention
df=pd.read_excel("C:/Users\moxtahir/OneDrive - Deloitte (O365D)/Desktop/Report Keys.xlsx")
keys = df['Report Key'].tolist()

for Report_Key in keys:
    try: #Return to Process Reports page if no further line items found
        #Click on Process Reports tab
        ProcessReports = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//body[1]/otsitewarning[1]/div[1]/div[1]/div[2]/div[1]/nav[2]/ul[1]/li[3]/a[1]/span[1]")))
        ProcessReports.click()
        #Enter Report Key
        report_key_textbox = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//body[1]/otsitewarning[1]/div[3]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[2]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[2]/div[1]/div[2]/div[1]/div[1]/div[3]/input[1]")))
        report_key_textbox.clear()
        report_key_textbox.send_keys(Report_Key)

        #Click Go button
        gobtn = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//body[1]/otsitewarning[1]/div[3]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[2]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[2]/div[1]/div[2]/div[1]/div[2]/div[6]/input[1]")))
        gobtn.click()

        # #Click on report
        time.sleep(2)
        rprt=driver.find_element(By.XPATH,"//tbody/tr[2]/td[1]/div[1]/ol[1]")
        rprt.click()
        time.sleep(2)

        try: #to expand the hidden itemizations
            Expand_btn = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH,"//body[1]/otsitewarning[1]/div[3]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[4]/div[1]/div[1]/div[2]/div[2]/div[1]/div[1]/div[1]/div[2]/div[1]/div[1]/div[1]/div[1]/div[1]/table[1]/thead[1]/tr[1]/td[1]/div[1]/div[1]")))
            Expand_btn.click()
        except:
            pass

        for i in range(1, 100):
            try: #to find an itemization if next line item is not found
                #Clicking on line item
                LineItem = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH,f"//body[1]/otsitewarning[1]/div[3]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[4]/div[1]/div[1]/div[2]/div[2]/div[1]/div[1]/div[1]/div[2]/div[1]/div[1]/div[2]/div[1]/div[{i}]/table[1]/tbody[1]/tr[1]/td[5]/div[1]/b[1]")))
                LineItem.click()
                Amount = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH,f"//body[1]/otsitewarning[1]/div[3]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[4]/div[1]/div[1]/div[2]/div[2]/div[1]/div[1]/div[1]/div[2]/div[1]/div[1]/div[2]/div[1]/div[{i}]/table[1]/tbody[1]/tr[1]/td[7]/div[1]")))
                Approved_Amount = Amount.text
            except:
                #Clicking on ltemization
                itemization = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH,f"//body[1]/otsitewarning[1]/div[3]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[4]/div[1]/div[1]/div[2]/div[2]/div[1]/div[1]/div[1]/div[2]/div[1]/div[1]/div[2]/div[1]/div[{i}]/table[1]/tbody[1]/tr[1]/td[5]/div[1]/div[1]")))
                itemization.click()

            try: #If Receipt Image tab is not found, code will go to next line item
                #Clicking on Receipt image tab
                Receipt_Tab = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//body[1]/otsitewarning[1]/div[3]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[4]/div[1]/div[1]/div[3]/div[1]/div[1]/div[2]/div[1]/div[2]/ul[1]/li[7]/a[2]/em[1]/span[1]/span[1]")))
                time.sleep(2)
                Receipt_Tab.click()
                time.sleep(2)

                try:
                    #Enlarging Image
                    ZoomInButton=WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//body[1]/otsitewarning[1]/div[3]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[4]/div[1]/div[1]/div[3]/div[1]/div[1]/div[2]/div[2]/div[2]/div[3]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/table[1]/tbody[1]/tr[1]/td[1]/table[1]/tbody[1]/tr[1]/td[2]/table[1]/tbody[1]/tr[2]/td[2]/em[1]/button[1]")))
                    ZoomInButton.click()
                    ZoomInButton.click()
                    ZoomInButton.click()
                    ZoomInButton.click()

                    #Saving Png recipt
                    Receipt_Image = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//body[1]/otsitewarning[1]/div[3]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[4]/div[1]/div[1]/div[3]/div[1]/div[1]/div[2]/div[2]/div[2]/div[3]/div[1]/div[1]/div[1]/div[1]/div[2]/div[1]/canvas[1]")))
                    ActionChains(driver).context_click(Receipt_Image).perform()
                    time.sleep(1)
                    pyautogui.press('down') 
                    time.sleep(1)
                    pyautogui.press('enter')
                    time.sleep(1)
                    pyautogui.write(str(Report_Key)+"_"+Approved_Amount+"_"+str(i))
                    time.sleep(2)
                    pyautogui.press('enter')
                except:
                    #Saving Pdf
                    Receipt_Tab = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//body[1]/otsitewarning[1]/div[3]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[4]/div[1]/div[1]/div[3]/div[1]/div[1]/div[2]/div[1]/div[2]/ul[1]/li[7]/a[2]/em[1]/span[1]/span[1]")))
                    time.sleep(2)
                    Receipt_Tab.click()
                    time.sleep(2)
                    Receipt_Image = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, "#EntryLineItemReceipt-Tab_ImgPanel_RcptLoadingFrame")))
                    ActionChains(driver).context_click(Receipt_Image).perform()
                    time.sleep(1)
                    pyautogui.press('down')
                    pyautogui.press('down')
                    time.sleep(1)
                    pyautogui.press('enter')
                    time.sleep(1)
                    pyautogui.write(str(Report_Key)+"_"+Approved_Amount+"_"+str(i))
                    time.sleep(1)
                    pyautogui.press('enter')
            except:
                continue
    except:
        continue