I am testing a website which requires personal SSL certificates in order to do certain things, such as sign-in.
I have a Webdriver (Selenium 2.0) test that I have set up with a proxy:
Proxy localhostProxy = new Proxy();
localhostProxy.setProxyType(Proxy.ProxyType.MANUAL);
localhostProxy.setHttpProxy("www-proxyname:port");
FirefoxProfile profile = new FirefoxProfile();
profile.setProxyPreferences(localhostProxy);
driver = new FirefoxDriver(profile);
And this will access the homepage fine. The test then clicks the sign in button, enters in the correct credentials and clicks on submit. At this point the browser then goes into a loading state, and I'm assuming it's because the SSL certificate is missing from my side and therefore cannot connect to the sign in service.
I searched for different proxy solutions, and found this:
profile.setAcceptUntrustedCertificates(true);
profile.setAssumeUntrustedCertificateIssuer(true);
So I added it into my code, but it doesn't seem to do what I want. I think I'm looking for a way to tell WebDriver that my ssl certificate is in x directory, please use it when accessing this site. Does anyone know how to do this?
My Test code is:
#Test
public void userSignsInAndVerifiesDrawerViews(){
driver.get("www.url.com");
waitFor(5000);
driver.findElement(By.xpath("//a[contains(text(), 'Sign in')]")).click();
waitFor(3000);
String username = "seleniumtest";
String password = "seleniumtest1";
driver.findElement(By.id("username")).sendKeys(username);
driver.findElement(By.id("password")).sendKeys(password);
driver.findElement(By.xpath("//signin")).click();
waitFor(30000);
String signInLinkText = driver.findElement(By.xpath("//xpath")).getText();
assertEquals(signInLinkText, username);
}
Webdriver has no built in mechanism for adding a personal cert.
If you are using firefox the only way that I have found to do this is to create a firefox profile and add the certificate to it. You can then either reuse the profile when you run your tests OR, and this is my prefered option, take the cert8.db and key3.db files and add them to the profile that webdriver creates at runtime.
I am not sure how yo do this in java, but in ruby I override the layout_on_disk method of FirefoxProfile to add the extra files I required. Java has the same class so you should be able to do this same thing.
No need to overwrite the method layout_on_disk() as suggested.
You can simply load as profile a folder containing the files cert8.db and key3.db.
Selenium will complete the profile for you.
Then you can add the preferences you need to the firefox profile.
The resulting code looks like this:
FirefoxProfile firefoxProfile = new FirefoxProfile(
new File("/folder/location"));
FirefoxOptions options = new FirefoxOptions();
options.setProfile(firefoxProfile);
WebDriver driver = new RemoteWebDriver(
new URL("http://localhost:4444/wd/hub"),
options.toCapabilities());
Tested with selenium 3.5.3.
Webdriver can do this, although Derek is right and it isn't built in.
All you need to do is make a custom Trust Manager that trusts all certs and then also override the "hostname verifier" to allow a non-real domain name.
There is somewhat of an example I found on Google here:
http://grepcode.com/file/repo1.maven.org/maven2/org.seleniumhq.selenium.server/selenium-server-coreless/1.0.3/org/openqa/selenium/server/TrustEverythingSSLTrustManager.java
This is the same method you would use with Apache HC components to override SSL settings without using WebDriver. I've used this method a lot with direct HTTP posts using Apache HT components and it "appears" that from the link above , this concept should also work with WebDriver.
Related
I am trying to automate test to webrtc application and I'm trying to do it with multiple users. I created a setUp as below.
`
ArrayList<String> prefs = new ArrayList<String>();
prefs.add("--use-fake-device-for-media-stream");
prefs.add("--use-fake-ui-for-media-stream");
System.setProperty("webdriver.chrome.driver", "C:\\....\\resources\\chromedriver.exe");
ChromeOptions options = new ChromeOptions();
options.addArguments(prefs);
driver = new ChromeDriver(options);
driver.get("https://......");`
but when I use "--use-fake-ui-for-media-stream", the following remote address appears in the logs of the media server of the app.(I used this to disable the security popup for camera and mic.)
remote address looks like: 79beeb9e-ff01-4e69-906c-5be9cab979e6
when I don't use it, the remote address looks like this: 172.17.x.x
Therefore, I cannot connect to the meeting room, the server refuses the remote address.
When I remove "--use-fake-ui-for-media-stream" and put "--user-data-dir=C:\Users....\Local\Temp\...", I overcome this problem, but this time I can only connect to a single chromedriver on the Jmeter, the other chromedrivers are not working. I integrated testcases to Jmeter with Junit request.
I want to use this code for multiple users but I only could do it for a user or I could not connected.
How can i overcome this problem?
When first ChromeDriver instance is launched the profile directory gets locked and it cannot be re-used by 2nd, 3rd, etc. instance.
You can do something like:
prefs.add("--profile-directory=User" + org.apache.jmeter.threads.JMeterContextService.getContext().getThreadNum());
so each instance will have it's own separate profile folder.
More information:
open multiple chrome profile with selenium
JMeterContextService JavaDoc
How to Use JUnit With JMeter
I have this problem with selenium, i try to run my code below but i have this error: https://i.postimg.cc/VNd3F4rm/u2zrn.jpg .
Image of my "Signing in to Google": https://i.stack.imgur.com/w3POX.png (As you can see "App password" does not appear to me)
I have already tried to disable the "less secure apps" section in account settings and checked if JavaScipt was actived, but without success.
WebDriver driver= new ChromeDriver();
driver.navigate().to("https://accounts.google.com/signin");
driver.findElement(By.name("identifier")).sendKeys("email#gmail.com");
driver.findElement(By.xpath("/html/body/div[2]/div[2]/div[2]/div/div[2]/div/div/div[2]/div/div[2]/div/div[2]/div/div/button")).click();
driver.findElement(By.name("password")).sendKeys("*******");
I believe you need to go to your Google Account settings and under Security, you need to register your test app with a password. I had to do this in order to implement in Cucumber a way to send and read emails.
Then, from your test application, you will use those credentials (not your real Google creds) to authenticate and do what you need. You could also try this.
I have another solution in python that might help you.
Use Seleniumwire with undetected browser v2
Note: put chromedriver in your sys path.
from seleniumwire.undetected_chromedriver.v2 import Chrome, ChromeOptions
import time
options = {}
chrome_options = ChromeOptions()
chrome_options.add_argument('--user-data-dir=hash')
chrome_options.add_argument("--disable-gpu")
chrome_options.add_argument("--incognito")
chrome_options.add_argument("--disable-dev-shm-usage")
# chrome_options.add_argument("--headless")
browser = Chrome(seleniumwire_options=options, options=chrome_options)
browser.get('https://gmail.com')
browser.find_element_by_xpath('//*[#id="identifierId"]').send_keys('your-email')
browser.find_element_by_xpath('//*[#id="identifierNext"]/div/button').click()
time.sleep(5)
browser.find_element_by_xpath('//*[#id="password"]/div[1]/div/div[1]/input').send_keys('you-password')
browser.find_element_by_xpath('//*[#id="passwordNext"]/div/button').click()
In addition to this, selenium wire has many awesome features, check out Github repository
Is it possible to add passwords to a profile that's created as an instance of org.openqa.selenium.firefox.FirefoxProfile?
From Mozilla docs (Profiles — Where Firefox stores your bookmarks, passwords and other user data), I can see that Firefox stores passwords in two files:
Passwords: Your passwords are stored in the key3.db and logins.json files. For more information, see Password Manager - Remember, delete, change and import saved passwords in Firefox.
But can't see any way in the FirefoxProfile class to either add passwords to a profile individually, or to pass in files like logins.json/key3.db. (I can't find anything on the linked Mozilla pages either, which seem to be storing passwords as a regular user, rather than programmatically)
In my Selenium test suite, I'm creating a Firefox profile on the fly in code but am having to encode passwords (e.g. for HTTP Basic Auth on Dev servers) into URLs like this:
http://user:pass#localhost/example.html
(I know I could create an entire profile and add that to Git, to be passed around, but would like to avoid that if I can)
I read through the selenium firefoxprofile code for v53.0 and didn't see anything obvious. However, you could copy those two files from the existing profile into the default profile created by selenium. You only need the location of the newly generated default firefoxprofile which you can get (dynamically) when executing:
FirefoxProfile profile = new FirefoxProfile();
System.out.println(">> path to profile=" + profile.layoutOnDisk().getAbsolutePath());
// Copy the two files
WebDriver driver = new FirefoxDriver(profile);
Yes it is possible to create in firefox profile
Click the menu button and then click ExitQuit . Note: You can use -P , -p or -ProfileManager (any of them should work). Press Return. The Firefox Profile Manager (Choose User Profile) window should open.
When i tried to start on Firefox web driver its not starting its showing firefox default page
WebDriver dr = new FirefoxDriver();
dr.get("https://www.google.co.in/");
dr.manage().window().maximize();
its not starting its showing firefox default page
Below i attach output image screenshot
https://www.mozilla.org/en-US/firefox/43.0.4/firstrun/learnmore/
Firefox is one of the most compatible browsers with selemium, and at the same time, is one of the least compatible.
I say this because if you do not have the correct version of the selenium library to go with the version of firefox you are running, or vice-versa, it will always fail.
I would start by attempting to switch to a different version of Firefox. Selenium version 2.48.0 supports Firefox versions 24-41, so if your firefox version does not fit within that range, it is more than likely the problem.
I faced the same issue. The solution to this problem is to update the selenium version. When the page u mentioned i.e https://www.mozilla.org/en-US/firefox/43.0.4/firstrun/learnmore/ opens on firefox launch go to Options -> Addons -> Extensions. You will be able to see the Error there. I got "Forefox Webdriver could not be loaded and is disabled".
This was on Firefox 43 with selenium 2.44. Updating to selenium 2.51 rectified the issue.
Sorry, I cannot comment yet but I would like to help. I got the similar issue when I used selenium webdriver integrated in my python script. The problem was with credentials (particularly with the SSL protocols while declaring a new webdriver object). The code I used looked as the following:
driver = webdriver.PhantomJS(executable_path = "/opt/local/bin/phantomjs", service_args=['--ignore-ssl-errors=true'])
As you can see I use a key that ignores ssl errors. This solved my issue, so I am not sure what platform you use to write the code but hope you can find the similar call for the object.
I found the way how people handle untrusted certificates here. Particularly, for FireFox:
//It creates firefox profile
FirefoxProfile profile=new FirefoxProfile();
// This will set the true value
profile.setAcceptUntrustedCertificates(true);
// This will open firefox browser using above created profile
WebDriver driver=new FirefoxDriver();
driver.get("pass the url as per your requirement");
Hope it helps you!
Best.
-Petr.
Try this.. This will resolve the issue..
FirefoxProfile fpi = new FirefoxProfile();
fpi.setPreference("browser.startup.homepage_override.mstone", "ignore");
fpi.setPreference("startup.homepage_welcome_url.additional", "about:blank");
wd = new FirefoxDriver(fpi);
wd.get("http://www.google.com");
if you want to over-ride the properties of firefox, then,
1.first to find the list of browser properties, type "about:config" in the address url
2.use, setPreference method to set/assign the values..
I am using the Selenium-Firefox-driver and Selenium-Chrome-Driver version 2.0a5 (Web Driver API), and I am trying to test a web app that has BASIC authentication (there is a popup that come up to authenticate the user when I hit whatever page, the popup is not part of the HTML).
Now, I need to a strategy to authenticate the user in Firefox, Chrome and IE (I'm going to import the IE Driver soon).
I was reading in few articles that I can set a Firefox profile for instance..something like:
FirefoxProfile ffProfile = new FirefoxProfile();
ffProfile.setPreference("network.http.phishy-userpass-length", 255);
WebDriver driver = new FirefoxDriver(ffProfile);
driver.get("http://username:password#hostname");
but it doesn't seem to work for me. Does anyone have a working solution for those browsers?
I got it to work with Firefox webdriver by the following:
profile.SetPreference("network.automatic-ntlm-auth.trusted-uris", "google.com");
driver = new FirefoxDriver(profile);
driver.Navigate().GoToUrl("http://user:pwd#google.com");
True, BASIC HTTP authentication is not currently supported but I got it working now for FF and for Chrome.
The code I wrote in the questions works for those drivers. I just tried using FF3.6 as Firefox default browser (installed in Firefox folder) instead of FF4 (not supported yet). For IE, i may try to disable the authentication through Windows Registry.
This page http://code.google.com/p/selenium/issues/detail?id=34 may help.
For more portability, this can be handled by stub API and using Alert.
Example Java code (sample):
import org.openqa.selenium.Alert;
import org.openqa.selenium.security.Credentials;
public void authenticateUsing(Credentials credentials) {
private final Alert alert;
alert.authenticateUsing(credentials);
}
See also: auth_tests.py
Or by sending keys manually like:
SendKeys("user");
SendKeys("{TAB}");
SendKeys("password");
SendKeys("~"); // Enter
See also the following feature request: #453 Portable BASIC Auth at GitHub
Related:
How to send Basic Authentication headers in Selenium? at QA SE
Add this New Firefox Profile on your code
ProfilesIni profile = new ProfilesIni();
FirefoxProfile myprofile = profile.getProfile("myProjectProfile"); //replace "myProjectProfile" with your profile"
WebDriver driver = new FirefoxDriver(myprofile);
Firefox configuration settings
This works fine without prompting any authentication when you do the following settings..
Type "about:config" on your FF url
Now type "Proxy" in the search field
Make sure "signon.autologin.proxy" is set "true" (By default
it is "false")
Load Default/Custom Chrome Profile to run tests using Selenium
WebDriver
Download chromedriver.exe
Extract the chromedriver_win_26.0.1383.0.zip folder and locate .exe file to C:/ folder
Add this Script on your JAVA code
DesiredCapabilities capability = DesiredCapabilities.chrome();
System.setProperty("webdriver.chrome.driver", "C:/chromedriver.exe");
capability.setCapability("chrome.switches", Arrays.asList("–disable-extensions"));
capability.setCapability("chrome.binary", "C:/Users/user_name/AppData/Local/Google/Chrome/Application/chrome.exe");
ChromeOptions options = new ChromeOptions();
options.addArguments("user-data-dir=C:/Users/user_name/AppData/Local/Google/Chrome/User Data/Default");
driver = new ChromeDriver(capability);
Note: IE doesn't need profile setup to run tests because they run on Server user while Firefox and Chrome works with binary.
If you want to enable the http auth in Internet explorer, you have to edit the registry and add this (create keys if they are not present):
in HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_HTTP_USERNAME_PASSWORD_DISABLE, create a DWORD iexplore.exe with a value of 0
in HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_HTTP_USERNAME_PASSWORD_DISABLE, create a DWORD iexplore.exe with a value of 0
Close and reopen Internet explorer
If you have a x64 IE, the path is a bit different :
HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_HTTP_USERNAME_PASSWORD_DISABLE
There is a solution for performing authentication with Selenium 1.x by manually setting the HTTP headers at http://mogotest.com/blog/2010/06/23/how-to-perform-basic-auth-in-selenium but I don't think this is transferable to Selenium 2, as you don't have access to the headers.
According to the information here 'Basic Authentication support for Selenium 2' was added in Selenium 2 Beta 2 but looking through the source code I can only see it implemented as a way of securing Remote Selenium Servers against anonymous access.
So I think the answer is that BASIC HTTP authentication is not currently supported.
I was not able to use the basic authentication with Selenium 2 and Chrome (Due a bug with Chrome), so I created an extension for Chrome that sends the basic authentication credentials automatically (See https://chrome.google.com/webstore/detail/basic-authentication-auto/dgpgkkfheijbcgjklcbnokoleebmeokn).
Multipass extension of Firefox made automation engineers life easy. Through this, we can handle the basic authentication pop-up in any browser using any programing language. PFB the steps:
Open the Firefox browser and download the plug-in
-> https://addons.mozilla.org/en-US/firefox/addon/multipass/
Now go to the below location to get the XPI file that is the 'multipass' executable file for firefox
-> C:\Users\Your user name\AppData\Roaming\Mozilla\Firefox\Profiles\oleovwxr.extensionUser\extensions
Copy the file 'multipass#gilles.crettenand.info.xpi' from the above directory and past it to your project directory inside any folder of the resource package.
Now use the below code snippet to configure the Firefox driver.
public WebDriver config() {
System.setProperty("webdriver.gecko.driver", "Path to geco driver");
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(CapabilityType.BROWSER_NAME, "firefox");
capabilities.setCapability(CapabilityType.PLATFORM_NAME, "WINDOWS");
capabilities.setCapability("acceptSslCerts", true);
capabilities.setCapability("marionette", true);
FirefoxProfile profile = new FirefoxProfile();
//Give the multipass path
profile.addExtension(new File("c:/your project name/src/main/resources/multipass#gilles.crettenand.info.xpi"));
FirefoxOptions firefoxOptions = new FirefoxOptions();
firefoxOptions.setProfile(profile);
firefoxOptions.merge(capabilities);
return new FirefoxDriver(firefoxOptions);
}
Now the main challenge is to get the UUID of the downloaded multipass extension as whenever we run it changes. So we are taking every time when run.
public void setup() throws InterruptedException {
WebDriver driver = config();
driver.get("about:debugging#/runtime/this-firefox");
Thread.sleep(4000);
String uuid = driver.findElement(By.xpath("//span[#title='MultiPass for HTTP basic authentication']/parent::li/section/dl/div/dt[contains(text(),'UUID')]/parent::div/dd")).getText();
System.out.println("My Url:::" + "moz-extension://" + uuid + "/popin.html");
driver.get("moz-extension://" + uuid + "/popin.html");
//change below URL with your URL and username and password
driver.findElement(By.id("url")).sendKeys("http://mywebsite.com");
driver.findElement(By.id("username")).sendKeys("site user name");
driver.findElement(By.id("password")).sendKeys("site password");
driver.findElement(By.xpath("//button[.='Add']")).click();
//Now change below URL with your url, note:: the domain should math with above multipass url
driver.get("http://mywebsite.com/homeLogin.html");
}
I have tested with the below selenium version selenium-java 4.1.1 and selenium-server 3.141.59.