简体   繁体   中英

Selenium WebDriver to share same session across test cases

I am using Selenium WebDriver (aka 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!

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.

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.

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');

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM