2015-12-20 2 views
1

Я перегруппировал свои файлы классов и переменную Webdriver, чтобы я мог использовать Context Injection для совместного использования переменной Webdriver между шагами. До того, как я использовал SetupFixture, Setup и TearDown, что неверно для BDD. Попытка Контекстное Injection теперь с BeforeAllTests, BeforeTestRun и т.д. Я получаю сообщение об ошибке:BDD Specflow Ссылка на объект не установлена ​​в экземпляр объекта в ObjectContainer.RegisterInstanceAs

System.NullReferenceException: Object reference not set to an instance of an object 

линия выделена, где ошибка здесь:

[BeforeScenario] 
     public void RunBeforeScenario() 
     { 
      objectContainer.RegisterInstanceAs<SeleniumContext>(seleniumContext); 
     } 

Моя реализация setup.cs является:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using TechTalk.SpecFlow; 
using OpenQA.Selenium; 
using OpenQA.Selenium.Support.PageObjects; 
using OpenQA.Selenium.Firefox; 
using SearchTest.Setup; 
using BoDi; 
using SearchTest.WebDriver; 


namespace SearchTest.Setup 
{ 
    [Binding] 
    public class BeforeAllTests 
    { 
     private readonly IObjectContainer objectContainer; 
     private static SeleniumContext seleniumContext; 

     public BeforeAllTests(IObjectContainer container) 
     { 
      this.objectContainer = objectContainer; 
     } 

     [BeforeTestRun] 
     public static void RunBeforeAllTests() 
     { 
      seleniumContext = new SeleniumContext(); 
     } 

     [BeforeScenario] 
     public void RunBeforeScenario() 
     { 
      objectContainer.RegisterInstanceAs<SeleniumContext>(seleniumContext); 
     } 
    } 
} 

My HomePage класс HomePage.cs реализация:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using OpenQA.Selenium; 
using OpenQA.Selenium.Support.PageObjects; 
using OpenQA.Selenium.Firefox; 
using NUnit.Framework; 
using SearchTest.Setup; 
using SearchTest.WebDriver; 
using TechTalk.SpecFlow; 
using BoDi; 


namespace SearchTest.PageObjects 
{ 
    [Binding] 
    public class HomePage : PageObjectBase 
    { 
     private SeleniumContext seleniumContext; 
     //private IWebDriver driver{ get; set; } 

     [FindsBy(How = How.XPath, Using = ".//TITLE")] 
     public IWebElement Title{ get; set; } 

     // search text field on the homepage 
     //[FindsBy(How= How.Id, Using="twotabsearchtextbox")] 
     //private IWebElement Searchfield_ID { get; set; } 

     [FindsBy(How = How.XPath, Using = ".//*[@id='twotabsearchtextbox']")] 
     private IWebElement Searchfield_XPATH { get; set; } 

     [FindsBy(How = How.Id, Using = "nav-search-submit-text")] 
     private IWebElement SearchButton { get; set; } 

     [FindsBy(How = How.XPath, Using = ".//*[@id='nav-search']/form/div[2]/div/input")] 
     private IWebElement searchButton_Xpath {get; set;} 

//  public HomePage(IWebDriver driver) 
     public HomePage(SeleniumContext seleniumContext) 
      /*This is to reference the PageObjectBase Class. Passing in the Title of the 
      * page that is expected for the HomePage to ensure the correct Page is loaded 
      * before starting any tests. 
      */ 
      //: base("Amazon.co.uk: Low Prices in Electronics, Books, Sports Equipment & more") 
      : base(seleniumContext) 


     { 
      //driver = new FirefoxDriver(); 
      //Console.Out.WriteLine("from Homepage Constructor Driver.title in SearchResultsPage class = " + driver.Title); 
      //driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(5)); // Set implicit wait timeouts to 5 secs 
      //PageFactory.InitElements(driver, this); 
      this.seleniumContext = seleniumContext; 
      PageFactory.InitElements(seleniumContext.driver, this); 
     } 

    public void goToURL() { 
     //driver.Navigate().GoToUrl("http://www.amazon.co.uk"); 
    } 

    public void EnterSearchText(String text) 
     { 
      Searchfield_XPATH.SendKeys(text); 
     } 

    public SearchResultsPage click_search_button() { 
     searchButton_Xpath.Click(); 
     return new SearchResultsPage(seleniumContext); 
    } 
    } 
} 

Этапы реализации SearchSteps.cs класс:

using System; 
using TechTalk.SpecFlow; 
using OpenQA.Selenium; 
using OpenQA.Selenium.Firefox; 
using NUnit.Framework; 
using SearchTest.PageObjects; 
using SearchTest.WebDriver; 

namespace SearchTest 
{ 
    [Binding] 
    public class SearchSteps 
    { 
     private SeleniumContext seleniumContext; 
     private IWebDriver driver { get; set; } 
     PageObjects.HomePage home_page { get; set; } 
     private SearchResultsPage search_results_page; 

    [Given(@"I navigate to the page ""(.*)""")] 
    public void GivenINavigateToThePage(string p0) 
     home_page = new PageObjects.HomePage(seleniumContext); 
     //home_page.goToURL(); 
    } 

    [Given(@"I see the page is loaded")] 
    public void GivenISeeThePageIsLoaded() 
    { 
     //Assert.AreEqual("http://localhost:8080: PS4 products", driver.Title); 

    } 

    [When(@"I enter Search Keyword in the Search Text box")] 
    public void WhenIEnterSearchKeywordInTheSearchTextBox(Table table) 
    { 
     //string search_text = table.Rows[0]["Keyword"].ToString(); 
     //driver.FindElement(By.Id("twotabsearchtextbox")).SendKeys(search_text); 
     //SearchResultsPage SearchResultsPage = home_page.EnterSearchText("F1"); 
     home_page.EnterSearchText("F1"); 
    } 

    [When(@"I click on Search Button")] 
    public void WhenIClickOnSearchButton() 
    { 
     //driver.FindElement(By.Name("BtnG")).Click(); 
     search_results_page = home_page.click_search_button(); 
    } 

    [Then(@"Search items shows the items related to PS4")] 
    public void ThenSearchItemsShowsTheItemsRelatedToPS4() 
    { 
     //Assert.AreEqual("PS4", driver.FindElement(By.XPath(".//*[@id='desktop-auto-sparkle-multi']/div/a")).Text); 
     //Assert.AreEqual("PS4", driver.FindElement(By.XPath("//h2[contains(text(), "PS4")]"))); 
     search_results_page.get_search_result_title(); 
    } 
    } 
} 

Как решить эту проблему, пожалуйста? Я думаю, что он жалуется, что objectContainer.RegisterInstanceAs не имеет никакого значения, это Null. Он не был создан?

Спасибо, Riaz

+0

http://stackoverflow.com/q/4660142/447156 –

+0

Я слежу за примером из ответа из другого сообщения. Аналогичным образом я написал beforescenario. Это должно работать для меня, но это не так. Ответ имеет 5 голосов и зеленый тик. http://stackoverflow.com/questions/26392380/nunit-specflow-how-to-share-a-class-instance-for-all-tests/26402692#comment50937280_26402692 –

ответ

1

ваша проблема в том, что у вас есть опечатка в конструкторе. Это:

public BeforeAllTests(IObjectContainer container) 
{ 
    this.objectContainer = objectContainer; 
} 

должен быть

public BeforeAllTests(IObjectContainer container) 
{ 
    this.objectContainer = container; 
} 

вы не используете container экземпляр заданного в конструкторе, вы просто установив objectContainer к себе.

+0

У меня есть, я вижу опечатку сейчас. Спасибо. –