【发布时间】: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 容器完成繁重的工作。