【问题标题】:How to handle exception when passing driver into page object in cucumber step file将驱动程序传递到黄瓜步骤文件中的页面对象时如何处理异常
【发布时间】:2018-05-19 08:26:48
【问题描述】:

我使用页面对象模型创建了一个 Java/Appium/Cucumber 项目。

我有一个为我创建驱动程序的 BaseCapabilities 类:

import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.android.AndroidElement;
import io.appium.java_client.remote.MobileCapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;

import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;

public class BaseCapabilities {

    public static AndroidDriver<AndroidElement> capabilities() throws MalformedURLException{

    AndroidDriver<AndroidElement> driver;

    File filepath = new File("src");
    File fs = new File(filepath,"ApiDemos-debug.apk");

    DesiredCapabilities cap = new DesiredCapabilities();

    cap.setCapability(MobileCapabilityType.DEVICE_NAME, "Nexus_5_API_25");
    cap.setCapability(MobileCapabilityType.APP, fs.getAbsolutePath());
    driver = new AndroidDriver<AndroidElement>
            (new URL("http://127.0.0.1:4723/wd/hub"),cap);

    return driver;
    }
}

我有一些页面对象类:

public class LandingPageElements {

    public LandingPageElements(AppiumDriver<AndroidElement> driver) {
    PageFactory.initElements(new AppiumFieldDecorator(driver), this);
    }

    @AndroidFindBy(uiAutomator = "text(\"Media\")")
    private AndroidElement media;

    public void clickOnMediaButton() {
    media.click();
    }
}

如果我用 Junit 创建一个简单的单元测试,测试运行良好:

公共类测试步骤{

@Test
public void firstTest() throws Throwable{
    AndroidDriver<AndroidElement> driver = capabilities();
    driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);

    LandingPageElements l1 = new LandingPageElements(driver);
    MediaElements m1 = new MediaElements(driver);
    AudioFxElements a1 = new AudioFxElements(driver);

    l1.clickOnMediaButton();
    m1.clickOnAudioFxButton();
    a1.check60HzIsDisplayed();
}

}

但是,我完全不知道如何在 Cucumber 的“步骤”粘合代码中实现这些。例如,如果我有一个给定的/何时/那么,我无法初始化我的页面对象,因为我需要传递我的驱动程序,但是当我这样做时会引发“未处理的异常”错误。我无法处理此异常,因为这意味着我必须将它包含在一个方法中,然后每个给定/何时/然后步骤都无法访问它。下面的“capabilities()”方法调用表示存在未处理的异常。我该如何处理,但仍允许我的步骤访问已初始化的对象?

公共类 Steps 扩展 BaseCapabilities{

LandingPageElements l1 = new LandingPageElements(capabilities());
MediaElements m1 = new MediaElements(capabilities());
AudioFxElements a1 = new AudioFxElements(capabilities());


@Given("^I click on Media$")
public void i_click_on_media()throws Throwable{
    l1.clickOnMediaButton();
}

@When("^I click AudioFx$")
public void i_click_audiofx(){
    m1.clickOnAudioFxButton();
}

@Then("^I can see the 60 hz option$")
public void i_can_see_the_60hz_option() throws Throwable{
    Assert.assertTrue(a1.check60HzIsDisplayed());
}

}

谢谢!

【问题讨论】:

  • 使用依赖注入来帮助创建对象和跨步骤管理对象状态。试试 picocontainer,除了需要构造函数注入对象之外,它实际上是不可见的。 -- thinkcode.se/blog/2017/04/01/…github.com/cucumber/cucumber-jvm/tree/master/picocontainer。不要在 Steps 中扩展 BaseCapabilities 类,不会与多个 Step 类一起使用。将驱动程序类注入到 Step 类的构造函数中,对于页面对象也是如此。让 DI 容器完成繁重的工作。

标签: java cucumber appium


【解决方案1】:

我会在 step 类中创建驱动程序。当 step 类增长并变大或开始使用多个域时,请按照注释中的建议使用依赖注入。

我写了blog post在评论中引用。

我不会从那里开始,我会从一个更简单的解决方案开始,它包含一个自包含并且可以处理其所有需求的一步定义类。

这是本着“让它发挥作用,让它易于理解,让它快速”的精神,而让它快速通常是可选的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    • 1970-01-01
    • 2020-01-13
    • 2018-02-08
    • 2014-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多