4

Selenium を介してファイルをダウンロードする古い方法は、もはや機能していないようです。

私のコードは次のとおりです。

    fp = webdriver.FirefoxProfile()
    fp.set_preference("browser.download.dir", os.getcwd())
    fp.set_preference("browser.download.folderList", 2)
    fp.set_preference("browser.download.manager.showWhenStarting", False)
    fp.set_preference("browser.helperApps.neverAsk.saveToDisk",
                      "application/pdf")

    self.driver = webdriver.Firefox(firefox_profile=fp)
    self.longMessage = True

ただし、ファイル ダイアログは引き続き表示されます。フィールドのオンとオフをかなり切り替えましたが、少し掘り下げた後、prefs.jsSelenium によって生成されたデフォルトの Firefox プロファイルのprefs.jsファイルと、手動でチェックしたファイルとの間に違いがないことがわかりました。これは、ダウンロードダイアログで、今後このタイプのファイルに対して自動的に行われます。

ただし、mimeTypes.rdfファイルは変更されます。具体的には、次の行が追加されます。

<RDF:Description RDF:about="urn:mimetype:handler:application/pdf"
               NC:alwaysAsk="false"
               NC:saveToDisk="true"
               NC:handleInternal="false">
<NC:externalApplication RDF:resource="urn:mimetype:externalApplication:application/pdf"/>

ただし、新しい Firefox プロファイルを作成するときにカスタム mimeTypes.rdf ファイルを設定する方法はわかりません。誰にもアイデアはありますか?

ダウンロード URL を cURL するだけだと提案する人を先取りするには、ユーザー用にファイルが生成され、.pdf ファイルがドライブにダウンロードされていることを明確に確認する必要があります。

4

2 に答える 2

1

私は R ユーザーなので、RSeleniumを使用して R にソリューションを投稿するだけです。Pythonで同じものを変換できない場合は、同じことをヒントに教えてください。

known_formats <- c("application/vnd.ms-excel","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")


firefox_profile.me <- makeFirefoxProfile(list(marionette = TRUE,
                                              # this is for certificate issues [may be ignored]
                                              webdriver_accept_untrusted_certs = TRUE,
                                              webdriver_assume_untrusted_issuer = TRUE,
                                              # download related settings
                                              browser.download.folderList = 2L,
                                              browser.download.manager.showWhenStarting = FALSE,
                                              # put your path here but remember to give path like C:\\DirOfYourChoice and not C:\\DirOfYourChoice\\ [last \\ is not going to work]
                                              browser.download.dir = normalizePath("TestDL"),
                                              browser.helperApps.alwaysAsk.force = FALSE,
                                              browser.helperApps.neverAsk.openFile = paste0(known_formats, collapse = ","),
                                              browser.helperApps.neverAsk.saveToDisk = paste0(known_formats, collapse = ","),
                                              browser.download.manager.showWhenStarting = FALSE,
                                              # this is for marionette and related security
                                              "browser.tabs.remote.force-enable" = TRUE,
                                              pdfjs.disabled = TRUE))

remDr <- remoteDriver(remoteServerAddr = "localhost",
                      port = 4444,
                      browserName = "firefox",
                      extraCapabilities = firefox_profile.me)

remDr$open()

remDr$navigate("https://www.google.com/search?q=sample+xlsx")

remDr$findElement(using = "css selector", value = ".g:nth-child(1) a")$clickElement()

remDr$navigate("https://www.google.com/search?q=test+xls")

remDr$findElement(using = "css selector", value = ".g:nth-child(1) a")$clickElement()

私が使用している私と一緒にうまく働いています

Firefox 50.1.0 [while I'm writing this post]
Selenium [3.0.1]
R [3.3.2 (2016-10-31)]

これをpythonに移植できることを願っています。Firefoxで構成を複製してみてくださいmakeFirefoxProfile

さらに理解を深めるための参照:- Selenium Firefox プロファイル設定
を使用してファイルをダウンロードする方法Selenium で

于 2017-01-04T06:51:12.427 に答える
-1

リンクによってインターネットからファイルをダウンロードするための追加の方法を作成できます。

私のC#コードからの例:

public Bitmap Image
        {
            get
            {
                string webPath = Element.GetAttribute("src");

                if (webPath != string.Empty)
                {
                    try
                    {
                        System.Net.WebRequest request =
                            System.Net.WebRequest.Create(webPath);

                        System.Net.WebResponse response = request.GetResponse();

                        System.IO.Stream responseStream = response.GetResponseStream();

                        Bitmap bitmapImg = new Bitmap(responseStream);

                        return bitmapImg;
                    }
                    catch (System.Net.WebException)
                    {
                    }
                }

                return new Bitmap(1,1);
            }
        }

ご覧のとおり、このコードでは、画像要素から src 属性を取得し、ブラウザーから外部的にダウンロードして、完全に正しいビットマップ画像を取得します (この後、HDD に保存できます)。同様に、リンクから任意のファイルをダウンロードできます =)

于 2015-08-28T21:13:18.007 に答える