1

Here is the HTML associated with the Export button:
enter image description here

<a 
 onclick="return nimInspectionsExportConfirm();"  
 id="ctl00_cphDefault_ContentPlaceHolder1_NIMInspections1_ExportResultsToExcel"   
 title="Export to Excel Latest Version"
 class="gridActionButton exportCasesButton"   
 href="javascript:__doPostBack('ctl00$cphDefault$ContentPlaceHolder1$NIMInspection 
 s1$ExportResultsToExcel','')">Export xlsx
</a>

And here is a link address associated with the Export button:

javascript:__doPostBack('ctl00$cphDefault$ContentPlaceHolder1$NIMInspections1$ExportResultsToExcel','')

I'm able to locate the export button web element, and it appears to click (the button changes color as if it was clicked) when I watch the code run, but the loading never finishes and the data just never exports. But my script does not return any errors. I thought it has to do with the javascript function call nimInspectionsExportConfirm(); but when I use the execute_script function, it doesn't work reliably. Maybe once out of every 20 tries.

Here's my full code (you can look in the commented code for all the different ways I tried to make it work):

from selenium import webdriver
import pyinputplus as pyip
import datetime
import time
from dateutil.relativedelta import relativedelta, MO, SU, SA
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains
import os
import shutil
from pathlib import Path
from selenium.webdriver.common.keys import Keys
from selenium.common.exceptions import TimeoutException

#log in
options = webdriver.ChromeOptions() 
options.add_argument("download.default_directory={}".format(filepath))
browser = webdriver.Chrome(options=options)
#self.mouse = webdriver.ActionChains(browser)    
browser.get('mywebsite.url')
userElem = browser.find_element_by_id('Login1_UserName')
userElem.send_keys('myusername')
passwordElem = browser.find_element_by_id('Login1_Password')
passwordElem.send_keys(pyip.inputStr())
submitElem = browser.find_element_by_css_selector('#Login1_LoginButton')
submitElem.click() 

n = int(input("Enter number of weeks of reports from today: "))
report_date_dict = {}
for x in range(n):
    report_date_dict[today + relativedelta(weekday=MO(-(n+1)))] = today + relativedelta(weekday=SU(-n))
    n = n - 1
print(report_date_dict)

report_dict = {"Report1":"//select[@id='ctl00_cphDefault_ContentPlaceHolder1_NIMInspections1_CustomerRoleLevelFilters']/option[@value='d66c7fb5-fc1e-4643-a194-9cde73687438']"}
#"Report2":"//select[@id='ctl00_cphDefault_ContentPlaceHolder1_NIMInspections1_CustomerRoleLevelFilters']/option[@value='0bcd5215-853c-4a2f-b61f-a04993f37488']"}

for key in report_dict:
    report = key
    browser.find_element_by_xpath(report_dict[key]).click()
    reportSearchElem = browser.find_element_by_css_selector('#ctl00_cphDefault_ContentPlaceHolder1_NIMInspections1_ApplyCommonFilter')
    reportSearchElem.click()
    print("get {}".format(key))
    for key in report_date_dict:
        browser.get('URLafterloginpage.com')
        start = key
        startdt = datetime.datetime.strptime(str(start), '%Y-%m-%d').strftime('%m/%d/%Y')
        end = report_date_dict[key]#.strftime("%d/%m/%Y")
        enddt = datetime.datetime.strptime(str(end), '%Y-%m-%d').strftime('%m/%d/%Y')
        print(startdt, enddt)
        startDateElem = browser.find_element_by_css_selector('#ParameterValue0')
        startDateElem.clear()
        startDateElem.send_keys(startdt)
        endDateElem = browser.find_element_by_css_selector('#ParameterValue1')
        endDateElem.clear()
        endDateElem.send_keys(enddt) 
        searchElem = browser.find_element_by_css_selector('#filterBuilder > tfoot > tr > td:nth-child(2) > input:nth-child(2)')
        searchElem.click()
        #browser.switch_to.default_content()
        #exportElem = browser.find_element_by_css_selector("#ctl00_cphDefault_ContentPlaceHolder1_NIMInspections1_ExportResultsToExcel")
        #exportElem = browser.find_element_by_xpath("//a[@onclick='return nimInspectionsExportConfirm();']")
        #exportElem = browser.find_element_by_xpath("//a[contains(@href,'NIMInspections1$ExportResultsToExcel')]")
        #exportElem = browser.find_element_by_xpath()
        #WebDriverWait(browser, 20).until(EC.element_to_be_clickable((By.XPATH, "//a[@id='ctl00_cphDefault_ContentPlaceHolder1_NIMInspections1_ExportResultsToExcel' and not(@class='aspNetDisabled')]"))).click()
        WebDriverWait(browser, 60).until(EC.presence_of_element_located((By.ID, "ctl00_cphDefault_ContentPlaceHolder1_NIMInspections1_ExportResultsToExcel")))
        browser.execute_script("nimInspectionsExportConfirm();")
        browser.execute_script("window.scrollTo(0, 200)")
        browser.find_element_by_id("ctl00_cphDefault_ContentPlaceHolder1_NIMInspections1_ExportResultsToExcel").click()
#WebDriverWait(browser, 60).until(EC.element_to_be_clickable((By.LINK_TEXT, "Export xlsx"))).click()
        time.sleep(60)
        """while True:
            try:
                WebDriverWait(browser, 20).until(EC.staleness_of(browser.find_element_by_xpath(
                    "//a[@id='ctl00_cphDefault_ContentPlaceHolder1_NIMInspections1_ExportResultsToExcel' and not(@class='aspNetDisabled')]")))
                WebDriverWait(browser, 20).until(EC.element_to_be_clickable((
                    By.XPATH, "//a[@id='ctl00_cphDefault_ContentPlaceHolder1_NIMInspections1_ExportResultsToExcel' and not(\
                    @class='aspNetDisabled')]"))).click()
                print ("Export")
            except:
                print ("not work")
                break
        print ("Exiting")"""
        #browser.quit() 
        """try:
            print("about to look for element")
            ele = '#ctl00_cphDefault_ContentPlaceHolder1_NIMInspections1_ExportResultsToExcel'
            element = WebDriverWait(browser, 30).until(
                    lambda browser : browser.find_element_by_css_selector(ele)
            )
            print("still looking?")
        finally:
            print("yowp")"""
        #action = ActionChains(browser) 
        
        #action.move_to_element(exportElem).click().perform() 
        '''try:
            element = browser.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#ctl00_cphDefault_ContentPlaceHolder1_NIMInspections1_ExportResultsToExcel")))
            #button = WebDriverWait(browser, delay).until(EC.element_to_be_clickable((By.XPATH,"//a[@onclick='return nimInspectionsExportConfirm();']")))
            browser.execute_script("arguments[0].click();", element)
            print("Page is ready!")
        except TimeoutException:
            print("Loading took too much time!")

        #exportElem = browser.find_element_by_xpath('//*[@id="ctl00_cphDefault_ContentPlaceHolder1_NIMInspections1_ExportResultsToExcel"]')
        #exportElem.click()
        #browser.execute_script("//a[@onclick='return nimInspectionsExportConfirm();']", exportElem)
        '''
        #if report == 'Holdover':
            #time.sleep(30)
        #else:
            #time.sleep(60)
        filename = max([filepath +"/"+ f for f in os.listdir(filepath)], key=os.path.getctime)
        print(filename)
        newfilename = newfilepath+'/'+Path(filename).stem+'.xlsx'
        shutil.copyfile(filename,newfilename)
        os.rename(newfilename, newfilepath+'/'+'{}_{}_{}.xlsx'.format(report,start, end))
lno23
  • 67
  • 6

1 Answers1

0

I ended up just adding another time.sleep(60) after the execute_script call and that gave the page enough time to load and export the data. Curious if there's another more efficient way though.

        browser.execute_script("nimInspectionsExportConfirm();")  
        browser.execute_script("window.scrollTo(0, 200)")
        time.sleep(60)
        browser.find_element_by_id("ctl00_cphDefault_ContentPlaceHolder1_NIMInspections1_ExportResultsToExcel").click()
        time.sleep(60)

https://stackoverflow.com/a/63042913/10808427 - more efficient way!

lno23
  • 67
  • 6