Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java selenium无头模式下载PDF问题_Java_Selenium_Selenium Chromedriver_Headless_Awtrobot - Fatal编程技术网

Java selenium无头模式下载PDF问题

Java selenium无头模式下载PDF问题,java,selenium,selenium-chromedriver,headless,awtrobot,Java,Selenium,Selenium Chromedriver,Headless,Awtrobot,下面的代码是我尝试使用selenium从chrome浏览器下载PDF的代码 public static void main(String args[]) throws InterruptedException, AWTException, IOException, DocumentException { System.setProperty("webdriver.chrome.driver", "/home/sejalj/OtherProj/webDrivers/chromedrive

下面的代码是我尝试使用selenium从chrome浏览器下载PDF的代码

public static void main(String args[]) throws InterruptedException, AWTException, IOException, DocumentException {

    System.setProperty("webdriver.chrome.driver", "/home/sejalj/OtherProj/webDrivers/chromedriver_64");
    ChromeOptions ChromeOptions = new ChromeOptions();
    ChromeOptions.addArguments("--headless", "window-size=1024,768", "--no-sandbox");

    WebDriver driver = new ChromeDriver(ChromeOptions);

    String baseUrl = "http://url.com/";

    driver.get(baseUrl);

    driver.findElement(By.name("wl_user_name")).sendKeys("uname");
    driver.findElement(By.name("wl_user_password")).sendKeys("password");
    driver.findElement(By.cssSelector("input[value=Login]")).click();

    String pdfUrl = "https://www.pdfurl.com/displayImageDocs.php?
    f=MjAxODA3MjQxMDUwNzA4Ni5QREY=&p=aW1hZ2UuaW1hZ2ViYW5rLmJsdsaddhbmsxLjIwMTgwNy4yMDE4MDcyNA==&a=MTAwMjM0&POL_NUM=AAS06036999";";

    // Opens pdf of specific URL
    driver.get(pdfUrl);     

    Actions a = new Actions(driver);

    // To press CTRL+S
    a.keyUp(Keys.CONTROL).sendKeys("s").build().perform();

    Robot robot = new java.awt.Robot();     
    robot.keyPress(KeyEvent.VK_BACK_SPACE);     
    robot.keyRelease(KeyEvent.VK_BACK_SPACE);
    int keyInput[] = {KeyEvent.VK_A, KeyEvent.VK_A, KeyEvent.VK_A, KeyEvent.VK_A, KeyEvent.VK_UNDERSCORE,
                      KeyEvent.VK_P, KeyEvent.VK_O, KeyEvent.VK_L, KeyEvent.VK_I, KeyEvent.VK_C, KeyEvent.VK_Y
                     };

    for (int i = 0; i < keyInput.length; i++) {
          robot.keyPress(keyInput[i]);
          robot.keyRelease(keyInput[i]);
    }

    // To press ENTER
    robot.keyPress(KeyEvent.VK_ENTER);
    Thread.sleep(1000);
    robot.keyRelease(KeyEvent.VK_ENTER);

    System.out.println("Preparing Policies document...Please wait");
    System.out.println("Document prepared..");
}
publicstaticvoidmain(字符串args[])抛出interruptedeexception、AWTException、IOException、DocumentException{
System.setProperty(“webdriver.chrome.driver”,“/home/sejalj/OtherProj/webDrivers/chromedriver_64”);
ChromeOptions ChromeOptions=新的ChromeOptions();
addArguments(“--headless”,“窗口大小=1024768”,“--no sandbox”);
WebDriver驱动程序=新的ChromeDriver(ChromeOptions);
字符串baseUrl=”http://url.com/";
get(baseUrl);
driver.findElement(按名称(“wl_用户名”)).sendKeys(“uname”);
driver.findElement(按名称(“wl_用户_密码”)).sendKeys(“密码”);
driver.findelelement(By.cssSelector(“输入[value=Login]”)。单击();
字符串pdfUrl=”https://www.pdfurl.com/displayImageDocs.php?
f=MJAXDA3MJQXMDUWNZA4NI5QREY=&p=AW1HZ2UUAW1HZ2VIYW5RLMJSDSDADDHBMSXLJIWMTGWNY4YMDE4MDCYNA==&a=MTAwMjM0&POL_NUM=AAS06036999“;
//打开特定URL的pdf文件
驱动程序获取(pdfUrl);
动作a=新动作(驾驶员);
//按CTRL+S组合键
a、 keyUp(Keys.CONTROL).sendKeys(“s”).build().perform();
Robot Robot=new java.awt.Robot();
robot.keyPress(KeyEvent.VK_BACK_SPACE);
robot.keyRelease(KeyEvent.VK_BACK_SPACE);
int keyInput[]={KeyEvent.VK_A,KeyEvent.VK_A,KeyEvent.VK_A,KeyEvent.VK_A,KeyEvent.VK_下划线,
KeyEvent.VK_P、KeyEvent.VK_O、KeyEvent.VK_L、KeyEvent.VK_I、KeyEvent.VK_C、KeyEvent.VK_Y
};
for(int i=0;i
当chrome在无头模式下运行时,上述代码工作正常。 但在
--无头
模式下,上述代码不起作用

机器人
类不支持无头模式。 请导游

已标记为工作的解决方案可在此处找到:


尝试此方法并在
driver.get(pdfUrl);

这可能有助于将字符串的HashMap用于对象

HashMap prefs=newhashmap();
prefs.put(“plugins.always\u open\u pdf\u externally”,true);
设置实验选项(“prefs”,prefs);

参考以下链接后,我得到了解决方案:

以下是在headless模式下下载PDF文件的工作代码

public static void main(String args[]) throws InterruptedException, AWTException, IOException, DocumentException {

    System.setProperty("webdriver.chrome.driver", "/home/OtherProj/webDrivers/chromedriver_64");
    
    String downloadPath = "/home/Downloads/AAAA/";
    File file = new File(downloadPath);
    if(!file.exists())
        file.mkdirs();
    
    ChromeOptions chromeOptions = new ChromeOptions();
    
    HashMap<String, Object> prefs = new HashMap<>();        
    prefs.put("plugins.always_open_pdf_externally", true);

    chromeOptions.addArguments("--test-type");
    chromeOptions.addArguments("--disable-extensions");
    chromeOptions.setExperimentalOption("prefs", prefs);
    chromeOptions.setHeadless(true);
    
    String pdfUrl = "https://www.dummyurl.com/prod/displayImageDocs.php?f=MjAxODsafdfgsdjhgsjkA3MjQxMDUwNzA4Ni5QREY=&p=aW1hZ2UuaW1hZ2ViYW5rLmJhbmsxLjIwMTgwNy4yMDE4MDcyNA==&a=MTAwMsgsdjM0&POL_NUM=AAS06036999";
    
    ChromeDriverService driverService = ChromeDriverService.createDefaultService();
    WebDriver driver = new ChromeDriver(driverService, chromeOptions);

    // Saves the file on the given path
    PDFDemo.downloadFile(downloadPath, driverService, driver, pdfUrl);
    logger.debug("File Downloded Start");
        
    long fileSizeOne;
    long fileSizeTwo;

    do {

           File downlodedFolder = new File(downloadPath);
           File downlodedFile = downlodedFolder.listFiles()[0];

           fileSizeOne = downlodedFile.length();
           logger.debug("fileSizeOne " + fileSizeOne);
           Thread.sleep(1500);
           fileSizeTwo = downlodedFile.length();
           logger.debug("fileSizeTwo " + fileSizeTwo);
    } while (fileSizeTwo != fileSizeOne);

    logger.debug("File Downloded Completed");       
    System.out.println("Document Downloaded..");
}

private static void downloadFile(String downloadPath, ChromeDriverService driverService, WebDriver driver, String pdfUrl) throws ClientProtocolException, IOException, InterruptedException {
    
    Map<String, Object> commandParams = new HashMap<>();
    commandParams.put("cmd", "Page.setDownloadBehavior");
    Map<String, String> params = new HashMap<>();
    params.put("behavior", "allow");
    params.put("downloadPath", downloadPath);
    commandParams.put("params", params);
    HttpClient httpClient = HttpClientBuilder.create().build();

    ObjectMapper objectMapper = new ObjectMapper();
    String command = objectMapper.writeValueAsString(commandParams);        
    String u = driverService.getUrl().toString() + "/session/" + ((RemoteWebDriver) driver).getSessionId() + "/chromium/send_command";
    HttpPost request = new HttpPost(u);
    request.addHeader("content-type", "application/pdf");
    request.setEntity(new StringEntity(command));
    httpClient.execute(request);

    // Opens pdf of specific URL
    driver.get(pdfUrl);
}
publicstaticvoidmain(字符串args[])抛出interruptedeexception、AWTException、IOException、DocumentException{
System.setProperty(“webdriver.chrome.driver”,“/home/OtherProj/webDrivers/chromedriver_64”);
字符串downloadPath=“/home/Downloads/AAAA/”;
File File=新文件(下载路径);
如果(!file.exists())
mkdirs()文件;
ChromeOptions ChromeOptions=新的ChromeOptions();
HashMap prefs=新的HashMap();
prefs.put(“plugins.always\u open\u pdf\u externally”,true);
addArguments(“--测试类型”);
addArguments(“--disable extensions”);
设置实验选项(“prefs”,prefs);
chromeOptions.setHeadless(真);
字符串pdfUrl=”https://www.dummyurl.com/prod/displayImageDocs.php?f=MjAxODsafdfgsdjhgsjkA3MjQxMDUwNzA4Ni5QREY=&p=aW1hZ2UuaW1hZ2ViYW5rLmJhbmsxLjIwMTgwNy4yMDE4MDcyNA==&a=MTAwMsgsdjM0&POL_NUM=AAS06036999";
ChromeDriverService driverService=ChromeDriverService.createDefaultService();
WebDriver驱动程序=新的ChromeDriver(驱动程序服务、chromeOptions);
//将文件保存在给定路径上
下载文件(下载路径、驱动服务、驱动程序、pdfUrl);
debug(“文件下载启动”);
长锉刀;
长文件流;
做{
File downlodedFolder=新文件(下载路径);
File downlodedFile=downlodedFolder.listFiles()[0];
fileSizeOne=downlodedFile.length();
debug(“fileSizeOne”+fileSizeOne);
睡眠(1500);
fileSizeTwo=downlodedFile.length();
debug(“fileSizeTwo”+fileSizeTwo);
}while(filesizewo!=fileSizeOne);
debug(“文件下载完成”);
System.out.println(“文件下载”);
}
私有静态void downloadFile(字符串downloadPath、ChromeDriverService driversservice、WebDriver驱动程序、字符串pdfUrl)抛出ClientProtocolException、IOException、InterruptedException{
Map commandParams=new HashMap();
commandParams.put(“cmd”,“Page.setDownloadBehavior”);
Map params=新的HashMap();
参数put(“行为”、“允许”);
参数put(“downloadPath”,downloadPath);
commandParams.put(“params”,params);
HttpClient HttpClient=HttpClientBuilder.create().build();
ObjectMapper ObjectMapper=新的ObjectMapper();
String命令=objectMapper.writeValueAsString(commandParams);
字符串u=driverService.getUrl().toString()+“/session/”+((RemoteWebDriver)driver.getSessionId()+“/chromiu/send_command”;
HttpPost请求=新的HttpPost(u);
request.addHeader(“内容类型”、“应用程序/pdf”);
request.setEntity(新的StringEntity(命令));
httpClient.execute(请求);
//打开特定URL的pdf文件
驱动程序获取(pdfUrl);
}

我发现您有想要下载的pdf的直接链接。尝试使用
chromeOptions.setHeadless(true)
您可以使用
海德斯罗马
而不是
报告的打开错误@PrashantPalve是的,实际上我们有。我们使用按键事件
Ctrl+S
Enter
保存PDF。但是在chrome无头模式下,按键事件不支持。您设置了任何chrome选项吗?@PrashantPalve Y
public static void main(String args[]) throws InterruptedException, AWTException, IOException, DocumentException {

    System.setProperty("webdriver.chrome.driver", "/home/OtherProj/webDrivers/chromedriver_64");
    
    String downloadPath = "/home/Downloads/AAAA/";
    File file = new File(downloadPath);
    if(!file.exists())
        file.mkdirs();
    
    ChromeOptions chromeOptions = new ChromeOptions();
    
    HashMap<String, Object> prefs = new HashMap<>();        
    prefs.put("plugins.always_open_pdf_externally", true);

    chromeOptions.addArguments("--test-type");
    chromeOptions.addArguments("--disable-extensions");
    chromeOptions.setExperimentalOption("prefs", prefs);
    chromeOptions.setHeadless(true);
    
    String pdfUrl = "https://www.dummyurl.com/prod/displayImageDocs.php?f=MjAxODsafdfgsdjhgsjkA3MjQxMDUwNzA4Ni5QREY=&p=aW1hZ2UuaW1hZ2ViYW5rLmJhbmsxLjIwMTgwNy4yMDE4MDcyNA==&a=MTAwMsgsdjM0&POL_NUM=AAS06036999";
    
    ChromeDriverService driverService = ChromeDriverService.createDefaultService();
    WebDriver driver = new ChromeDriver(driverService, chromeOptions);

    // Saves the file on the given path
    PDFDemo.downloadFile(downloadPath, driverService, driver, pdfUrl);
    logger.debug("File Downloded Start");
        
    long fileSizeOne;
    long fileSizeTwo;

    do {

           File downlodedFolder = new File(downloadPath);
           File downlodedFile = downlodedFolder.listFiles()[0];

           fileSizeOne = downlodedFile.length();
           logger.debug("fileSizeOne " + fileSizeOne);
           Thread.sleep(1500);
           fileSizeTwo = downlodedFile.length();
           logger.debug("fileSizeTwo " + fileSizeTwo);
    } while (fileSizeTwo != fileSizeOne);

    logger.debug("File Downloded Completed");       
    System.out.println("Document Downloaded..");
}

private static void downloadFile(String downloadPath, ChromeDriverService driverService, WebDriver driver, String pdfUrl) throws ClientProtocolException, IOException, InterruptedException {
    
    Map<String, Object> commandParams = new HashMap<>();
    commandParams.put("cmd", "Page.setDownloadBehavior");
    Map<String, String> params = new HashMap<>();
    params.put("behavior", "allow");
    params.put("downloadPath", downloadPath);
    commandParams.put("params", params);
    HttpClient httpClient = HttpClientBuilder.create().build();

    ObjectMapper objectMapper = new ObjectMapper();
    String command = objectMapper.writeValueAsString(commandParams);        
    String u = driverService.getUrl().toString() + "/session/" + ((RemoteWebDriver) driver).getSessionId() + "/chromium/send_command";
    HttpPost request = new HttpPost(u);
    request.addHeader("content-type", "application/pdf");
    request.setEntity(new StringEntity(command));
    httpClient.execute(request);

    // Opens pdf of specific URL
    driver.get(pdfUrl);
}