当前位置: 首页 > 知识库问答 >
问题:

使用SeleniumWebDriver在自定义路径下载文件

苏墨竹
2023-03-14

我是selenium的新手,我想使用selenium chrome Web驱动程序在特定的自定义文件夹中下载文件。默认情况下,该文件正在浏览器指定的下载路径中下载。任何一个建议在C#Selenium的自定义路径中下载文件的最佳解决方案。

共有2个答案

段志
2023-03-14

您需要破解一下,以便可以在指定位置下载文件。选项1:使用第三方工具(如AutoIt),该工具可以与Windows弹出窗口进行交互,您可以使用它指定路径。选项 2:编写一个可以使用 API 进行下载的自定义方法。

                    var downloadDocLink = webDriver.FindElement(By.XPath("{}")).GetAttribute("onclick");
                    string toBeSearched = "{string}"; //this string needs to be trimmed from the url
                    string downloadUrl = downloadDocLink.Substring(downloadDocLink.IndexOf(toBeSearched) + toBeSearched.Length);
                    var data = webDriver.DownloadByApiCall(downloadUrl);
                    var fileName = webDriver.FindElement(By.XPath("{Xpath}")).Text;

                    //Save result of report api call to file
                    var val = ConfigurationManager.AppSettings["OutputPath"];
                    var path = Environment.ExpandEnvironmentVariables(val);
                    var filePath = Path.Combine(path, fileName);

                    var dir = Path.GetDirectoryName(path);
                    Console.WriteLine($"Saving file with {data.Length} bytes to {path}.");
                    if (!Directory.Exists(dir))
                        Directory.CreateDirectory(dir);
                    File.WriteAllBytes(filePath, data);

                    //Ensure file was downloaded          
                    var exists = webDriver.FileExistsSpinWait(filePath);
                    Assert.IsTrue(exists, $"The downloaded report is not present in the download folder: \n{filePath}");

                    //Remove file and ensure deleted
                    File.Delete(filePath);
                    Assert.IsFalse(File.Exists(filePath));

通过API调用下载的帮助器方法

public static byte[] DownloadByApiCall(this IWebDriver driver, string apiCall)
        {
            var uri = new Uri(driver.Url);            
            var path = $"{url}/{apiCall}";

            byte[] data = null;
            try
            {
                var webRequest = (HttpWebRequest)WebRequest.Create(path);

                webRequest.CookieContainer = new CookieContainer();
                foreach (var cookie in driver.Manage().Cookies.AllCookies)
                    webRequest.CookieContainer.Add(new System.Net.Cookie(cookie.Name, cookie.Value, cookie.Path, string.IsNullOrWhiteSpace(cookie.Domain) ? uri.Host : cookie.Domain));

                var webResponse = (HttpWebResponse)webRequest.GetResponse();
                var ms = new MemoryStream();
                var responseStream = webResponse.GetResponseStream();
                responseStream.CopyTo(ms);
                data = ms.ToArray();
                responseStream.Close();
                webResponse.Close();
            }
            catch (WebException webex)
            {
                var errResp = webex.Response;
                using (var respStream = errResp.GetResponseStream())
                {
                    var reader = new StreamReader(respStream);
                    Assert.Fail($"Error getting file from the server({webex.Status} - {webex.Message}): {reader.ReadToEnd()}.");
                }
            }

            return data;
        }

这对我有用,它断言下载是否成功并且可以重新运行,以及我们最终将删除文件。希望这有帮助!

姚和顺
2023-03-14

希望对你有所帮助!!

var chromeOptions = new ChromeOptions();
 chromeOptions.AddUserProfilePreference("download.default_directory", "Your_Path");
 chromeOptions.AddUserProfilePreference("intl.accept_languages", "nl");
 chromeOptions.AddUserProfilePreference("disable-popup-blocking", "true");
var driver = new ChromeDriver("Driver_Path", chromeOptions);
 类似资料:
  • 问题内容: 我是selenium的新手,我想在特定的自定义文件夹中使用selenium chrome Web驱动程序下载文件。默认情况下,文件正在浏览器指定的下载路径中下载。任何人都建议在C#Selenium中以自定义路径下载文件的最佳解决方案。 问题答案: 希望对您有帮助!

  • 我使用Exavult提供的文件,成功地从Exavults上的文件夹下载了CSV文件,但下载会保存在Mac上的临时文件夹中。 如何定义要保存到的目录?这是脚本的摘录。 另外还有一个resources_api.py文件,它可能包含答案,但是如果我编辑它,我不确定如何调用这些更改。 任何帮助将不胜感激。

  • 我正在运行一个带有嵌入式Tomcat的Spring Boot1.2.3应用程序。 示例: 但是Spring@Controller@RequestMapping和Spring Security的似乎并不尊重它。两者仍然可以像一样工作。

  • 在Spring-Boot应用程序中,可以使用中的属性来选择上下文路径,但是由于我使用的是外部Tomcat8,因此没有使用该属性。 因此,我查看了tomcat-8文档,其中指出: 如果要使用与基文件名无关的上下文路径部署WAR文件或目录,则必须使用以下选项之一来防止双重部署: null null

  • 我使用以下代码在tomcat中设置上下文路径,通过覆盖tomcat的默认路径,我可以使用直接访问应用程序。 现在我将使用WildFly-8.2.0作为运行时环境。我尝试将。war文件直接粘贴到中,我可以在等浏览器中访问我的项目。 我需要像在tomcat中那样为wildfly设置相同的配置,以便通过重写wildfly的默认欢迎页面来访问中的项目。我试图在wildfly中做同样的事情,但我被困在哪里。

  • 我想用selenium WebDriver上传一个文件。我可以使用文件的绝对路径在本地计算机中完成此操作:String filename=“C:\windows\temp\”+“templatepmt.html”;。我正在使用Eclipse和一个带有pom.xml和的maven项目。我在SVN上提交了这个项目。我使用Jenkins软件在IE8上运行Web应用程序的测试。Jenkins部署在Red