繁体   English   中英

为什么我不能使用 python/selenium 单击包含 javascript 的导出按钮?

[英]Why can't I use python/selenium to click an Export button which contains javascript?

这是与“导出”按钮关联的 HTML:
在此处输入图像描述

<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>

这是与“导出”按钮相关的链接地址:

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

我能够找到导出按钮 web 元素,当我看到代码运行时,它似乎在单击(按钮改变颜色,就像被单击一样),但加载从未完成,数据从未导出。 但是我的脚本没有返回任何错误。 我认为这与 javascript function 调用nimInspectionsExportConfirm(); 但是当我使用execute_script function 时,它不能可靠地工作。 也许每 20 次尝试一次。

这是我的完整代码(您可以查看注释代码以了解我尝试使其工作的所有不同方式):

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))

我最终只是在execute_script调用之后添加了另一个time.sleep(60) ,这给了页面足够的时间来加载和导出数据。 好奇是否还有另一种更有效的方法。

        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 - 更有效的方式!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM