2012-11-29 80 views
1

我使用硒的webdriver(又名硒2)共享同一个会话,并只保留一个窗口在所有的测试用例,避免每个测试用例创建的新窗口,这样我就可以工作一致的数据在网络上。硒的webdriver跨越测试用例

我做我的搜索,但大部分都是使用Selenium RC,这似乎是非常不同的webdriver(在我不知道如何保持会话ID等)。而且,我正在使用c#..

您能否提供任何简单的示例代码来演示您的想法。对此,我真的非常感激!!

在此先感谢!

回答

4

那么我会分享我目前在我的项目中使用的方法。尝试使用webdriver的静态初始化。希望这会为你做一个技巧。 那么,我的结构很简单: 我有BaseSeleniumTest.java我存储我所有的基本方法。我也有其继承BaseSeleniumTest.java所有方法的其他TestSuite.javaenter image description here

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

所以来结束我的回答基本的解决问题的方法是:

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

     } 

希望这可以帮助你。

+0

似乎非常有益的工作对我来说!我会稍后尝试一下,但这很有意义!谢谢! – jamesdeath123

+0

嗯,只是一个问题,你的情况是什么SeleneseTestBase?你有BaseSeleniumTest扩展它。我假设BaseSeleniumTest是一些其他的东西扩展它的抽象类? – jamesdeath123

+0

好吧,SeleneseTestBase类在com.thoughtworks.selenium(selenium框架类)中提供了一个基类,它为Selenium测试实现了一些方便的功能(您不需要扩展此类)。 该类添加了许多“验证”命令,它们与“断言”命令类似,但它们在失败时不会停止测试。相反,验证错误在tearDown期间全部立即抛出。 详细信息:http://www.jarvana.com/jarvana/view/org/seleniumhq/selenium/selenium-java/2.1.0/selenium-java-2.1.0-javadoc.jar!/com/thoughtworks/硒/ SeleneseTestBase.html –

1

您可以扩展RemoteWebDriver并覆盖startSession方法是这样的:

@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()); 
} 
} 

将这个代码在你的类,你所创建的驱动程序。

+0

嗯,它似乎C#有另一个命名约定startSession和getPreviousSessionIdFromSomeStorage等.. – jamesdeath123

+0

这看起来不错。 – Anirudh

1

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