selenium workng till pdf
This commit is contained in:
@@ -15,6 +15,8 @@ app.add_middleware(
|
|||||||
@app.post("/run")
|
@app.post("/run")
|
||||||
async def run_bot(request: Request):
|
async def run_bot(request: Request):
|
||||||
data = await request.json()
|
data = await request.json()
|
||||||
|
print(data)
|
||||||
|
input("waiting")
|
||||||
try:
|
try:
|
||||||
bot = AutomationMassDHP(data)
|
bot = AutomationMassDHP(data)
|
||||||
result = bot.main_workflow("https://providers.massdhp.com/providers_login.asp")
|
result = bot.main_workflow("https://providers.massdhp.com/providers_login.asp")
|
||||||
|
|||||||
@@ -15,10 +15,23 @@ import os
|
|||||||
|
|
||||||
class AutomationMassDHP:
|
class AutomationMassDHP:
|
||||||
def __init__(self, data):
|
def __init__(self, data):
|
||||||
self.data = data
|
|
||||||
self.headless = False
|
self.headless = False
|
||||||
self.driver = None
|
self.driver = None
|
||||||
|
|
||||||
|
self.data = data
|
||||||
|
self.claim = data.get("claim", {})
|
||||||
|
self.pdfs = data.get("pdfs", [])
|
||||||
|
|
||||||
|
# Flatten values for convenience
|
||||||
|
self.memberId = self.claim.get("memberId", "")
|
||||||
|
self.dateOfBirth = self.claim.get("dateOfBirth", "")
|
||||||
|
self.remarks = self.claim.get("remarks", "")
|
||||||
|
self.massdhp_username = self.claim.get("massdhp_username", "")
|
||||||
|
self.massdhp_password = self.claim.get("massdhp_password", "")
|
||||||
|
self.serviceLines = self.claim.get("serviceLines", [])
|
||||||
|
self.missingTeethStatus = self.claim.get("missingTeethStatus", "")
|
||||||
|
self.missingTeeth = self.claim.get("missingTeeth", {})
|
||||||
|
|
||||||
def config_driver(self):
|
def config_driver(self):
|
||||||
options = webdriver.ChromeOptions()
|
options = webdriver.ChromeOptions()
|
||||||
if self.headless:
|
if self.headless:
|
||||||
@@ -34,12 +47,12 @@ class AutomationMassDHP:
|
|||||||
# Enter email
|
# Enter email
|
||||||
email_field = wait.until(EC.presence_of_element_located((By.XPATH, "//input[@name='Email' and @type='text']")))
|
email_field = wait.until(EC.presence_of_element_located((By.XPATH, "//input[@name='Email' and @type='text']")))
|
||||||
email_field.clear()
|
email_field.clear()
|
||||||
email_field.send_keys(self.data["claim"]["massdhp_username"])
|
email_field.send_keys(self.massdhp_username)
|
||||||
|
|
||||||
# Enter password
|
# Enter password
|
||||||
password_field = wait.until(EC.presence_of_element_located((By.XPATH, "//input[@name='Pass' and @type='password']")))
|
password_field = wait.until(EC.presence_of_element_located((By.XPATH, "//input[@name='Pass' and @type='password']")))
|
||||||
password_field.clear()
|
password_field.clear()
|
||||||
password_field.send_keys(self.data["claim"]["massdhp_password"])
|
password_field.send_keys(self.massdhp_password)
|
||||||
|
|
||||||
# Click login
|
# Click login
|
||||||
login_button = wait.until(EC.element_to_be_clickable((By.XPATH, "//input[@type='submit' and @value='Login']")))
|
login_button = wait.until(EC.element_to_be_clickable((By.XPATH, "//input[@type='submit' and @value='Login']")))
|
||||||
@@ -66,11 +79,11 @@ class AutomationMassDHP:
|
|||||||
# Fill Member ID
|
# Fill Member ID
|
||||||
member_id_input = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="Text1"]')))
|
member_id_input = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="Text1"]')))
|
||||||
member_id_input.clear()
|
member_id_input.clear()
|
||||||
member_id_input.send_keys(self.data["claim"]["memberId"])
|
member_id_input.send_keys(self.memberId)
|
||||||
|
|
||||||
# Fill DOB parts
|
# Fill DOB parts
|
||||||
try:
|
try:
|
||||||
dob_parts = self.data["claim"]["dateOfBirth"].split("/")
|
dob_parts = self.dateOfBirth.split("/")
|
||||||
month= dob_parts[0].zfill(2) # "12"
|
month= dob_parts[0].zfill(2) # "12"
|
||||||
day= dob_parts[1].zfill(2) # "13"
|
day= dob_parts[1].zfill(2) # "13"
|
||||||
year = dob_parts[2] # "1965"
|
year = dob_parts[2] # "1965"
|
||||||
@@ -124,17 +137,16 @@ class AutomationMassDHP:
|
|||||||
|
|
||||||
# 1 - Procedure Codes part
|
# 1 - Procedure Codes part
|
||||||
try:
|
try:
|
||||||
for proc in self.data["procedure_codes"]:
|
for proc in self.serviceLines:
|
||||||
# Wait for Procedure Code dropdown and select code
|
# Wait for Procedure Code dropdown and select code
|
||||||
|
|
||||||
select_element = wait.until(EC.presence_of_element_located((By.XPATH, "//select[@id='Select3']")))
|
select_element = wait.until(EC.presence_of_element_located((By.XPATH, "//select[@id='Select3']")))
|
||||||
Select(select_element).select_by_value(proc['procedure_code'])
|
Select(select_element).select_by_value(proc['procedureCode'])
|
||||||
|
|
||||||
# Fill Procedure Date if present
|
# Fill Procedure Date if present
|
||||||
if proc.get("procedure_date"):
|
if proc.get("procedureDate"):
|
||||||
try:
|
try:
|
||||||
# Try to normalize date to MM/DD/YYYY format
|
# Try to normalize date to MM/DD/YYYY format
|
||||||
parsed_date = datetime.strptime(proc["procedure_date"], "%m/%d/%Y")
|
parsed_date = datetime.strptime(proc["procedureDate"], "%Y-%m-%d")
|
||||||
formatted_date = parsed_date.strftime("%m/%d/%Y")
|
formatted_date = parsed_date.strftime("%m/%d/%Y")
|
||||||
|
|
||||||
date_xpath = "//input[@name='ProcedureDate']"
|
date_xpath = "//input[@name='ProcedureDate']"
|
||||||
@@ -168,10 +180,10 @@ class AutomationMassDHP:
|
|||||||
|
|
||||||
|
|
||||||
# Fill Fees if present
|
# Fill Fees if present
|
||||||
if proc.get("fees"):
|
if proc.get("billedAmount"):
|
||||||
fees_xpath = "//input[@name='ProcedureFee']"
|
fees_xpath = "//input[@name='ProcedureFee']"
|
||||||
wait.until(EC.presence_of_element_located((By.XPATH, fees_xpath))).clear()
|
wait.until(EC.presence_of_element_located((By.XPATH, fees_xpath))).clear()
|
||||||
self.driver.find_element(By.XPATH, fees_xpath).send_keys(proc["fees"])
|
self.driver.find_element(By.XPATH, fees_xpath).send_keys(proc["billedAmount"])
|
||||||
|
|
||||||
# Click "Add Procedure" button
|
# Click "Add Procedure" button
|
||||||
add_proc_xpath = "//input[@type='submit' and @value='Add Procedure']"
|
add_proc_xpath = "//input[@type='submit' and @value='Add Procedure']"
|
||||||
@@ -190,7 +202,8 @@ class AutomationMassDHP:
|
|||||||
# 2 - Upload PDFs:
|
# 2 - Upload PDFs:
|
||||||
try:
|
try:
|
||||||
|
|
||||||
pdfs_abs = [proc for proc in self.data.get("pdfs", [])]
|
pdfs_abs = [proc for proc in self.pdfs]
|
||||||
|
|
||||||
|
|
||||||
with tempfile.TemporaryDirectory() as tmp_dir:
|
with tempfile.TemporaryDirectory() as tmp_dir:
|
||||||
for pdf_obj in pdfs_abs:
|
for pdf_obj in pdfs_abs:
|
||||||
@@ -219,7 +232,7 @@ class AutomationMassDHP:
|
|||||||
# 3 - Indicate Missing Teeth Part
|
# 3 - Indicate Missing Teeth Part
|
||||||
try:
|
try:
|
||||||
# Handle the missing teeth section based on the status
|
# Handle the missing teeth section based on the status
|
||||||
missing_status = self.data.get("missingTeethStatus")
|
missing_status = self.missingTeethStatus
|
||||||
|
|
||||||
if missing_status == "No_missing":
|
if missing_status == "No_missing":
|
||||||
missing_teeth_no = wait.until(EC.presence_of_element_located((By.XPATH, "//input[@type='checkbox' and @name='PAU_Step3_Checkbox1']")))
|
missing_teeth_no = wait.until(EC.presence_of_element_located((By.XPATH, "//input[@type='checkbox' and @name='PAU_Step3_Checkbox1']")))
|
||||||
@@ -230,7 +243,7 @@ class AutomationMassDHP:
|
|||||||
missing_teeth_edentulous.click()
|
missing_teeth_edentulous.click()
|
||||||
|
|
||||||
elif missing_status == "Yes_missing":
|
elif missing_status == "Yes_missing":
|
||||||
missing_teeth_dict = self.data.get("missingTeeth", {})
|
missing_teeth_dict = self.missingTeeth
|
||||||
|
|
||||||
# For each tooth in the missing teeth dict, select the dropdown option
|
# For each tooth in the missing teeth dict, select the dropdown option
|
||||||
for tooth_name, value in missing_teeth_dict.items():
|
for tooth_name, value in missing_teeth_dict.items():
|
||||||
@@ -254,7 +267,7 @@ class AutomationMassDHP:
|
|||||||
try:
|
try:
|
||||||
textarea = wait.until(EC.presence_of_element_located((By.XPATH, "//textarea[@name='Remarks']")))
|
textarea = wait.until(EC.presence_of_element_located((By.XPATH, "//textarea[@name='Remarks']")))
|
||||||
textarea.clear()
|
textarea.clear()
|
||||||
textarea.send_keys(self.data["remarks"])
|
textarea.send_keys(self.remarks)
|
||||||
|
|
||||||
# Wait for update button and click it
|
# Wait for update button and click it
|
||||||
update_button = wait.until(EC.element_to_be_clickable((By.XPATH, "//input[@type='submit' and @value='Update Remarks']")))
|
update_button = wait.until(EC.element_to_be_clickable((By.XPATH, "//input[@type='submit' and @value='Update Remarks']")))
|
||||||
@@ -277,20 +290,20 @@ class AutomationMassDHP:
|
|||||||
time.sleep(3)
|
time.sleep(3)
|
||||||
value = self.login()
|
value = self.login()
|
||||||
if value.startswith("ERROR"):
|
if value.startswith("ERROR"):
|
||||||
self.driver.close()
|
# self.driver.close()
|
||||||
return value
|
return value
|
||||||
|
|
||||||
|
|
||||||
time.sleep(5)
|
time.sleep(5)
|
||||||
value2 = self.step1()
|
value2 = self.step1()
|
||||||
if value2.startswith("ERROR"):
|
if value2.startswith("ERROR"):
|
||||||
self.driver.close()
|
# self.driver.close()
|
||||||
return value2
|
return value2
|
||||||
|
|
||||||
time.sleep(5)
|
time.sleep(5)
|
||||||
value3 = self.step2()
|
value3 = self.step2()
|
||||||
if value3.startswith("ERROR"):
|
if value3.startswith("ERROR"):
|
||||||
self.driver.close()
|
# self.driver.close()
|
||||||
return value3
|
return value3
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user