C# 定位器对象的SearchContext不能为空
我已经在这么多论坛上查看了许多类似的问题,但与我的问题并不完全相同。另外,我不想将我的登录方法移动到base 代码: LoginTest.csC# 定位器对象的SearchContext不能为空,c#,selenium-webdriver,nunit,C#,Selenium Webdriver,Nunit,我已经在这么多论坛上查看了许多类似的问题,但与我的问题并不完全相同。另外,我不想将我的登录方法移动到base 代码: LoginTest.cs using test_TestAutomation.PageObjects; using NUnit.Framework; namespace test_TestAutomation.TestClasses { class LoginTet { // public IWebDriver driver;
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();
}
}
}
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();
}
}
}
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("emailtest@gmail.com");
LoginPasswordTxtLocator.SendKeys("xxxxxxx");
BtnLogin.Click();
return this;
}
}
}
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();
}
}
}
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();
}
}
}
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("emailtest@gmail.com");
LoginPasswordTxtLocator.SendKeys("xxxxxxx");
BtnLogin.Click();
return this;
}
}
}
Base.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();
}
}
}
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();
}
}
}
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("emailtest@gmail.com");
LoginPasswordTxtLocator.SendKeys("xxxxxxx");
BtnLogin.Click();
return this;
}
}
}
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();
}
}
}
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();
}
}
}
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("emailtest@gmail.com");
LoginPasswordTxtLocator.SendKeys("xxxxxxx");
BtnLogin.Click();
return this;
}
}
}
LoginPage.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();
}
}
}
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();
}
}
}
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("emailtest@gmail.com");
LoginPasswordTxtLocator.SendKeys("xxxxxxx");
BtnLogin.Click();
return this;
}
}
}
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();
}
}
}
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();
}
}
}
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("emailtest@gmail.com");
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)
我建议您将测试
OpenURL
从Base
提取到LoginTest
,并且只在Base中进行设置和拆卸。然后让LoginTest
从Base
继承
Base.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();
}
}
}
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();
}
}
}
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("emailtest@gmail.com");
LoginPasswordTxtLocator.SendKeys("xxxxxxx");
BtnLogin.Click();
return this;
}
}
}
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();
}
}
}
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();
}
}
}
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("emailtest@gmail.com");
LoginPasswordTxtLocator.SendKeys("xxxxxxx");
BtnLogin.Click();
return this;
}
}
}
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();
}
}
}
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();
}
}
}
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("emailtest@gmail.com");
LoginPasswordTxtLocator.SendKeys("xxxxxxx");
BtnLogin.Click();
return this;
}
}
}
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();
}
}
}
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();
}
}
}
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("emailtest@gmail.com");
LoginPasswordTxtLocator.SendKeys("xxxxxxx");
BtnLogin.Click();
return this;
}
}
}
LoginPage.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();
}
}
}
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();
}
}
}
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("emailtest@gmail.com");
LoginPasswordTxtLocator.SendKeys("xxxxxxx");
BtnLogin.Click();
return this;
}
}
}
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();
}
}
}
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();
}
}
}
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("emailtest@gmail.com");
LoginPasswordTxtLocator.SendKeys("xxxxxxx");
BtnLogin.Click();
return this;
}
}
}
您案例中的SearchContext指的是驱动程序实例。这仍然是null,因为它在从未调用的Base构造函数中实例化。如果创建的对象Base@Grasshopper-相反,如果我扩大基地怎么办?这样行吗?应该行。我对c#知之甚少,但猜测静态构造函数也可以。