Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Selenium 如何将方法从子类继承到父类?_Selenium_Selenium Webdriver_Inheritance_C# 4.0 - Fatal编程技术网

Selenium 如何将方法从子类继承到父类?

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

我有一个父类,它初始化了我使用Selenium和c#自动打开的网站。因此,所有子方法(单独的类文件)都继承父方法来启动网站和配置应用程序。在父类中,我想调用一个方法multipleADvehicle()来自子类。我该怎么做呢。下面是我要调用的父类和子方法的代码:

        [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();

解决这个问题不需要在父类中实例化子类。挑战在于,子类知道如何添加车辆,并且需要以定制的方式进行添加。父类应该仍然没有这种知识。仅仅在父类中初始化一个具体类型就意味着父类必须决定实现,这打破了子类的抽象。