2017-05-22 7 views
1

これは単純なものだと確信していますが、このエラーの原因を解決することはできません。Selenium PageObjectsを使用してロケータオブジェクトをnullにすることはできません

テストに新しいページを追加した時点で、これまで完全に実行されていたセレンページオブジェクトを使用しています。のSearchContext:ここ

はバッチテストが

System.ArgumentExceptionので転倒が(他の人と一緒に)ログインとTest1のテストが完全に実行する私のメインのコード

class RunTest 
{ 

    static IWebDriver driver; 

    [Test] 
    public void Login() 
    { 

     var options = new ChromeOptions(); 

     options.AddArguments("chrome.switches", "--disable-extensions --disable-extensions-file-access-check --disable-extensions-http-throttling --disable-infobars --enable-automation "); 
     options.AddUserProfilePreference("credentials_enable_service", false); 
     options.AddUserProfilePreference("profile.password_manager_enabled", false); 
     driver = new ChromeDriver(options); 

     driver.Url = ConfigurationManager.AppSettings["URL"]; 

     driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10); 

     var loginPage = new LoginPage(driver); 
     loginPage.LoginToApplication("Test1"); 

     IWait<IWebDriver> wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10)); 
     var element = wait.Until(ExpectedConditions.ElementIsVisible(By.XPath("//*[@id='content']/div/div/div/div/ul/li[4]/div[1]/div[2]/div/button[1]"))); 

     var setenv = new SetEnvironment(driver); 
     setenv.SetEnvQA(); 

    } 

    [Test] 
    public void AddBatchTest() 
    { 
     var AddBatch = new Batch(driver); 
     AddBatch.AddNewBatch("Test1"); 
    } 

    [Test] 
    public void Test1() 
    { 
     var NewCli = new AddNewClient(driver); 
     NewCli.Addanewclient("Test1"); 

ですロケータオブジェクトはnullにはできません パラメータ名:ロケータ

バッチクラスのコードとAddNewClie NTクラスので、私は問題が

バッチであるかを見るカント同じです:

namespace OnlineStore.PageObjects 
{ 
    class Batch 
    { 
     IWebDriver driver; 

     //Admin link in left hand otions 
     [FindsBy(How = How.XPath, Using = "//*[@id='ctl00_NavigationPanel_navigationpanel1_hlAdmin']")] 
     public IWebElement AdminScreen { get; set; } 

     //Add new batch link 
     [FindsBy(How = How.XPath, Using = "//*[@id='ctl00_MainBody_HyperLink38']")] 
     public IWebElement AddNewBatchLnk { get; set; } 


     [FindsBy(How = How.XPath, Using = "//*[@id='ctl00_MainBody_DatepickerReceived_txtDate']")] 
     public IWebElement DateReceived { get; set; } 

     [FindsBy(How = How.XPath, Using = "//*[@id='aspnetForm']/div[3]/div/div[2]/div[3]/table[3]/tbody/tr/td/table/tbody/tr[7]/td]")] 
     public IWebElement SelectToday { get; set; } 

     [FindsBy(How = How.XPath, Using = "//*[@id='ctl00_MainBody_txtTotal']")] 
     public IWebElement BatchTotal { get; set; } 

     [FindsBy(How = How.XPath, Using = "//*[@id='ctl00_MainBody_ucCurrency_ddlCurrency']")] 
     public IWebElement Currency { get; set; } 

     [FindsBy(How = How.XPath, Using = "//*[@id='ctl00_MainBody_cboAgency']")] 
     public IWebElement Provider { get; set; } 

     [FindsBy(How = How.XPath, Using = "//*[@id='ctl00_MainBody_txtNote']")] 
     public IWebElement BatchNotes { get; set; } 


     public Batch(IWebDriver driver) 
     { 
      this.driver = driver; 
      PageFactory.InitElements(driver, this); 
     } 

     public void AddNewBatch(string testName) 
     { 
      var userData = ExcelDataAccess.GetTestData(testName); 

      IWait<IWebDriver> wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30.00)); 

      AdminScreen.Click(); 
      wait.Until(ExpectedConditions.ElementIsVisible(By.XPath("//*[@id='ctl00_MainBody_HyperLink38']"))); 

      AddNewBatchLnk.Click(); 
      wait.Until(ExpectedConditions.ElementIsVisible(By.XPath("//*[@id='ctl00_MainBody_DatepickerReceived_txtDate']"))); 

      DateReceived.SendKeys("22/05/2017"); 
      //SelectToday.Click(); 
      BatchTotal.SendKeys("1000"); 
      Currency.SendKeys("USD"); 
      Provider.SendKeys("Client"); 
      BatchNotes.SendKeys("Some Batchg notes here please"); 

     } 
    } 
} 

AddNewClient:

​​

任意のアイデア?

アップデート:AddBatchTestコードをログインコードスクリプトに移動しようとしましたが、正常に実行されましたが、独自のテストに戻したときに再度エラーが発生しました。

コメントで要求されたように完全なスタックトレース。

Result StackTrace: 
at OpenQA.Selenium.Support.PageObjects.PageFactory.InitElements(Object page, IElementLocator locator, IPageObjectMemberDecorator decorator) 
    at OpenQA.Selenium.Support.PageObjects.PageFactory.InitElements(ISearchContext driver, Object page) 
    at OnlineStore.PageObjects.Batch..ctor(IWebDriver driver) in C:\Users\andrew.logan-smith\documents\visual studio 2015\Projects\OnlineStore\OnlineStore\PageObjects\Batch.cs:line 54 
    at OnlineStore.TestCases.RunTest.AddBatchTest() in C:\Users\andrew.logan-smith\documents\visual studio 2015\Projects\OnlineStore\OnlineStore\TestCases\RunTest.cs:line 52 
Result Message: 
System.ArgumentException : The SearchContext of the locator object cannot be null 
Parameter name: locator 
+0

*バッチクラスのコードとAddNewClientクラスは同じですので、問題の内容を確認できません。*明らかに問題があります。 ** all **関連するコードだけでなく、完全なスタックトレースを追加する必要があります。 – Guy

+0

私は確かにどこかに問題があると同意します。スタックトレースを追加しました。私はすでに**関連**のコードをすべて持っていると信じています。残りは単なる要素とセレンのコマンドです – Smithy7876

+0

要素の初期化で 'InitElements'が失敗しました。要素**は関連しています**。メソッドのシグネチャだけをポストすることはおそらく決して役に立たないでしょう。 – Guy

答えて

1

RunTestクラスのTestメソッドの順序は、必ずしもecxution順序ではありません。あなたの場合、注文はおそらくAddBatchTest() - >Login() - >Test1()です。 BatchコンストラクタとPageFactory.InitElementsを呼び出すときには、ロケータオブジェクトのSearchContextはから

InitElements方法nullにすることはできませんSearchContextすなわちdriver引数、それゆえエラー

としてnullを受けdrivernullにさせますgithub

public static void InitElements(ISearchContext driver, object page) 
{ 
    InitElements(page, new DefaultElementLocator(driver)); 
} 

Login()[SetUp]注釈の下に移動し、[TearDown]を追加することをおすすめします。これは、各テストの前と後に実行し、ご提供いたします「白紙の状態」

public class RunTest 
{ 
    private IWebDriver driver = null; 

    [SetUp] 
    public void Login() 
    { 
     driver = new ChromeDriver(options); 
     //... 
    } 

    [Test] 
    public void AddBatchTest() 
    { 
     var AddBatch = new Batch(driver); 
     AddBatch.AddNewBatch("Test1"); 
    } 

    [Test] 
    public void Test1() 
    { 
     var NewCli = new AddNewClient(driver); 
     NewCli.Addanewclient("Test1"); 
    } 

    [TearDown] 
    public void TearDown() 
    { 
     if (Driver != null) 
     { 
      Driver.Quit(); 
     } 
    } 
} 

編集あなたが[TestFixtureSetUp]を使用することができますすべてのテストのためにSetUpTearDown 1時間を実行したい場合は

[TestFixtureTearDown]注釈。また、これはNUnit 3使用[OneTimeSetUp][OneTimeTearDown]ため、NUnit 2用です* [TestFixture]

[TestFixture] 
public class RunTest 
{ 
    [TestFixtureSetUp] 
    public void SetUp() 
    { 
    } 

    [Test] 
    public void AddBatchTest() 
    { 
    } 

    [Test] 
    public void Test1() 
    { 
    } 

    [TestFixtureTearDown] 
    public void TearDown() 
    { 
    } 
} 

クラスを追加する必要があります。

+0

ありがとうございました。それは動作し、最初の問題を解決し、これはベストプラクティスのアプローチだと思います。どのような方法でも、すべてのテストでそれをやり直すことなくこれを書くことができますか?残念なことに、ウェブサイトが書かれている方法(私はコントロールできません)のために、ログインスクリプトは毎回30秒(その2ボタンのクリックと普通のユーザー名とパスワード!)を要します。プロセスはひどい。 – Smithy7876

+0

@ Smithy7876私の回答を更新しました – Guy

+1

ありがとうございました! – Smithy7876

関連する問題