我使用页面对象模型创建了一个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());
}
}
谢谢!
答案 0 :(得分:0)
我会在步骤类中创建驱动程序。当步骤类增长并变大或开始使用多个域时,请使用注释中建议的依赖注入。
我在评论中写了blog post。{/ p>
我不会从那里开始,我会从一个更简单的解决方案开始,一步定义类是自包含的,可以满足它的所有需求。
本着这种精神,“让它变得有效,让它变得可以理解,让它快速”,快速制作它通常是可选的。