【问题标题】:Python and selenium : firefox keep creating dialog boxes when downloading even if i set its preferencesPython 和 selenium:即使我设置了它的首选项,firefox 也会在下载时继续创建对话框
【发布时间】:2017-12-28 17:00:59
【问题描述】:

我使用 selenium 和 firefox 网络驱动程序编写了一个程序。

def dowloadFile(link):
    profile = webdriver.FirefoxProfile()
    profile.set_preference('browser.download.folderList', 2) # custom location
    profile.set_preference('browser.download.manager.showWhenStarting', False)
    profile.set_preference('browser.download.dir', '/tmp')
    profile.set_preference('browser.helperApps.neverAsk.saveToDisk', 
    'application/pdf')

    driver = webdriver.Firefox(profile)
    #driver.set_window_position(-10000,0)
    driver.get(link)
    s = BeautifulSoup(driver.page_source, "html.parser")
    st=s.find('div',{"class":"bloc-docs-link bloc-250"})
    #print("hadiii ST: "+str(st))
    x=st.find('a')
    fm=x.get('href')
    fm="https://www.marchespublics.gov.ma/"+fm
    driver.get(fm)
    driver.quit()

我的函数将链接作为参数,之后它获取该链接并最终找到另一个下载文件的链接。 我的问题是,即使我设置了firefox的首选项,下载时它总是不断显示对话框,以确认我是否要保存它!我不知道该怎么做,所以我可以在没有这个对话框的情况下下载文件。

请帮忙。提前谢谢你。

【问题讨论】:

    标签: python selenium firefox


    【解决方案1】:

    我也遇到过这个问题。我只是这样做了。注意:这确实需要更多时间,因此如果您要下载大量文件,这可能不值得。否则,这会成功。

    创建一个可以在对话框中使用的警报对象,例如:

    alert = driver.switch_to_alert()
    

    导入预期条件:

    from selenium.webdriver.support import expected_conditions as EC
    

    然后,创建一个函数来指示浏览器等待,直到出现预期的条件(警报)。

    WebDriverWait(browser, 3).until(EC.alert_is_present()
    except TimeoutException:
    

    最好把这是一个 try/except 块,但不是强制性的。

    然后,在 selenium 控制警报窗口后,只需使用警报对象的 'accept' 方法来确认下载:

    alert.accept()
    

    函数可能如下所示:

        try:
            alert = driver.switch_to_alert()
            alert_wait()
            alert.accept()
        except print('No alertfound')
    

    另外,我强烈建议您为此使用 requests/BeautifulSoup 模块,这样您就不必渲染浏览器并体验浏览大量网页所带来的延迟。 requests 模块在幕后完成所有工作。如果您需要在下载之前输入密码,这会变得很棘手。如果没有,BeautifulSoup 库非常适合抓取标签/href,将它们收集到一个列表中,然后使用类似的 requests.get() 方法逐个循环它们。

    事实上,我上次遇到这个问题时,我使用了 requests 模块而不是 selenium,并且自动接受了警报窗口。闪电也很快。

    【讨论】:

    • 非常感谢您的回答;我的情况是我有很多文件可供下载。所以程序肯定会很慢。据我了解: profile.set_preference('browser.helperApps.neverAsk.saveToDi‌​sk', 'application/pdf') 负责不让浏览器显示对话框。不知道为什么它不起作用。
    • 据我所知,selenium 充满了这样的错误。此外,Firefox 一直在打击像我们这样的“网络爬虫”,所以他们尽了自己的一份力,让事情变得相当困难。我从不使用火狐。我个人认为 Chrome 浏览器是我尝试过的最好的浏览器。
    • 哦,最后一件事(无法编辑第一条评论,因为它已经过了 5 分钟?所有这些规则,嗯?)。我离题了,这可能会陷入困境,但我会尝试使用 asyncio/coroutines/threading 作为脚本的一部分。它们是使 Python 出名的重要原因。在我把你一个人留在这里之前,我绝对建议你查看 Luciano Ramalho 的“Fluent Python”。在 Github 上免费。你会很高兴你做到了。作者 Luciano 很好地介绍了协程,因此您甚至可以直接跳到初学者。
    【解决方案2】:

    首先,你为什么用beautifulsoup?!使用driver.find_element_by_css_selector

    其次,请确认您要定位的 PDF 文件实际上具有适当的 mimetype。见http://yizeng.me/2014/05/23/download-pdf-files-automatically-in-firefox-using-selenium-webdriver/

    【讨论】:

      猜你喜欢
      • 2017-05-29
      • 2017-07-01
      • 2019-09-05
      • 2022-01-21
      • 2017-03-31
      • 1970-01-01
      • 2022-01-11
      • 1970-01-01
      相关资源
      最近更新 更多