首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在selenium webdriver JAVA中等待下载完成

在selenium webdriver JAVA中等待下载完成
EN

Stack Overflow用户
提问于 2014-03-28 21:22:54
回答 13查看 45.2K关注 0票数 20

单击下载按钮后,文件将被下载。在执行下一段代码之前,它需要等待下载完成。

我的代码如下所示:

Thread.sleep(2000);
driver.findElement(By.xpath("//*[@id='perform']")).click();//click for download

Thread.sleep(20000);
//code to be executed after download completes
Readfile fileobj=new Readfile();
String checkfile=fileobj.checkfilename();

如何让webdriver等待下载完成?

EN

回答 13

Stack Overflow用户

发布于 2016-02-16 06:39:47

有点晚了,但这个问题有很多观点,我认为如果你还没有继续前进或者其他人遇到了这个问题,花点时间来回答它是值得的。

我也遇到了同样的问题,我想我应该分享一下。我当时正在用python开发,但同样的概念也适用。您不必使用selenium进行实际的下载。您应该考虑检索链接并使用内置函数从那里继续,而不是单击元素开始下载。

通常单击开始下载的元素应该有一个'href‘属性,您应该能够使用selenium读取该属性。这是指向实际文件的url。在python中,它看起来像这样:

    element = driver.find_element_by_id('dl_link')
    url = element.get_attribute('href')

在这里,您可以使用http库来调用url。这里最重要的部分是您将'stream‘设置为true,这样您就可以开始将字节写入文件。确保文件路径包含正确的文件扩展名,另外,大多数操作系统不允许您使用某些字符命名文件,如反斜杠或引号,因此请注意这一点。

def download_file(url, file_path):
    from requests import get
    reply = get(url, stream=True)
    with open(file_path, 'wb') as file:
        for chunk in reply.iter_content(chunk_size=1024): 
            if chunk:
                file.write(chunk)

在下载完成之前,程序不应该继续运行,因此在下载完成之前,不再需要轮询。

我很抱歉用一种不同的语言回答,我相信你可以用Java来使用HttpURLConnection。希望这能有所帮助!

票数 19
EN

Stack Overflow用户

发布于 2015-11-16 21:15:50

do {

   filesize1 = f.length();  // check file size
   Thread.sleep(5000);      // wait for 5 seconds
   filesize2 = f.length();  // check file size again

} while (filesize1 != filesize2); 

其中f为文件,文件大小为长

票数 7
EN

Stack Overflow用户

发布于 2017-01-04 01:19:56

我使用Scala实现自动化,但是到Java的移植应该很简单,因为我在那里使用的是java Selenium类。所以,首先你需要的是:

import com.google.common.base.Function
import java.nio.file.{Files, Paths, Path}

def waitUntilFileDownloaded(timeOutInMillis:Int)={
    val wait:FluentWait[Path] = new FluentWait(Paths.get(downloadsDir)).withTimeout(timeOutInMillis, TimeUnit.MILLISECONDS).pollingEvery(200, TimeUnit.MILLISECONDS)
    wait.until(
      new Function[Path, Boolean] {
        override def apply(p:Path):Boolean = Files.list(p).iterator.asScala.size > 0
      }
    )
  }

然后,在我需要下载xls文件的测试套件中,我只有以下内容:

def exportToExcel(implicit driver: WebDriver) = {
    click on xpath("//div[contains(@class, 'export_csv')]")
    waitUntilFileDownloaded(2000)
  }

我希望你已经有了这个想法。FluentWait是一个非常有用的抽象,虽然它是Selenium的一部分,但在满足某些条件之前,您可以在任何需要等待轮询的地方使用它。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22714112

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档