我目前正在尝试为网站创建一些自动化测试,我遇到一个问题,即每当我调用我的基类时,它会创建一个新的FirefoxDriver实例。因此,每当我在继承基类的步骤中调用页面时,它都会加载一个新的驱动程序实例,因此不再自动执行上一个驱动程序。
import Foundation
import UIKit
class LoaderView: UIView {
class var sharedInstance: LoaderView {
struct Static {
static var onceToken: dispatch_once_t = 0
static var instance: LoaderView? = nil
}
dispatch_once(&Static.onceToken) {
Static.instance = NSBundle.mainBundle().loadNibNamed("LoaderView", owner: self, options: nil)[0] as? LoaderView
}
return Static.instance!
}
//approach 2
class var sharedInstanceA: LoaderView {
struct Static {
static let instance = NSBundle.mainBundle().loadNibNamed("LoaderView", owner: LoaderView.self, options: nil)[0] as! LoaderView
}
return Static.instance
}
//approach 3
static let sharedInstanceB = NSBundle.mainBundle().loadNibNamed("LoaderView", owner: LoaderView.self, options: nil)[0] as! LoaderView
}
这是我的基类里面的所有代码我只需要找到一种方法来使用已经打开的驱动程序而不是创建一个新的驱动程序。 我有一个钩子文件,它为我打开浏览器所以我只需要基类中的驱动程序来使用它。
答案 0 :(得分:0)
在Java视角中,我们假设我有一个打开浏览器的课程
public class Hook {
public static WebDriver driver;
@BeforeSuite
public void startBrowser(){
driver=new FirefoxDriver();
}
}
要在另一个类中使用此浏览器,只需将其继承到其他类,我就不会在其中启动任何驱动程序。
公共类TestClass扩展了Hook {
@Test
public void toNavigate(){
driver.get("http://www.myurl.com");
}
}
另一种方法是在Hook中创建一个返回驱动程序并需要在另一个类中收集该驱动程序的方法
在Hook 中有类似的东西 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");
}
}
谢谢你, 穆拉利
答案 1 :(得分:0)
我不是Page对象的忠实粉丝(它是SRP的主要违规者),但我认为您的设计可以采用一种不同的方法。看看Selenium的主页page examples:
/**
* Page Object encapsulates the Home Page
*/
public class HomePage {
private WebDriver selenium;
public HomePage(WebDriver selenium) {
if (!selenium.getTitle().equals("Home Page of logged in user")) {
throw new IllegalStateException("This is not Home Page of logged in user, current page" +
"is: " +selenium.getLocation());
}
}
public HomePage manageProfile() {
// Page encapsulation to manage profile functionality
return new HomePage(selenium);
}
/*More methods offering the services represented by Home Page
of Logged User. These methods in turn might return more Page Objects
for example click on Compose mail button could return ComposeMail class object*/
}
正如您所看到的,没有理由在页面中保留静态实例,而是可以使用IoC和Constructor DI作为WebDriver对象。
如果必须这样做,我会通过Factory创建驱动程序,在Actions类中放置操作(单击,输入等),并尽可能地保持Pages清理这些逻辑。
答案 2 :(得分:0)
最简单的解决方案是在另一个地方创建一个webdrive实例,并通过构造函数将其传递给基类。
因此,在Test类中,您应该创建一个新的驱动程序(可能在SetUp fixture中)并将其传递给基类的构造函数:
driver = new FireFoxDriver();
BasePage base = new BasePage(driver);
在基类中,构造函数应为:
public class BasePage(IWebDriver driver)
{
this.driver = driver;
}
这将解决您的问题。
还要考虑更重,但也许更好的方法 - 创建WebDriver Factory。如何使用C#进行此处显示:https://github.com/FriendlyTester/WebDriverFactoryExample/blob/master/WebDriverDriverFactory/WebDriverDriverFactory/WebDriverFactory.cs