我必须使用下面给出的Selenium Webdriver执行以下任务。
任何人都可以分享,我们如何使用Java实现这一点?
答案 0 :(得分:22)
您将无法访问保存对话框。这是由操作系统控制的。您唯一能做的就是设置浏览器的默认下载位置,并允许它自动下载文件。然后用Java检查文件。
您应该从this answer查看this previous SO question。基本上,在设置Firefox配置文件时,您可以添加一个调用,将属性browser.helperApps.neverAsk.saveToDisk
设置为逗号分隔的MIME类型列表,以便始终下载:
firefoxProfile.setPreference("browser.helperApps.neverAsk.saveToDisk","text/csv");
请参阅关于:configs的this Mozilla KB FAQ article。
<强>更新强> 看起来现在可以see this answer in another question
了答案 1 :(得分:9)
取消/保存对话框弹出窗口可能正在显示,因为该网站正在向您发送不同的MIME类型。
检查实际的标题内容。
使用开发人员工具中内置的firefox,右键单击以检查发布的元素/下载链接,然后查看网络监视器以查看返回的ContentType标头值。这将是您要使用的那个..
相应地设置个人资料设置
firefoxProfile.setPreference("browser.helperApps.neverAsk.saveToDisk",
"application/octet-stream,text/csv");
我期待&#34; text / csv&#34;然而得到了&#34; application / octet-stream&#34; 一旦将其添加到接受的类型列表中,它就会按预期工作,没有弹出窗口
答案 2 :(得分:3)
一种可能的解决方案是通过Selenium获取文件的URL,创建(非Selenium)连接,将Selenium的cookie复制到连接(如果需要),然后下载文件。大多数语言都有用于执行HTTP请求的API(或库)。例如,要在Java中完成此操作,可以使用URL.openConnection()
:
String link = linkElement.getAttribute("href");
URL url = new URL(link);
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setRequestMethod("GET");
您可能需要复制Selenium拥有的Cookie以模仿Selenium用户(例如,如果您正在测试需要登录的网站)。
Set<Cookie> cookies = webDriver.manager().getCookies();
String cookieString = "";
for (Cookie cookie : cookies) {
cookieString += cookie.getName() + "=" + cookie.getValue() + ";";
}
httpURLConnection.addRequestProperty("Cookie", cookieString);
然后,您可以使用HttpURLConnection.getInputStream()
将文件内容写入首选位置。
try (InputStream in = httpURLConnection.getInputStream()) {
Files.copy(in, new File("/path/to/file.ext").toPath(),
StandardCopyOption.REPLACE_EXISTING);
}
虽然这种方法对于不同的编程语言会有所不同,对所有浏览器都是一样的。
答案 3 :(得分:1)
我认为你正在寻找像这样的东西
//common to all the cases
FirefoxProfile prof = new FirefoxProfile();
//Case:1 - Use this case to set download this code to your browser's default location
//prof.setPreference("browser.helperApps.neverAsk.saveToDisk", "application/zip");
//Case:2 - Download file to Desktop
//prof.setPreference("browser.download.folderList", 0);
//prof.setPreference("browser.helperApps.neverAsk.saveToDisk", "application/zip");
//Case:3 - Download to custom folder path. Replace d:\\selenium with your Download Location
prof.setPreference("browser.download.dir","D:\\selenium\\");
prof.setPreference("browser.download.folderList", 2);
prof.setPreference("browser.helperApps.neverAsk.saveToDisk", "application/zip");
//This will work for all cases mentioned above
WebDriver driver = new FirefoxDriver(prof);
driver.get("http://docs.seleniumhq.org/download/");
driver.findElement(By.xpath("//tr[1]/td[4]/a[text()='Download']")).click();
答案 4 :(得分:0)
如果您使用的是Java和Chromdriver,我开发了一个library,可以让您的下载更轻松。
在其功能中,您可以在一个代码行中设置下载目录,并验证您的文件是否已成功下载:
@Test
void downloadAttachTest() throws InterruptedException {
adamInternetPage.navigateToPage(driver);
seleniumDownloadKPI.fileDownloadKPI(
adamInternetPage.getFileDownloadLink(), "SpeedTest_16MB.dat");
waitBeforeClosingBrowser();
}
答案 5 :(得分:0)
您可以使用以下代码将文件保存到所需位置。
package popups;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxOptions;
import org.openqa.selenium.firefox.FirefoxProfile;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
public class FileDownloadPopup
{
WebDriver driver;
FirefoxProfile prof = new FirefoxProfile();
FirefoxOptions options = new FirefoxOptions();
@BeforeMethod
public void setEnvi()
{
System.setProperty("webdriver.gecko.driver", "E:\\Selenium Dependencies\\BrowserExecutables\\geckodriver_win64_v0.21.0.exe");
prof.setPreference("browser.download.dir","E:\\Downloads");
prof.setPreference("browser.download.folderList", 2);
prof.setPreference("browser.helperApps.neverAsk.saveToDisk", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
options.setProfile(prof);
driver = new FirefoxDriver(options);
driver.get("http://file-examples.com/index.php/sample-documents-download/sample-xls-download/");
driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
}
@Test
public void FDPP()
{
driver.findElement(By.xpath("(//a[text()='Download sample xlsx file'])[1]")).click();
}
@AfterMethod
public void closeEnvi()
{
driver.close();
}
}
答案 6 :(得分:-2)
String path="D:\xyz\abc\";
FirefoxOptions profile = new FirefoxOptions();
profile.addPreference("browser.download.folderList", 2);
profile.addPreference("browser.download.manager.showWhenStarting", false);
profile.addPreference("browser.download.dir", **path**);
profile.addPreference("browser.helperApps.neverAsk.openFile","text/csv,application/x-msexcel,application/excel,application/x-excel,application/vnd.ms-excel,image/png,image/jpeg,text/html,text/plain,application/msword,application/xml");
profile.addPreference("browser.helperApps.neverAsk.saveToDisk","text/csv,application/x-msexcel,application/excel,application/x-excel,application/vnd.ms-excel,image/png,image/jpeg,text/html,text/plain,application/msword,application/xml");
profile.addPreference("browser.helperApps.alwaysAsk.force", false);
profile.addPreference("browser.download.manager.alertOnEXEOpen", false);
profile.addPreference("browser.download.manager.focusWhenStarting", false);
profile.addPreference("browser.download.manager.useWindow", false);
profile.addPreference("browser.download.manager.showAlertOnComplete", false);
profile.addPreference("browser.download.manager.closeWhenDone", false);
new FirefoxDriver(profile);