2015-01-07 47 views
0

我有以下的方法在一個文件中PhantomJS及硒 - 測試調用另一個文件中的方法(NullReferenceException異常)

public class Login 
    { 
     static IWebDriver driver; 

      public static void LogIn(string Env, string User) 
      { 
      driver.Navigate().GoToUrl(Env); 
      driver.Manage().Timeouts().SetPageLoadTimeout(TimeSpan.FromSeconds(3000)); 

      driver.FindElement(By.XPath("//*[@ng-model='email']")).SendKeys(User); 
      driver.FindElement(By.XPath("//*[@ng-model='password']")).SendKeys("1234"); 
      driver.FindElement(By.XPath("//*[@id=\"ui-view\"]/div/div/div[1]/form/div[2]/button")).Click(); 

      System.Threading.Thread.Sleep(2000); 

      NUnit.Framework.Assert.IsTrue(driver.FindElement(By.Name("some element")).Displayed, 
       "Login failed, home page did not display"); 
     } 
    } 
} 

並且測試我想打電話從上面的方法,在另一:

[TestFixture] 
    public class SmokeTest 
    { 
     private IWebDriver driver; 

     [SetUp] 
     public void SetUp() 
     { 
      driver = new PhantomJSDriver(); 
     } 

     [Test] 
     public void Test1() 
     { 
      **Login.LogIn("myEnv", "user");** 
     } 
    } 

我沒有問題彙編,但一旦我跑的Test1我得到以下信息:

Automation.SmokeTest.SearchForProduct: System.NullReferenceExc eption:未將對象引用設置爲對象的實例。

Nunit指向Login.LogIn("myEnv", "user");作爲源或錯誤。

任何想法?

Ta。

+0

對不起,adrianbanks,這不是原因。如果其中一個Xpath路徑無效,則會在'未找到元素'的行上生成一個Selenium異常。 – entrup

+0

靜態IWebDriver驅動程序; << NULL在這裏 –

回答

1

簡短的回答

static IWebDriver driver; << NULL here 

朗答案

你應該通過您登錄通過驅動程序,你的[測試]。它應該像

[Test] 
    public void Test1() 
    { 
     var loginPage = new Login(driver);    
     loginpage.LogIn("myEnv", "user");** 
    } 

爲了您的登錄,它可以像下面

public class Login 
{ 
    /// <summary> 
    /// Get or set driver 
    /// </summary> 
    public IWebDriver Driver { get; set; } 

    public Login(IWebDriver driver)   
    { 
     this.Driver = driver; 
    } 

    public static void LogIn(string Env, string User) 
     { 
     Driver.Navigate().GoToUrl(Env); 
     Driver.Manage().Timeouts().SetPageLoadTimeout(TimeSpan.FromSeconds(3000)); 

     Driver.FindElement(By.XPath("//*[@ng-model='email']")).SendKeys(User); 
     Driver.FindElement(By.XPath("//*[@ng-model='password']")).SendKeys("1234"); 
     Driver.FindElement(By.XPath("//*[@id=\"ui-view\"]/div/div/div[1]/form/div[2]/button")).Click(); 

     System.Threading.Thread.Sleep(2000); 

     NUnit.Framework.Assert.IsTrue(Driver.FindElement(By.Name("some element")).Displayed, 
      "Login failed, home page did not display"); 
    } 
} 
+0

沒有阮武晃,不認爲這是答案。即使出於可讀性原因,測試本身應該保持原樣(Login.LogIn(「myEnv」,「user」);)。需要在Login類中更改某些內容,以使測試能夠像現在這樣以完整的OOP方式編寫。 – entrup

+0

一種方法是將登錄方法更改爲如下所示:通過將傳遞驅動程序作爲var添加到public static void LogIn(string Env,string User,IWebDriver driver)。這樣測試保持單線程(Login.LogIn(「myEnv」,「user」);) – entrup

+0

是的,你可以這樣做。但是,通過這種方法,您需要爲您的所有方法添加驅動程序。我的方法可以爲你節省工作。但是,這是您的選擇。 –

0

一種方式的改變將改變這樣的登錄方法外觀:

public static void LogIn(string Env, string User, IWebDriver driver) 

通過添加傳遞驅動程序作爲變種。這樣測試保持單線程

Login.LogIn("myEnv", "user");