2013-04-22 2 views
0

Я пытаюсь инкапсулировать сценарий Selenium, разбивая его на три класса (Grid, Browser и testCase). Я могу открыть браузер, но, похоже, мне не хватает соединения для класса testCase, чтобы вставлять его команды.Как передать объекты между классами

Grid.java

package com.autotrader.grid; 

import org.junit.After; 
import org.junit.Test; 

public class Grid { 
    Browser browser = new Browser(); 
    TestCase testCase = new TestCase(); 

    public Grid() { 
     browser.setUp("http://pbskids.org"); 
    } 

    @Test 
    public void main() { 
     testCase.runCase(); 
    } 

    @After 
    public void tearDown() throws Exception { 
     browser.stop(); 
    } 
} 

Browser.java

package com.autotrader.grid; 

import com.thoughtworks.selenium.Selenium; 
import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.WebDriverBackedSelenium; 
import org.openqa.selenium.firefox.FirefoxDriver; 
import org.openqa.selenium.remote.DesiredCapabilities; 

import java.util.concurrent.TimeUnit; 

public class Browser { 

    private String baseUrl; 
    private String driverNamespace; 
    private String driverLocation; 

    private DesiredCapabilities capabilities; 
    private WebDriver driver; 
    public Selenium selenium; 

    // constructor 
    public Browser() { 

    } 

    public DesiredCapabilities getCapabilities() { 
     return this.capabilities; 
    } 

    public String getDriverLocation() { 
     return this.driverLocation; 
    } 

    public String getDriverNamespace() { 
     return this.driverNamespace; 
    } 

    public Selenium getSelenium(){ 
     return selenium; 
    } 

    public void open (String url) { 
     this.selenium.open(url); 
    } 

    public void setBaseUrl(String url) { 
     this.baseUrl = url; 
    } 

    public void setCapabilities() { 
     this.capabilities = DesiredCapabilities.firefox(); 
     this.driver = new FirefoxDriver(capabilities); 
    } 

    public void setDriverLocation(String location) { 
     this.driverLocation = location; 
    } 

    public void setDriverNamespace(String namespace) { 
     this.driverNamespace = namespace; 
    } 

    public void setSpeed(String speed){ 
     this.selenium.setSpeed(speed); 
    } 

    public void setUp(String url){ 
     setDriverNamespace("webdriver.firefox.driver"); 
     setDriverLocation(System.getenv("ProgramFiles(x86)") + "\\Mozilla Firefox\\firefox.exe"); 
     System.setProperty(driverNamespace,driverLocation); 

     setCapabilities(); 
     setBaseUrl(url); 

     this.selenium = new WebDriverBackedSelenium(driver, url); 
     this.driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); 
    } 

    public void stop(){ 
     this.selenium.stop(); 
    } 
} 

TestCase.java

package com.autotrader.grid; 

import com.thoughtworks.selenium.Selenium; 

public class TestCase { 

    Browser browser = new Browser(); 
    Selenium selenium; 

    // constructor 
    public TestCase(){ 
     selenium = browser.getSelenium(); 
    } 

    public void runCase(){ 
     selenium.open("/privacy/termsofuse.html?campaign=fkhp_tou"); 
     selenium.setSpeed("1000"); 
    } 
} 

Итак, драйвер настроен, затем я открылся с использованием объекта Selenium (в Browser.java), но когда я пытаюсь взаимодействовать с объектом Selenium (в TestCase.java), он не подбирает его. Спасибо за любую помощь.

ответ

0

Вместо:

public class Grid { 
    Browser browser = new Browser(); 
    TestCase testCase = new TestCase(); 

    public Grid() { 
    ... 

Try:

public class Grid { 
    Browser browser = new Browser(); 
    TestCase testCase = new TestCase(browser); // <-- this line changed 

    public Grid() { 
    ... 

И здесь:

public class TestCase { 

    Browser browser = new Browser(); 
    Selenium selenium; 

    // constructor 
    public TestCase(){ 
     selenium = browser.getSelenium(); 
    } 
    ... 

Делай так:

public class TestCase { 

    Browser browser = new Browser();    // <-- this line changed 
    Selenium selenium; 

    // constructor 
    public TestCase(Browser browser){   // <-- this line changed 
     this.browser = browser;     // <-- this line was added 
     selenium = browser.getSelenium(); 
    } 
    ... 
+0

Спасибо. Это сделал трюк. Единственное, что я делал иначе: объявить TestCase в главной функции Grid.class. Я заметил, что если я объявлю это вне, тогда у объекта браузера не будут все значения, привязанные к setUp(). – fergatron

0

Я не вижу, что вы когда-либо инициализировали свой объект Selenium, за исключением метода setUp(String url) в браузере. И этот метод также не называется здесь.

Вы также опубликовали объект Selenium вашего браузера, поэтому вам не нужно объявлять другой объект Selenium в TestCase, назначенный методом accessor - вы можете просто ссылаться на него из объекта Browser объекта TestCase.

+0

Первоначально я сделал это публично, чтобы просто использовать его по классам, но я никогда не понял, как правильно его применять. Я вернул его в личку. – fergatron

Смежные вопросы