1

我正在使用 Selenium WebDriver(又名 Selenium 2),并且希望在所有测试用例中只保留一个窗口,并避免每个测试用例创建的新窗口,以便我可以处理网络上的一致数据。

我已经完成了搜索,但他们中的大多数都在使用 Selenium RC,这似乎与 WebDriver 非常不同(因为我不知道如何保留会话 ID 等)。而且,我正在使用 c#..

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

提前致谢!

4

3 回答 3

4

好吧,我会分享我目前在我的项目中使用的方法。尝试使用 webdriver 的静态初始化。希望这会对你有所帮助。嗯,我的结构很简单:我有BaseSeleniumTest.java我存储所有基本方法的地方。我还有其他TestSuite.java继承所有方法的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);
    }
}

因此,总结一下我对您问题的基本解决方案是:

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

        }

希望这对您有所帮助。

于 2012-11-29T20:19:39.510 回答
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());
}
}

将此代码放在创建驱动程序的类中。

于 2012-11-30T05:25:04.443 回答
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');
于 2016-01-31T23:08:37.697 回答