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
硒C#Don';我不想继续创建FireFoxDriver的新实例_C#_Selenium_Selenium Webdriver_Instance_Specflow - Fatal编程技术网

硒C#Don';我不想继续创建FireFoxDriver的新实例

硒C#Don';我不想继续创建FireFoxDriver的新实例,c#,selenium,selenium-webdriver,instance,specflow,C#,Selenium,Selenium Webdriver,Instance,Specflow,我目前正在尝试为一个网站创建一些自动化测试,我有一个问题,那就是每当我调用我的基类时,它就会创建一个FirefoxDriver的新实例。因此,每当我在步骤中调用一个继承基类的页面时,它都会加载一个新的驱动程序实例,这样它就不再在以前的驱动程序上自动运行 namespace RAA_AutomationTests { using OpenQA.Selenium.Firefox; public abstract class BasePage { protec

我目前正在尝试为一个网站创建一些自动化测试,我有一个问题,那就是每当我调用我的基类时,它就会创建一个FirefoxDriver的新实例。因此,每当我在步骤中调用一个继承基类的页面时,它都会加载一个新的驱动程序实例,这样它就不再在以前的驱动程序上自动运行

namespace RAA_AutomationTests
{
    using OpenQA.Selenium.Firefox;

    public abstract class BasePage
    {
        protected static IWebDriver driver;

        protected BasePage()
        {
            //cant keep creating a new driver need to change this
            driver = new FirefoxDriver();
        }

        public void click(By locator)
        {
            Find(locator).Click();
        }

        public IWebElement Find(By locator)
        {
            //ValidateSelector(locator); will update css selectors, however not to cause any extra delays by checking this programmatically.

            var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(15));
            wait.Until(ExpectedConditions.ElementIsVisible(locator));

            return driver.FindElement(locator);
        }
    }
}
这是我的基类中的所有代码,我只需要找到一种方法来使用已经打开的驱动程序,而不是创建一个新的驱动程序。
我有一个hooks文件可以为我打开浏览器,所以我只需要基类中的驱动程序就可以使用它。

在Java透视图中,假设我有一个打开浏览器的类

public class Hook {

public static WebDriver driver;

@BeforeSuite
public void startBrowser(){

    driver=new FirefoxDriver();
}

}
若要在另一个类中使用此浏览器,只需将其继承到其他类,就不会在这些类中启动任何驱动程序

公共类TestClass扩展了钩子{

@Test
public void toNavigate(){
    driver.get("http://www.myurl.com");
}

}
另一种方法是在Hook中创建一个方法,该方法返回驱动程序,并需要在另一个类中收集该驱动程序

 public class TestClass {

WebDriver driver;

@Test
public void toNavigate(){
    Hook h=new Hook();
    driver=h.startBrowser();
    driver.get("http://www.myurl.com");
}

}
钩子里有这样的东西

  public WebDriver startBrowser(){

    return driver=new FirefoxDriver();
}
在其他类中获取此驱动程序

 public class TestClass {

WebDriver driver;

@Test
public void toNavigate(){
    Hook h=new Hook();
    driver=h.startBrowser();
    driver.get("http://www.myurl.com");
}

}
谢谢,,
Murali

在Java透视图中,假设我有一个打开浏览器的类

public class Hook {

public static WebDriver driver;

@BeforeSuite
public void startBrowser(){

    driver=new FirefoxDriver();
}

}
若要在另一个类中使用此浏览器,只需将其继承到其他类,就不会在这些类中启动任何驱动程序

公共类TestClass扩展了钩子{

@Test
public void toNavigate(){
    driver.get("http://www.myurl.com");
}

}
另一种方法是在Hook中创建一个方法,该方法返回驱动程序,并需要在另一个类中收集该驱动程序

 public class TestClass {

WebDriver driver;

@Test
public void toNavigate(){
    Hook h=new Hook();
    driver=h.startBrowser();
    driver.get("http://www.myurl.com");
}

}
钩子里有这样的东西

  public WebDriver startBrowser(){

    return driver=new FirefoxDriver();
}
在其他类中获取此驱动程序

 public class TestClass {

WebDriver driver;

@Test
public void toNavigate(){
    Hook h=new Hook();
    driver=h.startBrowser();
    driver.get("http://www.myurl.com");
}

}
谢谢,,
Murali

我不太喜欢页面对象(这严重违反了),但我认为您的设计可以使用一些不同的方法。看看Selenium的主页:

正如您所看到的,没有理由在页面中保留静态实例,相反,您可以使用和作为WebDriver对象


如果必须这样做,我会通过创建驱动程序,将操作(单击、键入等)放在actions类中,并尽可能保持页面不受此类逻辑的影响。

我不太喜欢页面对象(这严重违反了),但我认为您的设计可以使用一些不同的方法。看看Selenium主页:

正如您所看到的,没有理由在页面中保留静态实例,相反,您可以使用和作为WebDriver对象


如果必须这样做,我会通过创建驱动程序,将操作(单击、键入等)放在actions类中,并尽可能保持页面上没有此类逻辑。

最简单的解决方案是在另一个位置创建webdrive实例,并通过构造函数将其传递给基类

因此,在测试类中,您应该创建一个新的驱动程序(可能在安装夹具中),并将其传递给基类的构造函数:

driver = new FireFoxDriver();
BasePage base = new BasePage(driver);
在基类中,构造函数应该是:

public class BasePage(IWebDriver driver)
{
   this.driver = driver;
}
这会解决你的问题


<强>也考虑更重但可能更好的方式< /强>创建WebDrand工厂。如何使用C语言来说明:

< P>最简单的解决方案是在另一个地方创建WebDead实例,并通过构造函数传递给基类。

因此,在测试类中,您应该创建一个新的驱动程序(可能在安装夹具中),并将其传递给基类的构造函数:

driver = new FireFoxDriver();
BasePage base = new BasePage(driver);
在基类中,构造函数应该是:

public class BasePage(IWebDriver driver)
{
   this.driver = driver;
}
这会解决你的问题


<强>也考虑更重,但也许更好的方式< /强>创建WebDrand工厂。如何使用C语言来显示它:

“为我打开浏览器的钩子文件”意味着这是另一个用硒打开Firefox的类吗?是的,我有另一个使用[BeFreeSeNeReNoRo ]打开浏览器的文件。我只使用基类来实现点击和等待功能,但我需要告诉它使用哪个驱动程序才能工作。你在页面上继承基类,所以每次你创建页面类的对象时,它都会创建Firefox对象。所以好的方法是将你的浏览器配置方法从页面中分离出来,它应该在测试clas中s级别不是页面类级别。您能给我一个如何执行此操作的示例吗?“为我打开浏览器的hooks文件”表示这是另一个通过selenium打开firefox的类吗?是的,我有另一个使用[BeforeCasenario]打开浏览器的文件我只使用基类来实现点击和等待功能,但我需要告诉它使用哪个驱动程序才能工作。你在页面上继承基类,所以每次你创建页面类的对象时,它都会创建Firefox对象。所以好的方法是将你的浏览器配置方法从页面中分离出来,它应该在测试clas中s级别而不是页面类级别。你能给我一个如何做的示例吗?让我用一个简单的测试用例来说明如何调用这些类。看起来这里一切都很好,可以使用startBrowser和BeforeSecenario不同的类,一个是可重用的方法,另一个是在执行之前启动。在java中,我们通常扩展BeforeSecenario to other classes Let我有一个简单的测试用例,你是如何调用这些类的。看起来这里一切都很好,可以使用startBrowser和BeforeScap想不同的类,一个是可重用的方法,另一个是在执行之前启动。在java中,我们通常将BeforeScap想扩展到其他类