簡體   English   中英

如何使用 Webdriver 等待下載完成

[英]How to wait for download to finish using Webdriver

有沒有辦法在 WebDriver 中等待下載完成?

基本上,我想驗證下載的文件是否正確存儲在硬盤驅動器中,並驗證這一點,需要等到下載完成。 如果有人更早知道這種情況,請提供幫助。

不是直接回答您的問題,但我希望它會有所幫助。

將文件放在硬盤上(計算它的 MD5)。 一旦正確,您就可以進一步進行測試。 如果超時后文件不正確,則使 tets 失敗。

輪詢配置的下載目錄是否缺少部分文件。

以下 Chrome 的示例代碼:

    File destinationDir = new File("blah");

    Map<String, Object> prefs = new HashMap<>();
    prefs.put("download.default_directory", destinationDir.getAbsolutePath());

    DesiredCapabilities desiredCapabilities = DesiredCapabilities.chrome();

    ChromeOptions options = new ChromeOptions();
    options.setExperimentalOption("prefs", prefs);
    desiredCapabilities.setCapability(ChromeOptions.CAPABILITY, options);

    WebDriver webDriver = new ChromeDriver(desiredCapabilities);
    // Initiate download...

    do {
        Thread.sleep(5000L);
    } while(!org.apache.commons.io.FileUtils.listFiles(destinationDir, new String[]{"crdownload"}, false).isEmpty());

正如在 Selenium webdriver JAVA 中等待下載完成所回答的那樣

  private void waitForFileDownload(int totalTimeoutInMillis, String expectedFileName) throws IOException {  
            FluentWait<WebDriver> wait = new FluentWait(this.funcDriver.driver)
                                   .withTimeout(totalTimeoutInMillis, TimeUnit.MILLISECONDS)
                                   .pollingEvery(200, TimeUnit.MILLISECONDS);
            File fileToCheck = getDownloadsDirectory()
                               .resolve(expectedFileName)
                               .toFile();

            wait.until((WebDriver wd) -> fileToCheck.exists());

        }


public synchronized Path getDownloadsDirectory(){
        if(downloadsDirectory == null){

            try {
                downloadsDirectory = Files.createTempDirectory("selleniumdownloads_");
            } catch (IOException ex) {
                throw new RuntimeException("Failed to create temporary downloads directory");
            }
        }
        return downloadsDirectory;
    }

然后你可以使用庫像這樣做實際的文件處理看到的是正確地存儲(這可能意味着比較文件的大小,MD5哈希值,甚至檢查文件的內容,其蒂卡其實可以做的一樣好)的文件。

public void fileChecker(){
        waitForFileDownload(20000,"filename_here");

        File file = downloadsDirectory.resolve(expectedFileName).toFile();

        AutoDetectParser parser = new AutoDetectParser();
        parser.setParsers(new HashMap<MediaType, Parser>());

        Metadata metadata = new Metadata();
        metadata.add(TikaMetadataKeys.RESOURCE_NAME_KEY, file.getName());

        try (InputStream stream = new FileInputStream(file)) {
            parser.parse(stream, (ContentHandler) new DefaultHandler(), metadata, new ParseContext());
        }

        String actualHash = metadata.get(HttpHeaders.CONTENT_MD5); 
        assertTrue("There was a hash mismatch for file xyz:",actualHash.equals("expectedHash"));
    }

我是你在 Python + Firefox 中的波紋管代碼:

browser.get('about:downloads')  #Open the download page.
# WAit all icons change from "X" (cancel download).
WebDriverWait(browser, URL_LOAD_TIMEOUT * 40).until_not(
    EC.presence_of_element_located((By.CLASS_NAME, 'downloadIconCancel')))

對於小文件,我目前要么使用隱式等待,要么在繼續之前等待我的文件下載的 JS 回調。 下面的代碼是由另一個人在 SO 上發布的,我無法立即找到該帖子,因此我不會因此而受到贊揚。

public static void WaitForPageToLoad(IWebDriver driver) { TimeSpan timeout = new TimeSpan(0, 0, 2400); WebDriverWait wait = new WebDriverWait(driver, timeout);

        IJavaScriptExecutor javascript = driver as IJavaScriptExecutor;
        if (javascript == null)
            throw new ArgumentException("driver", "Driver must support javascript execution");

        wait.Until((d) =>
        {
            try
            {
                string readyState = javascript.ExecuteScript("if (document.readyState) return document.readyState;").ToString();
                return readyState.ToLower() == "complete";
            }
            catch (InvalidOperationException e)
            {
                //Window is no longer available
                return e.Message.ToLower().Contains("unable to get browser");
            }
            catch (WebDriverException e)
            {
                //Browser is no longer available
                return e.Message.ToLower().Contains("unable to connect");
            }
            catch (Exception)
            {
                return false;
            }
        });
    }

如果文件很小,它應該等待您的文件完成。 不幸的是,我還沒有在較大的文件(> 5MB)上測試過這個

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM