How to download a pdf file in chrome using selenium webdriver - java

I want to download pdf in chrome using selenium.
System.setProperty("webdriver.chrome.driver", System.getProperty("user.dir")
+ System.getProperty("file.separator")
+ "BrowserDrivers"
+ System.getProperty("file.separator")
+ "chromedriver.exe");
String downloadFilepath = "C:\\Users\\Vinod\\Downloads";
HashMap<String, Object> chromePrefs = new HashMap<String, Object>();
chromePrefs.put("profile.default_content_settings.popups", 0);
chromePrefs.put("download.default_directory", downloadFilepath);
//Save Chrome Opions
ChromeOptions options = new ChromeOptions();
HashMap<String, Object> chromeOptionsMap = new HashMap<String, Object>();
options.setExperimentalOption("prefs", chromePrefs);
options.addArguments("--test-type");
DesiredCapabilities cap = DesiredCapabilities.chrome();
cap.setCapability(ChromeOptions.CAPABILITY, chromeOptionsMap);
cap.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true);
cap.setCapability(ChromeOptions.CAPABILITY, options);
driver = new ChromeDriver(cap);
driver.get(url);
I tried above code but its not working

Since chrome 57 the automatic pdf preview no longer works as a plugin, there's now a setting you can change to make this work. You can actually inspect the name of the pref by inspecting the chrome's own preference dialog, under "Content Settings" the flag that says "Open PDF files in the default PDF viewer application."
You can set that to false to avoid automatic pdf preview, like this (ruby example):
caps = Selenium::WebDriver::Remote::Capabilities.chrome(
"chromeOptions" => {
'args' => ['disable-gpu', "--window-size=1920,1080"],
prefs: {
"download.prompt_for_download": false,
"download.directory_upgrade": true,
"plugins.always_open_pdf_externally": true,
"download.default_directory": DownloadHelpers::PATH.to_s
}
}
)
Capybara::Selenium::Driver.new(
app,
browser: :chrome,
desired_capabilities: caps
)

Here are the C# options for anyone working with .NET
var tsTimeout = new TimeSpan(0, 5, 0);
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.AddUserProfilePreference("download.default_directory", _downloadFolder);
chromeOptions.AddUserProfilePreference("download.prompt_for_download", false);
chromeOptions.AddUserProfilePreference("download.directory_upgrade", true);
chromeOptions.AddUserProfilePreference("plugins.plugins_disabled", "Chrome PDF Viewer");
chromeOptions.AddUserProfilePreference("plugins.always_open_pdf_externally", true);
_driver = new ChromeDriver(CWebCrawler.WebCrawlerRootFolder, chromeOptions, tsTimeout);

You might load this page and change the setting using selenium navigations:
chrome://settings/content/pdfDocuments

You would need to add below statement to your chrome profile:
chromePrefs.put("pdfjs.disabled", true);
It seems that newer versions of browsers are coming with built-in ability of displaying PDF files inside browser. Refer this for more information, though it is for firefox profile but still a good read.
Hope that solves your issue, else you may need to downgrade your chrome to make it work. Let me know if you have any queries.

Are you using Adobe Acrobat/Adobe Reader to display the PDFs? If so, it is probably Abode's behavior you need to modify.
Here are the steps I had to take:
Open Adobe Reader
Edit menu, Preferences
Selcet Internet from the Categories list
Uncheck Display PDF in browser
Press OK
you can also disable the Adobe plugin in Chrome, which will force Chrome to download the PDF.
It's under chrome://plugins.
but as you said its latest chrome browser then check is chrome PDF view visible in plugin if Yes disable it too.
Disable "Chrome PDF Viewer" or unmark always allowed to run check box try both

The following python code worked for me in Chrome to download pdf by disabling the pdf viewer.
options = webdriver.ChromeOptions()
prefs = {"download.default_directory": chromeDownloadPath,
"download.prompt_for_download": False,
"download.extensions_to_open": "applications/pdf",
"plugins.plugins_disabled": "Chrome PDF Viewer",
"plugins.always_open_pdf_externally": True}
options.add_experimental_option("prefs", prefs)
driver = webdriver.Chrome('chromedriver', options=options)

Related

How can i handle download firefox dialogbox (accept download and cancel it ) + selenium java

I try to download files from firefox but i can't handle save dialogbox even i used firefox profile as below.
in fact , i want to accept and cancel dialogbox to continue the test but in my case it save the file but the dialogBox still displayed .
else if(browserName.equals("FF")) {
System.setProperty("webdriver.gecko.driver",
prop.getProperty("FirefoxDriver_win64"));
FirefoxOptions FfOptions = new FirefoxOptions();
FfOptions.setCapability("marionette", true);
FirefoxProfile profile = new FirefoxProfile();
profile.setPreference("browser.download.panel.shown", false);
profile.setPreference("browser.helperApps.neverAsksaveToDisk", "application/x-msexcel,text/html,application/xop+xml,application/vnd.ms-excel.sheet.binary.macroenabled.12,application/vnd.wap.wbxml,application/octet-stream,application/x-authorware-bin,application/x-bcpio,text/plain,application/x-msdownload,application/excel,application/x-excel,application/excel,application/x-excel,application/excel,application/vnd.ms-excel,application/x-excel,application/x-msexcel"); profile.setPreference("browser.helperApps.neverAsk.saveToDisk", "text/csv,application/vnd.ms-excel");
profile.setPreference("browser.download.folderList", 2);
profile.setPreference("browser.download.dir","C:\\Users\\PC\\git\\downloadFile");
FfOptions.setProfile(profile);
driver = new FirefoxDriver(FfOptions);
}
Thanks,
You can use Robot class to deal with popups live save dialogue open file dialogue
this link will help you to understand further.Usage of Robot Class

Deactivate chrome alert with selenium

I want to deactivate this chrome alert (see attached) for my selenium script. What I tried so far:
ChromeOptions ops = new ChromeOptions();
ops.addArguments("--disable-notifications");
System.setProperty("webdriver.chrome.driver", "./lib/chromedriver");
driver = new ChromeDriver(ops);
Also tried with the arguments: disable-infobars and
disable-popup-blocking. None of these solved the issue for me.
I tried the solution explained here: How to disable a How to disable a "Reload site? Changes you made may not be saved" popup for (python) selenium tests in chrome?
But it doesn't work for me.
Sorry for the german alert, it asks if I want to leave the page.
For New Chrome Version (>50) you have to use the following,
Map<String, Object> prefs = new HashMap<String, Object>();
prefs.put("profile.default_content_setting_values.notifications", 2);
ChromeOptions options = new ChromeOptions();
options.setExperimentalOption("prefs", prefs);
WebDriver driver = new ChromeDriver(options);
So simply if you need to disable notifications you can use this statement,
profile.default_content_setting_values.notifications = 2
And to enable,
profile.default_content_setting_values.notifications = 1
have you tried giving navigation of a page of which you want to handle notifications of.
driver.get

How to disable Insecure Password Warning in Firefox using Selenium Webdriver with Java

I am new to Selenium Webdriver. I am trying to test my application login page in Firefox. Every time while doing so I am getting insecure password warning (This connection is not secure. Logins entered here could be compromised).
This is coming when password is entered. How to disable that in selenium Webdriver using Java?
Currently I am using this code:
System.setProperty("webdriver.gecko.driver", driverPathFF);
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true);
capabilities.setCapability(CapabilityType.ACCEPT_INSECURE_CERTS, true);
driver = new FirefoxDriver(capabilities);
But it is not helping. I tried other ways found in related google search as well but no luck.
Please check the link for reference.
Sceenshot
You may try to set preferences for firefox using Selenium.
For example,
var firefoxOptions = new FirefoxOptions();
firefoxOptions.SetPreference("security.insecure_password.ui.enabled", false);
firefoxOptions.SetPreference("security.insecure_field_warning.contextual.enabled", false);
It represents values that can be changed manually by opening Firefox, typing about:config and finding the same options.
It helped my tests to avoid the insecure login message.
Try Creating firefox profile like the below one,
profile = new FirefoxProfile()
profile.accept_untrusted_certs = True
DesiredCapabilities dc = DesiredCapabilities.firefox();
dc.setCapability(FirefoxDriver.PROFILE, profile);
WebDriver driver = new FireFoxDriver(dc);
A javascript way of doing this:
const {Builder} = require('selenium-webdriver');
const firefox = require('selenium-webdriver/firefox');
var profile = new firefox.Profile();
profile.setPreference("security.insecure_password.ui.enabled", false);
profile.setPreference("security.insecure_field_warning.contextual.enabled", false);
var options = new firefox.Options().setProfile(profile);
var browserUnderTest = new webdriver.Builder()
.forBrowser('firefox')
.setFirefoxOptions(options)
.build();
If am right, I think there's a way to achieve that using selenium:
Something of this nature;
var firefox = new FirefoxOptions();
firefox.SetPreference("security.insecure_password.ui.enabled", false);
Not too sure about that though! But just give it a shot!
In Java this worked for me
FirefoxProfile fp = new FirefoxProfile();
fp.setPreference("security.insecure_field_warning.contextual.enabled", false);

Chrome is being controlled by automated test software

I am running automated tests in Chrome with Serenity BDD (Selenium).
I had to download a new ChromeDriver, because my tests could not run -> The test would open ChromeDriver but could not "Browse as user". When I googled the issue, they said I had to update ChromeDriver.
So I updated ChromeDriver to version 2.28 and I also updated the Chrome version to Version 57.0.2987.98.
But now - EVERY TIME I run my tests this annoying text comes up:
Chrome is being controlled by automated test software
And it asks me if I want to save password. (I can't add pictures because I don't have enough "points")
In the previous version, I had managed to block these 2 things by:
public class CustomChromeDriver implements DriverSource {
#Override
public WebDriver newDriver() {
try {
DesiredCapabilities capabilities = DesiredCapabilities.chrome();
Proxy proxy = new Proxy();
String proxyServer = String.format("AProxyIDontWantToDisplay", System.getenv("proxy.username"), System.getenv("proxy.password"));
proxy.setHttpProxy(proxyServer);
capabilities.setCapability("proxy", proxy);
ChromeOptions options = new ChromeOptions();
options.addArguments(Arrays.asList("--no-sandbox","--ignore-certificate-errors","--homepage=about:blank","--no-first-run"));
capabilities.setCapability(ChromeOptions.CAPABILITY, options);
ChromeDriver driver = new ChromeDriver(capabilities);
return driver;
} catch (Exception e) {
throw new Error(e);
}
}
#Override
public boolean takesScreenshots() {
return true;
}
}
I know there is this one (A link to same issue),
but there are too many answers that don't work.
Anybody that knows how to remove that?
Add this to the options you pass to the driver:
options.addArguments("disable-infobars");
Previously, passing the "disable-infobars” ChromeOption to the WebDriver prevented Chrome from displaying this notification. Recently, the "disable-infobars" option has been deprecated and no longer removes the notification. The current workaround for this is to pass in an option called "excludeSwitches" and then exclude the "enable_automation" switch.
ChromeOptions options = new ChromeOptions();
options.setExperimentalOption("excludeSwitches", new String[]{"enable-automation"});
WebDriver driver = new ChromeDriver(options);
"disable-info" switch is not supported anymore for the latest chromedrivers. (at least 76.0).
#Rajeev's answer works and here I write the counterpart for C#.
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.AddAdditionalCapability("useAutomationExtension", false);
chromeOptions.AddExcludedArgument("enable-automation");
Driver = new ChromeDriver(chromeOptions);
ChromeOptions options = new ChromeOptions();
options.setExperimentalOption("useAutomationExtension", false);
options.setExperimentalOption("excludeSwitches",Collections.singletonList("enable-automation"));
WebDriver driver = new ChromeDriver(options);
Use the above codes for latest Chrome drivers.
Tried many of these suggested solutions, but none of them worked. OK, my code is in C#, so there might be some differences in the WebDriver implementations for different platforms.
Anyway, the solution that I got working was using the following options for Chrome when running on .NET.
var options = new ChromeOptions();
options.AddExcludedArguments("enable-automation");
On .NET there doesn't seem to be any setExperimentalOption() method on the ChromeOptions class.
While the disable-infobars route will work, it will likely suppress the infobar in all cases (as suggested here), not just the case that the OP is referring to. This is overkill at best, and could lead to unexpected and inexplicable behavior in the future if you are not getting some important message.
I think it's better to leverage the provided enable-automation switch by disabling it in the excludeSwitches area of your config/setup while doing nothing with regards to disable-inforbars. The enable-automation switch's description:
Inform users that their browser is being controlled by an automated test.
For nightwatch.conf.js it would look something like this (and worked for me):
desiredCapabilities: {
...
chromeOptions: {
excludeSwitches: ['enable-automation'],
...
}
}
This should only do what we are after: getting rid of that specific pesky message!
Edit [2017-11-14]: This is now causing an even more annoying Disable Developer Mode Extensions alert/warning. I've tried every relevant-looking flag/switch I could find that might help, but to no avail. I've filed a bug with Chromium, so we'll see and I'll try to swing back through here if I get a resolution.
"disable-infobars" flag has been deprecated, but you can avoid this message by adding the following:
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.setExperimentalOption("useAutomationExtension", false);
chromeOptions.setExperimentalOption("excludeSwitches",Collections.singletonList("enable-automation"));
WebDriver driver = new ChromeDriver(chromeOptions);
Works on 2022
remove Chrome is being controlled by automated test software in python
from selenium.webdriver.chrome.webdriver import WebDriver
from selenium.webdriver.chrome.options import Options
chromeOptions = webdriver.ChromeOptions()
chromeOptions.add_experimental_option("excludeSwitches", ['enable-automation']);
URL = "https://google.com/"
driver.get(URL)
May someone needs this for Capybara, Watir should be like this:
Capybara.register_driver :chrome do |app|
$driver = Capybara::Selenium::Driver.new(app, {:browser => :chrome, :args => [ "--disable-infobars" ]})
end
Protractor solution:
I arrived here searching for a Protractor solution, if useful for anyone I found, with help from the above answers; with Protractor you can add Chrome specific options to the chromeOptions object, within the capabilities object in the protractor.config file, for example to use the disable-infobars option discussed above use the following:
capabilities: {
'browserName': 'chrome',
'chromeOptions': {
'args': ['disable-infobars']
}
},
To use the enable-automation also discussed above:
capabilities: {
'browserName': 'chrome',
'chromeOptions': {
'excludeSwitches': ['enable-automation']
}
}
disable-infobars is preferred in my circumstances.
It works for me, with this code I am able to disable Chrome is being controlled by automated test software as well as the Save password popup`
Map<String, Object> prefs = new HashMap<String, Object>();
prefs.put("credentials_enable_service", false);
ChromeOptions options = new ChromeOptions();
options.setExperimentalOption("excludeSwitches",Collections.singletonList("enable-automation"));
options.setExperimentalOption("prefs", prefs);
WebDriver driver = new ChromeDriver(options)
Map<String, Object> prefs = new HashMap<String, Object>();
//To Turns off multiple download warning
prefs.put("profile.default_content_settings.popups", 0);
prefs.put( "profile.content_settings.pattern_pairs.*.multiple-automatic-downloads", 1 );
//Turns off download prompt
prefs.put("download.prompt_for_download", false);
prefs.put("credentials_enable_service", false);
//To Stop Save password propmts
prefs.put("password_manager_enabled", false);
ChromeOptions options = new ChromeOptions();
options.addArguments("chrome.switches","--disable-extensions");
//To Disable any browser notifications
options.addArguments("--disable-notifications");
//To disable yellow strip info bar which prompts info messages
options.addArguments("disable-infobars");
options.setExperimentalOption("prefs", prefs);
System.setProperty("webdriver.chrome.driver", "Chromedriver path");
options.addArguments("--test-type");
driver = new ChromeDriver(options);
Log.info("Chrome browser started");
public WebDriver SetupChromeDriver(){
//Initialize Chrome Driver
ChromeOptions options = new ChromeOptions();
Map<String, Object> prefs = new HashMap<String, Object>();
prefs.put("safebrowsing.enabled", "true");
options.setExperimentalOption("prefs", prefs);
options.addArguments("--disable-notifications");
options.addArguments("--start-maximized");
options.addArguments("disable-infobars");
System.setProperty("webdriver.chrome.driver", "E:/Importent Softwares/Chrome Driver/chromedriver_2.37.exe");
driver = new ChromeDriver(options);
return driver;
}
It works for me by using addArguments(array("disable-infobars"))
This is for facebook/php-webdriver
$options = new ChromeOptions();
$options->addArguments(array("disable-infobars"));
$capabilities = DesiredCapabilities::chrome();
$capabilities->setCapability(ChromeOptions::CAPABILITY, $options);
$this->driver = RemoteWebDriver::create('http://localhost:4444/wd/hub', $capabilities);
You may use this
options1.add_argument("--app=https://www.google.com.ph")
If anyone is using Rails 5.1+, which changed the testing structure a bit and Capybara is configured in this file now for system tests:
application_system_test_case.rb
You can add "args" in the options for driven_by like this:
driven_by :selenium, using: :chrome, screen_size: [1400, 1400], options: { args: ["--disable-infobars"] }
It took a lot of fiddling but eventually I found a combination of flags that works in 2021!
This tells Chrome to ignore all SSL errors, disables the "Chrome is being controlled by automated test software" message and starts in full screen.
Add it to the Target field of your shortcut:
"C:\Program Files\Google\Chrome\Application\chrome.exe" --ignore-certificate-errors --test-type=webdriver --start-fullscreen

Load Chrome Profile using Selenium WebDriver using java

I'm having some troubles getting Selenium loading a chrome profile.
String pathToChrome = "driver/chromedriver.exe";
System.setProperty("webdriver.chrome.driver", pathToChrome);
DesiredCapabilities capabilities = DesiredCapabilities.chrome();
String chromeProfile = "C:\\Users\\Tiuz\\AppData\\Local\\Google\\Chrome\\User Data\\Default";
ArrayList<String> switches = new ArrayList<String>();
switches.add("--user-data-dir=" + chromeProfile);
capabilities.setCapability("chrome.switches", switches);
WebDriver driver = new ChromeDriver(capabilities);
driver.get("http://www.google.com");
It starts great and works perfect, but I want to get the default profile loaded because I want to test it with some Extensions enabled and some preferences tested.
Does anybody has an idea why this code isn't working?
I've tested it with Selenium 2.29.1 and 2.28.0 with chromedriver 26.0.1383.0 on windows 7 x64.
This is an old question, but I was still having a problem getting it to work so I did some more research to understand what was happening. The answer from #PrashanthSams is correct, but I was incorrectly adding \Default to the end of the profile path
I found that Chrome appends \Default to the profile path specified in the user-data-dir. So if your profile path is specified as:
user-data-dir=C:\Users\user_name\AppData\Local\Google\Chrome\User Data\Default\
it will append \Default and you will end up at:
C:\Users\user_name\AppData\Local\Google\Chrome\User Data\Default\Default
which is not the same as the profile that you would get if you opened chrome under that user profile normally.
You can also verify your settings if you open a command prompt, navigate to the chrome executable directory, and run chrome with the options specified similar to this:
chrome.exe --user-data-dir="C:\Users\user_name\AppData\Local\Google\Chrome\User Data"
Finally, you can go to a new tab in Chrome and browse to chrome://version/ you will see the actual profile that is being used. It will be listed like:
Profile Path C:\Users\user_name\AppData\Local\Google\Chrome\User Data\Default
These combinations did trick for me :)
System.setProperty("webdriver.chrome.driver","C:\\chromedriver.exe");
ChromeOptions options = new ChromeOptions();
options.addArguments("user-data-dir=C:/Users/user_name/AppData/Local/Google/Chrome/User Data");
options.addArguments("--start-maximized");
driver = new ChromeDriver(options);
You should try this
op.addArgument("--user-data-dir=C:/Users/username/AppData/Local/Google/Chrome/User Data/");
op.addArgument("--profile-directory=Profile 2");
Path where Chrome stores the profiles on Linux.
String chromeProfilePath = "/home/(user)/.config/google-chrome/Profile3/";
Creating ChromeOptions object, desabling the extensions and adding the profile I want to use by ".addArguments".
ChromeOptions chromeProfile = new ChromeOptions();
chromeProfile.addArguments("chrome.switches", "--disable-extensions");
chromeProfile.addArguments("user-data-dir=" + chromeProfilePath);
As said above by JasonG, after this point Google-Chrome will append \Default to the String you've provided.
There is a "/Default" folder inside "/Profile3" directory, so what I did was...
I copied the content of "/Profile3" to the "/Default" folder.
Set the Browser System Properties and Path as you usually do, call the constructor that receives a ChromeOption and it will work fine.
WebDriver driver = new ChromeDriver(chromeProfile);
I copied default profile to any other folder and then I do connect to this copy
ChromeOptions options = new ChromeOptions();
options.AddArgument("--user-data-dir=C:\\AnyFolder");
driver = new ChromeDriver(options);
So it uses default profile
I tried in windows and following code works for me:
String userProfile= "C:\\Users\\user_name\\AppData\\Local\\Google\\Chrome\\User Data\\Default\\";
ChromeOptions options = new ChromeOptions();
options.addArguments("user-data-dir="+userProfile);
options.addArguments("--start-maximized");
WebDriver driver = new ChromeDriver(options);
driver.get("http://www.google.com");
How to know whether it is working ?
One way to know is to run the program twice without killing previous instance of the chrome. If the profile is valid, you'll see the second instance "as a new tab" in the first browser window. If it is not working, you get the second instance "as a new browser window".
According to the ChromeDriver wiki, this is a known issue and is currently not possible.
https://code.google.com/p/selenium/wiki/ChromeDriver
None of these above solutions works for me. And after several hours tirelessly research and trying, I already found out this solution
System.setProperty("webdriver.chrome.driver", "/usr/local/bin/chromedriver");
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.addArguments("--start-maximized");
//chrome://version/
chromeOptions.addArguments("--user-data-dir=/home/{username}/.config/google-chrome");
//load default profile
chromeOptions.addArguments("--profile-directory=Default");

Categories

Resources