PhantomJS& Selenium - 测试从另一个文件调用方法(NullReferenceException)

时间:2015-01-07 00:06:48

标签: c# oop selenium 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.NullReferenceException:未将对象引用设置为对象的实例。

Nunit指向Login.LogIn("myEnv", "user");作为来源或错误。

有什么想法吗?

的Ta。

2 个答案:

答案 0 :(得分: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");
    }
}

答案 1 :(得分:0)

一种方法是将登录方法更改为如下所示:

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

通过添加传递驱动程序作为var。这样测试保持单线

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