硒C#Don';我不想继续创建FireFoxDriver的新实例
我目前正在尝试为一个网站创建一些自动化测试,我有一个问题,那就是每当我调用我的基类时,它就会创建一个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
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想扩展到其他类