Reputation: 4606
I am using Selenium WebDriver (a.k.a Selenium 2), and want to keep only one window across all test cases and avoid the new windows created by each test cases, so that I can work on consistent data on the web.
I've done my search but most of them are using Selenium RC, which appears to be very different from WebDriver (in that I don't know how to keep session ID etc.). And also, I am using c#..
Could you please provide any easy sample code to demonstrate your thoughts. I really appreciate it!!
Thanks in advance!
Upvotes: 1
Views: 18082
Reputation: 119
CREDIS: Can't save the session of Whatsapp web with Selenium c#
public static IWebDriver OpenNewChrome(string FolderPathToStoreSession)
{
ChromeOptions options = null;
ChromeDriver driver = null;
try
{
//chrome process id
int ProcessId = -1;
//time to wait until open chrome
//var TimeToWait = TimeSpan.FromMinutes(TimeToWaitInMinutes);
ChromeDriverService cService =
ChromeDriverService.CreateDefaultService();
//hide dos screen
cService.HideCommandPromptWindow = true;
options = new ChromeOptions();
//options.AddArguments("chrome.switches", "--disable-extensions");
//session file directory
options.AddArgument("--user-data-dir=" + FolderPathToStoreSession);
driver = new ChromeDriver(cService, options);
//set process id of chrome
ProcessId = cService.ProcessId;
return driver;
}
catch (Exception ex)
{
if (driver != null)
{
driver.Close();
driver.Quit();
driver.Dispose();
}
driver = null;
throw ex;
}
}
public static IWebDriver OpenOldChrome(string FolderPathToStoreSession)
{
ChromeOptions options = null;
ChromeDriver driver = null;
try
{
//chrome process id
int ProcessId = -1;
//time to wait until open chrome
//var TimeToWait = TimeSpan.FromMinutes(TimeToWaitInMinutes);
ChromeDriverService cService = ChromeDriverService.CreateDefaultService();
//hide dos screen
cService.HideCommandPromptWindow = true;
options = new ChromeOptions();
//session file directory
options.AddArgument("--user-data-dir=" + FolderPathToStoreSession);
//options.AddArgument("--no-sandbox");
//options.AddArgument("--headless=new");
//Add EditThisCookie Extension
//options.AddArguments("chrome.switches", "--disable-extensions");
//options.AddExtensions("\\ChromeExtensions\\editthiscookie.crx");
driver = new ChromeDriver(cService, options);
//set process id of chrome
ProcessId = cService.ProcessId;
return driver;
}
catch (Exception ex)
{
if (driver != null)
{
driver.Close();
driver.Quit();
driver.Dispose();
}
driver = null;
throw ex;
}
}
PS. If you doesn't want Chrome Extensions to be installed or saved uncomment this option:
options.AddArguments("chrome.switches", "--disable-extensions");
Upvotes: 0
Reputation: 5292
This worked for me in webdriver.io
var webdriverio = require('webdriverjs-angular');
var options = {
desiredCapabilities: {
browserName: 'firefox'
},
ngRoot: 'html' // main application selector
};
var wd = webdriverio.remote(options).init();
var wd2 = webdriverio.remote(options);
wd2.requestHandler.sessionID=wd.requestHandler.sessionID
wd2.url('http://www.seamless.com');
Upvotes: 1
Reputation: 4621
You can extend RemoteWebDriver and override startSession method like this:
@Override
protected void startSession(Capabilities desiredCapabilities) {
String sid = getPreviousSessionIdFromSomeStorage();
if (sid != null) {
setSessionId(sid);
try {
getCurrentUrl();
} catch (WebDriverException e) {
// session is not valid
sid = null;
}
}
if (sid == null) {
super.startSession(desiredCapabilities);
saveSessionIdToSomeStorage(getSessionId().toString());
}
}
Put this code in your class where you are creating the driver.
Upvotes: 1
Reputation: 7339
well I'd share approach I currently use on my project. Try using static initialization of webdriver. Hope this will do a trick for you.
Well, my structure is quite simple:
I've got BaseSeleniumTest.java
where I store all my basic methods. Also I have other TestSuite.java
which inherit all methods from BaseSeleniumTest.java
:
BaseSeleniumTest.java:
package simulator.selenium;
import com.google.common.base.Function;
import com.thoughtworks.selenium.SeleneseTestBase;
import org.apache.commons.lang.RandomStringUtils;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.openqa.selenium.*;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.openqa.selenium.support.ui.FluentWait;
import org.openqa.selenium.support.ui.Wait;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
import org.springframework.core.io.support.PropertiesLoaderUtils;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Properties;
import java.util.concurrent.TimeUnit;
public class BaseSeleniumTest extends SeleneseTestBase {
static WebDriver driver;
private static Logger log = LoggerFactory.getLogger(BaseSeleniumTest.class);
private String loginBaseUrl;
@BeforeClass
public static void firefoxSetUp() throws MalformedURLException {
DesiredCapabilities capability = DesiredCapabilities.firefox();
driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
driver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);
driver.manage().window().setSize(new Dimension(1920, 1080));
}
@Before
public void homePageRefresh() throws IOException {
driver.manage().deleteAllCookies();
driver.get(propertyKeysLoader("login.base.url"));
}
@AfterClass
public static void closeFirefox(){
driver.quit();
}
public WebElement findElementByXpath(String key) throws IOException {
int i=0;
while(!isElementPresent(By.xpath(propertyKeysLoader(key))) && i<5){
driver.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS);
i++;
}
return fluentWait(By.xpath(propertyKeysLoader(key)));
}
public WebElement findElementByCssSelector(String key) throws IOException {
int i=0;
while(!isElementPresent(By.cssSelector(propertyKeysLoader(key))) && i<5){
driver.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS);
i++;
}
}
public void locatorFindingHandling(String key) throws IOException /*throws IOException*/ {
fluentWait(By.cssSelector(propertyKeysLoader(key))).click();
}
public void locatorFindingHandling(String key, String key1) throws IOException {
driver.findElement(By.xpath(propertyKeysLoader(key))).sendKeys(propertyKeysLoader(key1));
}
public String propertyKeysLoader(String key) throws IOException {
Properties props = PropertiesLoaderUtils.loadAllProperties("selenium-config.properties");
PropertyPlaceholderConfigurer props2 = new PropertyPlaceholderConfigurer();
props2.setProperties(props);
return (String)props.get(key) ;
}
public WebElement fluentWait(final By locator){
Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
.withTimeout(30, TimeUnit.SECONDS)
.pollingEvery(5, TimeUnit.SECONDS)
.ignoring(org.openqa.selenium.NoSuchElementException.class);
WebElement foo = wait.until(
new Function<WebDriver, WebElement>() {
public WebElement apply(WebDriver driver) {
return driver.findElement(locator);
}
}
);
return foo; } ;
public boolean isElementPresent(By selector)
{
return driver.findElements(selector).size()>0;
}
public boolean isElementVisible(By selector){
return driver.findElement(selector).isDisplayed();
}
public void jsDirectClickUsingDOM_GEBi(String key) throws IOException {
JavascriptExecutor js = (JavascriptExecutor) driver;
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("document.getElementById(\'"+propertyKeysLoader(key) +"\').click();");
js.executeScript(stringBuilder.toString());
}
public void jsCodeExecution(String jsCode){
JavascriptExecutor js = (JavascriptExecutor)driver;
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(jsCode);
js.executeScript(stringBuilder.toString());
}
public void jsDirectClickUsingDOM_GEBTagName(String tagName,int argNum) throws IOException {
JavascriptExecutor js = (JavascriptExecutor) driver;
StringBuilder stringBuilder = new StringBuilder();
// stringBuilder.append("document.getElementsByClassName(\'"+propertyKeysLoader(key) +"\')["+argArrNum+"].click();");
// stringBuilder.append("document.getElementsByTagName(\'"+tagName+"\')[document.getElementsByTagName('div').length-"+argNum+"].click()");
stringBuilder.append("document.getElementsByTagName(\'"+tagName+"\')[document.getElementsByTagName(\'"+tagName+"\').length-"+argNum+"].click()");
js.executeScript(stringBuilder.toString());
}
public String jsGetColor(String css){
JavascriptExecutor js = (JavascriptExecutor) driver;
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("var x=$(\'"+css+"\');");
stringBuilder.append("return x.css('color')");
String res= (String) js.executeScript(stringBuilder.toString());
return res;
}
public String randomStringGenerator(){
return RandomStringUtils.randomAlphabetic(8);
}
public String randomIntSequenceGenerator(){
return RandomStringUtils.randomNumeric(6);
}
}
So to conclude my answer basic solution to your problem is :
static WebDriver driver;
private String loginBaseUrl;
@BeforeClass
public static void firefoxSetUp() throws MalformedURLException {
DesiredCapabilities capability = DesiredCapabilities.firefox();
driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
driver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);
driver.manage().window().setSize(new Dimension(1920, 1080));
}
@Before
public void homePageRefresh() throws IOException {
driver.manage().deleteAllCookies();
driver.get(propertyKeysLoader("login.base.url"));
}
@AfterClass
public static void closeFirefox(){
driver.quit();
}
Hope this helps you.
Upvotes: 4