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

我正在尝试使用Page Object Model实现黄瓜,但是我遇到了一些问题,并且有很多疑问。

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

  2. 因为s native iOS - I并不会在每种情况下都关闭应用程序(这将永远存在)。但是我仍然想保持DRY功能的可重用性 创建一个appium驱动程序实例,然后再执行功能,再创建另一个appium驱动程序实例的最佳方法是什么?我了解我只需要在最后一步中添加driver.quit。我所困扰的是在所有项目(Pages,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;
    }

BasePage

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

}

AnyPage

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 ? 
    }

最终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不知道该在哪里进行交流,因为我在质量检查领域没有任何朋友并且无法远程工作

huhailongshiwo 回答:依赖注入可在黄瓜项目中初始化驱动程序并使用挂钩而不终止会话

使用依赖注入时,您希望让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中,从驱动程序管理器中打开Webdriver的包装。

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中,您可以保留对Webdriver的引用并根据需要创建它。如果可以确定在各种情况下共享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

本文链接:https://www.f2er.com/3149630.html

大家都在问