依赖注入以初始化黄瓜项目中的驱动程序并使用钩子而不终止会话



我正在尝试使用页面对象模型实现黄瓜,我遇到了几个问题,有很多问题。

  1. 我的iOS应用程序并不复杂,但我仍然想将所有步骤定义和功能与POM中的页面相对应。所以我会有多个步进和跑步者。组织所有这些的最佳实践是什么?我尝试了 Pico DI,但甚至无法通过它传递我的驱动程序实例。(如果可以,请提供结构解决方案)

  2. 由于s native iOS - Im不会在每个场景后关闭应用程序(这将需要永远)。但我仍然想保持功能干燥以实现可重用性 创建一个 appium 驱动程序实例并在执行功能之前从不创建另一个驱动程序实例的最佳方法是什么?我知道我只需要在最后一步中添加 driver.quit。我所纠结的是在所有项目(页面,Stepdefs)中使用相同的驱动程序(请参阅代码)

  3. 我将使用 TestNg 运行测试,想知道@Before @After注释是否仍然在 stepdefs 中工作,或者最好避免它们?

  4. 主要问题:使用pico进行依赖注入。由于我所有的测试都是接受的(端到端功能测试),我想知道创建一个包含我所有页面和驱动程序的 InjectionSetUp 类是否是个好主意

驱动程序管理器

public class IOSDriverManager {
public static ThreadLocal<IOSDriver<IOSElement>> webDriver = new ThreadLocal<IOSDriver<IOSElement>>();
public static DesiredCapabilities getIOSCapsLocal() {
DesiredCapabilities caps = new DesiredCapabilities();
//My caps
return caps;
public static void createThreadLocalWebDriver() {
IOSDriver<IOSElement> driver = null;
//try catch
driver = new IOSDriver<IOSElement>(new URL(APPIUM_SERVER_URL), getIOSCapsLocal());
//try catch
webDriver.set(driver);
}
public static IOSDriver<IOSElement> getThreadLocalDriver() {
IOSDriver<IOSElement> driver = webDriver.get();
if (driver == null) {
createThreadLocalWebDriver();
driver = webDriver.get();
}
return driver;
}

基本页面

public class BasePage {
IOSDriver<IOSElement> Driver;
public BasePage(IOSDriver<IOSElement> driver) {
initElements();
Driver = driver;
}
private void initElements() {
PageFactory.initElements(new AppiumFieldDecorator(getDriver()),this);
}
protected IOSDriver<IOSElement> getDriver() {
return IOSDriverManager.getThreadLocalDriver();
}
}

任意页面

public class BiosurveyPage extends BasePage {
public BiosurveyPage(IOSDriver<IOSElement> driver) {
super(driver); //  Appiumfield  decorator is applied by BasePage constructor
//Is it better to just use getDriver() method throughout all pages instead of declaring driver again ? 
}

Finaly StepDefs

public class newSignUpFlowTest{
protected IOSDriver<IOSElement> getDriver() {
return IOSDriverManager.getThreadLocalDriver();
}
LoginPage poLogin = new LoginPage(getDriver());
SignUpPage poSignup = new SignUpPage(getDriver());
// 10+ pages 
@Given("I am on Login Page")
public void iAmOnLoginPage() {
assertThat("ON LOGIN PAGE",poLogin.isLoginScreen(),equalTo(true));
}
@When("I tap on Sign Up Link")
public void iTapsOnSignUpLink() {
poLogin.clickSignUp();
}
// 20+ methods for this feature

更新我修复了所有内容并能够运行测试。现在我的问题是 - 我的框架看起来不错吗?我不知道t have any real life experience prior to this. So can someone just approve me and suggest enhancements to keep up with best industry practices ? I know this post might piss some people off, but i don其他地方可以交流这个问题,因为我在 QA 领域没有任何朋友并且远程工作

使用依赖注入时,您希望让您的 DI 系统完成所有繁重的工作。因此,步骤定义对页面对象具有构造函数依赖项。

public class NewSignUpFlowStepDefinitions {
private final LoginPage poLogin;
private final SignUpPage poSignup;
NewSignUpFlowStepDefinitions(LoginPage poLogin, SignUpPage poSignup) {
this.poLogin = poLogin;
this.poSignup = poSignup;
}
@Given("I am on Login Page")
public void iAmOnLoginPage() {
assertThat("ON LOGIN PAGE", poLogin.isLoginScreen(), equalTo(true));
}
@When("I tap on Sign Up Link")
public void iTapsOnSignUpLink() {
poLogin.clickSignUp();
}
}

页面对象不能对IOSDriver<IOSElement>具有构造函数依赖项,因为 PicoContainer 只能创建不以空构造函数结尾的依赖项链。因此,我们在这里使用IOSDriverManager

public class BiosurveyPage extends BasePage {
public BiosurveyPage(IOSDriverManager driverManager) {
super(driverManager);
}
}

在您的BasePage然后从驱动程序管理器中解压缩 Web 驱动程序。

public abstract class BasePage {
private IOSDriverManager driverManager;
public BasePage(IOSDriverManager driverManager) {
this.driverManager = driverManager;
initElements();
}
private void initElements() {
PageFactory.initElements(new AppiumFieldDecorator(driverManager.getDriver()), this);
}
protected IOSDriver<IOSElement> getDriver() {
return driverManager.getDriver();
}
}

然后在IOSDriverManager中,您可以保留对 Web 驱动程序的引用并根据需要创建它。如果您确定在方案之间共享 Web 驱动程序是安全的,您仍然可以在此处使用ThreadLocal

public class IOSDriverManager implements Disposable{
private IOSDriver<IOSElement> webDriver;
private DesiredCapabilities getIOSCapsLocal() {
DesiredCapabilities caps = new DesiredCapabilities();
return caps;
}
private void createWebDriver() {
webDriver = new IOSDriver<IOSElement>(new URL(APPIUM_SERVER_URL), getIOSCapsLocal());
}
public IOSDriver<IOSElement> getDriver() {
if (webDriver == null) {
createThreadLocalWebDriver();
}
return webDriver;
}
@Override
public void dispose() {
// Stop webdriver ehre
}
}

请注意,Disposable添加了 dispose 方法,该方法可让您在每个方案之后清理驱动程序。要么完全处置它,要么将其重置为某种已知状态。

http://picocontainer.com/lifecycle.html

最新更新