Selenium 如何将方法从子类继承到父类?
我有一个父类,它初始化了我使用Selenium和c#自动打开的网站。因此,所有子方法(单独的类文件)都继承父方法来启动网站和配置应用程序。在父类中,我想调用一个方法multipleADvehicle()来自子类。我该怎么做呢。下面是我要调用的父类和子方法的代码:Selenium 如何将方法从子类继承到父类?,selenium,selenium-webdriver,inheritance,c#-4.0,Selenium,Selenium Webdriver,Inheritance,C# 4.0,我有一个父类,它初始化了我使用Selenium和c#自动打开的网站。因此,所有子方法(单独的类文件)都继承父方法来启动网站和配置应用程序。在父类中,我想调用一个方法multipleADvehicle()来自子类。我该怎么做呢。下面是我要调用的父类和子方法的代码: [TestInitialize] public void BaseTestInit() { // create chrome driver
[TestInitialize]
public void BaseTestInit()
{
// create chrome driver
driver = new ChromeDriver(".");
driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(45);
driver.Manage().Window.Maximize();
// create class for commonly used components / functions
objCommon = new clsCommon(driver);
_userSetRepo = new UserSetttingsRep(driver);
LoginAndSelectAutomationFleet();
}
public void LoginAndSelectAutomationFleet()
{
// login the user
objCommon.loginVT(driver);
System.Threading.Thread.Sleep(3000);
Actions builder = new Actions(driver);
builder.MoveToElement(_userSetRepo.userIcon).Click().Build().Perform(); //Hover on System
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementIsVisible(By.XPath(UserSetttingsRep.InputOrganisationSelector)));
objCommon.SendKeysAndClickTab(_userSetRepo.inputOrgansiation, "M-Powered Automation", driver);
wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.InvisibilityOfElementLocated(By.XPath(UserSetttingsRep.InputOrganisationSelector)));
}
public void GenerationTestData()
{
//First data that is needed is vehicle management data
//Add multiple vehicles and add unassigned devices and unassigned drivers
**MultipleAddVehicle();**
}
[TestCleanup]
public void TestCleanUp()
{
driver.Quit();
objCommon.ValidateResult();
}
}
}
我想通过在父类中创建方法,从父类中的其他类调用子方法:
public void MultipleAddVehicle()
{
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
Actions builder = new Actions(driver);
builder.MoveToElement(_regRep.SystemIcon).Click().Build().Perform(); //Hower on System }
System.Threading.Thread.Sleep(8000);
_vechRep.VehicleMgmtLink.Click();
string[] array = { "AK12 OLX", "FN53 KTO", "OU03 TGX", "BF14 YDS" };
// Loop with foreach and write colors with string interpolation.
foreach (string VRN in array)
{
//_vechRep.SearchVehicle.Click();
System.Threading.Thread.Sleep(5000);
_vechRep.AddNewVehicle.Click();
_vechRep.VRNSearch.SendKeys(VRN);
_vechRep.FindVehicle.Click();
System.Threading.Thread.Sleep(2000);
_vechRep.VehicleTypeOption.SendKeys("Car");
_vechRep.VehicleTypeOption.SendKeys(Keys.Tab);
System.Threading.Thread.Sleep(1000);
_vechRep.VehicleColor.SendKeys("Red");
_vechRep.btnAddVehicle.Click();
System.Threading.Thread.Sleep(2000);
try
{
if (_vechRep.VehicleAddSuccessMsg.Displayed)
{
Console.WriteLine("Vehicle is successfuly added");
}
}
catch
{
Console.WriteLine("Vehicle is NOT added");
Assert.Fail();
}
}
}
这就是我试图在父类中创建和使用mthod的方法
public void GenerationTestData()
{
//First data that is needed is vehicle management data
//Add multiple vehicles and add unassigned devices and unassigned drivers
**MultipleAddVehicle();**
我发现它在当前上下文中不存在在父类中将
multipleadvehicle
定义为抽象方法,并在子类中重写它。这将要求您将父类定义为抽象类:
公共抽象类父类
{
公共摘要无效多头文件();
[测试初始化]
public void BaseTestInit()
{
// ...
}
public void login和selectAutomationFleet()
{
// ...
}
public void GenerationTestData()
{
//首先需要的数据是车辆管理数据
//添加多辆车并添加未分配的设备和未分配的驾驶员
多头车辆();
}
}
公共类子级:父级
{
公共覆盖无效多线程车辆()
{
// ...
}
}
这就是老式的面向对象编程。这里没有魔法
这非常类似于。子类可以看到父类的所有成员,但是父类不能看到子类的所有成员,除非它可以访问子类对象。若子类不是静态类,那个么必须创建子类的实例,并将其引用放入父类中。如果所有类都在同一名称空间中,它们将彼此可见
public class ParentClass
{
.................................
public ChildClass childclassinstance;
public void GenerationTestData()
{
//First data that is needed is vehicle management data
//Add multiple vehicles and add unassigned devices and unassigned drivers
childclassinstance.MultipleAddVehicle();
}
}
public class ChildClass : ParentClass
{
public void MultipleAddVehicle()
{
}
}
当然,在调用childclassinstance对象的方法之前,需要初始化它。如果您不关心这个特定的对象值,只想调用一个void方法,那么您可以在默认构造函数中从父类执行此操作
public ChildClass childclassinstance = new ChildClass();
或者,如果它是在测试期间创建的,则可以从子类初始化它
childclassinstance = this;
或者您可以创建multipleadvehicle();一个静态方法,所以您不需要创建对象,只需从类类型调用它
ChildClass.MultipleAddVehicle();
解决这个问题不需要在父类中实例化子类。挑战在于,子类知道如何添加车辆,并且需要以定制的方式进行添加。父类应该仍然没有这种知识。仅仅在父类中初始化一个具体类型就意味着父类必须决定实现,这打破了子类的抽象。