不一致的下载'失败 - 路径太长'使用Python Selenium Chromedriver时出错

时间:2015-07-25 20:06:40

标签: python ajax google-chrome selenium selenium-chromedriver

堆叠:Windows 8.1, Python 3.4.3.4, Selenium 2.46, Chromedriver 2.16

我使用Selenium Python绑定Chromedriver从以下网址自动执行某些下载:r'http://financials.morningstar.com/'

我已设置以下chromedriver首选项:

chromeOptions = webdriver.ChromeOptions()
prefs = {'download.default_directory':symbol_dir}
chromeOptions.add_experimental_option('prefs', prefs)
chromeOptions.add_extension(self.chromeUBlock_path)  
chromedriver_path = self.chromedriver_path

此外,我已经设置了以下selenium代码来运行下载,它可以正常运行并下载到正确的文件位置等。

symbol = 'AAPL' # test symbol
IS_anl_statement = 'income-statement'
IS_anl_abbrev    = 'is'
url_anl = self.mstar_base_url + r'{}/{}.html?t={}&region=usa&culture=en-US'
IS_anl  = webdriver.Chrome(executable_path=chromedriver_path, chrome_options=chromeOptions)
IS_anl.set_page_load_timeout(90)

    try:        
        IS_anl.get(url_anl.format(IS_anl_statement, IS_anl_abbrev, symbol))
        anl_element = WebDriverWait(IS_anl, 90).until(EC.element_to_be_clickable(
            (By.LINK_TEXT, 'Annual')))
        anl_csv_element = WebDriverWait(IS_anl, 90).until(EC.element_to_be_clickable(
            (By.CSS_SELECTOR,self.css_path_export)))
        anl_csv_element.click()
        for i in range(1,10,1):
            time.sleep(i/50)
            if os.path.isfile(anl_file_string)==True:
                break    
    except Exception as e:
        print(e)

    IS_anl.quit()

但是,使用以下缩写运行下载时(只需将balance-sheet替换为income-statement,就像这样:

    BS_anl_statement = 'balance-sheet'
    BS_anl_abbrev    = 'bs'

和剩下的Selenium代码完全相同我得到了可怕的下载错误: Failed-Path Too Long

这很奇怪,因为实际的文件路径不太长。事实上,我在3个不同的目录中测试了下载,每个目录的文件路径都比上一个短。最后的示例路径是:r"C:\mstar_data\\"

我被困住了。我在两次下载尝试之间看到的唯一区别是实际的CSV链接。但即使在这种情况下,Income-Statement下载网址实际上比Balance-Sheet长,所以我再次陷入困境。他们在这里:

I / S CSV网址: http://financials.morningstar.com/ajax/ReportProcess4CSV.html?&t=XNAS:ZUMZ&region=usa&culture=en-US&cur=&reportType=is&period=12&dataType=A&order=asc&columnYear=5&curYearPart=1st5year&rounding=3&view=raw&r=573205&denominatorView=raw&number=3

B / S CSV网址: http://financials.morningstar.com/ajax/ReportProcess4CSV.html?&t=XNYS:A&region=usa&culture=en-US&cur=&reportType=bs&period=12&dataType=A&order=asc&columnYear=5&curYearPart=1st5year&rounding=3&view=raw&r=558981&denominatorView=raw&number=3

任何有关这种不一致的帮助都将是一个很大的帮助,非常感谢。感谢。

1 个答案:

答案 0 :(得分:1)

我能够找到解决此问题的方法。 @Skandigraun是对的,有一段代码试图过早地使用下载的文件。

我使用@Override protected void onCreate(Bundle bundle) { connection = Connection.getInstance(this); connection.addObserver(this); } @Override protected void onStart() { connection.connect(); } @Override protected void onDestroy() { connection.deleteObserver(this); connection.disconnect(); } @Override protected void onActivityResult(int request, int result, Intent data) { if (Connection.REQUEST_CODE == request) { connection.onActivityResult(result); } } @Override public void update(Observable observable, Object data) { if (observable != connection) { return; } // Your presentation logic goes here... } 清除所有临时文件,互联网历史记录等。 我重新启动了电脑。 我修改了以下关于Skandigraun评论的代码块:

Advanced Uninstaller

为:

for in range(1, 10, 1):
    time.sleep(i/50)
    if os.path.isfile(anl_file_string)==True:
            break 

我补充道:

for i in range(1, 10, 1):
    time.sleep(i/20) # changed from 50 to 20
    if os.path.isfile(anl_file_string)==True:
            break 

现在代码运行稳定性更高。我相信os调用测试文件是否存在过快/频繁发生并导致下载失败。我将finally: IS_anl.quit() 语句添加到finally循环以关闭浏览器,无论发生什么。如果访问站点时出现问题,超时错误等,则会阻止脚本挂起。