2017-09-25 4 views
0

많은 포럼에서 비슷한 문제를 이미 확인했습니다.하지만 내 것과 정확하게 유사하지는 않습니다. 또한 로그인 방법을 기본으로 옮기고 싶지 않습니다.로케이터 객체의 SearchContext는 null이 될 수 없습니다.

코드 :

LoginTest.cs

using test_TestAutomation.PageObjects; 
using NUnit.Framework;  

namespace test_TestAutomation.TestClasses 
{  
    class LoginTet 
    { 
     // public IWebDriver driver; 

     [Test] 
     public void LoginSuccessCheck() 
     {  
      LoginPage login = new LoginPage(); 
      login.LoginSuccess();  
     } 
    } 
} 

Base.cs

using OpenQA.Selenium; 
using OpenQA.Selenium.Chrome; 
using NUnit.Framework; 

namespace test_TestAutomation.TestClasses 
{ 
    class Base 
    {  
     public static IWebDriver driver;  
     [SetUp] 
     public void SetUp() 
     { 
      driver = new ChromeDriver(); 
      driver.Manage().Window.Maximize();          
     } 

     [Test] 
     public void OpenURL() 
     { 
      driver.Navigate().GoToUrl("http://www.example.com");  
     }  

     [TearDown]  
     public void TearDown() 
     { 
      driver.Close(); 

     } 
    } 
} 

LoginPage.cs

using OpenQA.Selenium; 
using OpenQA.Selenium.Support.PageObjects; 
using test_TestAutomation.TestClasses; 
namespace test_TestAutomation.PageObjects 
{   
    public class LoginPage 
    {  
     [FindsBy(How = How.Id, Using = "Email")] 
     public IWebElement LoginEmailTxtLocator; 

     [FindsBy(How = How.Id, Using = "Password")] 
     public IWebElement LoginPasswordTxtLocator; 

     [FindsBy(How = How.CssSelector, Using = "#loginForm > div > div > form > div:nth-child(5) > div > input")] 
     private IWebElement BtnLogin;  

     public LoginPage() 
     {  
      PageFactory.InitElements(Base.driver, this); 
     } 

     public LoginPage LoginSuccess() 
     {    
      LoginEmailTxtLocator.SendKeys("[email protected]"); 
      LoginPasswordTxtLocator.SendKeys("xxxxxxx"); 
      BtnLogin.Click(); 
      return this; 
     }  
    } 
} 

예외 :

결과 메시지 : System.ArgumentException이 : 로케이터 개체의 SearchContext이 될 수 없다 널

Stackstace :

at OpenQA.Selenium.Support.PageObjects.PageFactory.InitElements(Object page, IElementLocator locator, IPageObjectMemberDecorator decorator) 
at OpenQA.Selenium.Support.PageObjects.PageFactory.InitElements(ISearchContext driver, Object page) 
+0

SearchContext는 드라이버 인스턴스를 나타냅니다. 이것은 결코 호출되지 않는 Base의 생성자에서 으로 인스턴스화되는 null입니다. Base – Grasshopper

+0

@Grasshopper의 객체를 만드는 경우 작동해야합니다 - 그 대신에 내가 기지를 확장한다면? 그게 효과가 있니? –

+0

이 작동해야합니다. C#에 대해 많이 알지 못하지만 정적 생성자를 추측해도 작동합니다. – Grasshopper

답변

1

나는 당신이를 추출하는 것이 좋습니다 OpenURLBase에서 LoginTest까지 테스트하고 설정 만하면됩니다. 베이스에 n. 그런 다음 이 Base에서 상속 받도록하십시오.

Base.cs

using OpenQA.Selenium; 
using OpenQA.Selenium.Chrome; 
using NUnit.Framework; 

namespace test_TestAutomation.TestClasses 
{ 
    public class Base 
    { 
     public static IWebDriver driver; 

     [SetUp] 
     public void SetUp() 
     { 
      driver = new ChromeDriver(); 
      driver.Manage().Window.Maximize(); 
     } 

     [TearDown] 
     public void TearDown() 
     { 
      driver.Close(); 
     } 
    } 
} 

LoginTest.cs

using test_TestAutomation.PageObjects; 
using NUnit.Framework; 

namespace test_TestAutomation.TestClasses 
{ 
    class LoginTest : Base 
    { 
     [Test] 
     public void OpenURL() 
     { 
      driver.Navigate().GoToUrl("http://www.example.com"); 
     } 

     [Test] 
     public void LoginSuccessCheck() 
     { 
      driver.Navigate().GoToUrl("http://www.example.com"); 
      LoginPage login = new LoginPage(); 
      login.LoginSuccess(); 
     } 
    } 
} 

LoginPage.cs 귀하의 경우

using OpenQA.Selenium; 
using OpenQA.Selenium.Support.PageObjects; 
using test_TestAutomation.TestClasses; 

namespace test_TestAutomation.PageObjects 
{ 
    public class LoginPage 
    { 
     [FindsBy(How = How.Id, Using = "Email")] 
     public IWebElement LoginEmailTxtLocator; 

     [FindsBy(How = How.Id, Using = "Password")] 
     public IWebElement LoginPasswordTxtLocator; 

     [FindsBy(How = How.CssSelector, Using = "#loginForm > div > div > form > div:nth-child(5) > div > input")] 
     private IWebElement BtnLogin; 

     public LoginPage() 
     { 
      PageFactory.InitElements(Base.driver, this); 
     } 

     public LoginPage LoginSuccess() 
     { 
      LoginEmailTxtLocator.SendKeys("[email protected]"); 
      LoginPasswordTxtLocator.SendKeys("xxxxxxx"); 
      BtnLogin.Click(); 
      return this; 
     } 
    } 
}