当前位置: 首页 > 知识库问答 >
问题:

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

屈翰飞
2023-03-14

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

我有一个基本能力类,它为我创建了一个驱动程序

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的“步骤”胶水代码中实现这些。例如,如果我有一个给定的/当/然后,我不能初始化我的页面对象,因为我需要通过我的驱动程序,但是当我这样做时,会抛出一个“未处理的异常”错误。我没有办法处理这个异常,因为这意味着我必须将它包含在一个方法中,然后它将无法访问每个给定的/当/然后步骤。下面的“能力()”方法调用表示有一个未处理的异常。我如何处理这个,但仍然允许我的步骤访问初始化的对象?

公共类步骤扩展了基本功能{

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个答案

越星晖
2023-03-14

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

我写了评论中提到的博客帖子。

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

这是本着“让它工作,让它可以理解,让它快”的精神,而让它快往往是可选的。

 类似资料:
  • 我无法将驱动程序/对象传递到下一个类/页,并且在第一个/开始类中具有相同的NullPointerException。 PageObject类-SearchResultsPage: PageObject类主页: 测试等级: 我有两个问题: 1.当我运行测试检查IsHomePage()-FAILS(NullPointerExcema)和ChangeMoney cy()PASS。我不知道为什么第一次测试

  • 在Selenium PageObjects中,我没有实例化任何web驱动程序实例,也没有如下所示进行编码 我试图在Selenium Page对象函数中实现以下代码。 有谁能建议我,在使用页面对象模型时,如何在上述代码中使用webdriver实例?

  • 问题内容: 我试图将我的数据库对象传递给我的处理程序,而不是具有全局对象。但是我不知道这是否可行,我使用的是Gorilla Mux软件包,我可以看到它把闭包作为第二个参数。 然后定义了我可以使用的参数,理想情况下,我希望拥有这样的第三个参数。 有解决方法吗?还是我需要一个全局数据库对象?我是Go的新手,所以请详细说明可能的答案。 问题答案: 欢迎来到。 可以使用全局变量,特别是数据库对象。 但是,

  • 问题内容: 我有一个在React中创建的组件,该组件可以抽象出我的应用程序中的某些样式。我在两种不同的上下文中使用它- 一种用于提交登录表单,另一种用于导航到注册页面(以及将来可能的其他上下文)。 我试图弄清楚如何将事件处理程序从父组件传递到。我想为登录表单调用一个处理程序,但是为导航按钮调用一个处理程序。这可能吗? 我试过像这样调用组件: 我也尝试过删除arrow函数,这只会导致该函数在加载组件

  • 我需要你的指导,将用户名和密码从Selenium脚本传递到JMeter。情况是这样的.. 有一个CSV文件,其中包含用户名和密码列表。在Selenium Webdriver中,我编写了一个用于记录web应用程序的脚本。 脚本应该使用JMeter中的用户名和密码,其中CSV配置文件用作外部数据源(用户名和密码列表存在)。 我们如何做到这一点? 谢谢,< br >卡鲁纳加拉·潘迪

  • 有一个webapp,其中每个请求都会消耗各种外部资源。webapp使用请求获取的bean跟踪那些消耗的资源。然后HandlerInterceptor的afterCompletion方法调用TaskExecutor将此信息存储在数据库中。一切都很好,但需要增加带宽消耗作为另一种资源。计算传出响应大小是servlet过滤器的一项典型任务(以及响应包装器和定制流实现)。因此,这项工作已经完成,并且正在发