如何在黄瓜步骤文件中将驱动程序传递给页面对象时处理异常

时间:2017-12-05 15:53:47

标签: java cucumber appium

我使用页面对象模型创建了一个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创建一个简单的单元测试,测试运行正常:

公共类TestSteps {

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

}

然而,我完全不知道如何在我的&#34;步骤&#34;黄瓜的胶水代码。例如,如果我有一个给定/ when / then,我无法初始化我的页面对象,因为我需要通过我的驱动程序,但是当我这样做时会抛出一个未处理的异常&#34;错误。我没办法处理这个异常,因为这意味着我必须在一个方法中包含它然后它不会被每个给定/当/然后步骤访问。 &#34; 功能()&#34;下面的方法调用是说有一个未处理的异常。我该如何处理,但仍然允许我的步骤访问初始化对象?

公共类步骤扩展了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());
}

}

谢谢!

1 个答案:

答案 0 :(得分:0)

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

我在评论中写了blog post。{/ p>

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

本着这种精神,“让它变得有效,让它变得可以理解,让它快速”,快速制作它通常是可选的。