【问题标题】:Appium - PageFactory initElements is not workingAppium - PageFactory initElements 不工作
【发布时间】:2019-04-25 14:34:50
【问题描述】:

我有这个类作为我的页面对象:

public class LaunchPageObject  {

private AppiumDriver<AndroidElement> driver;

public LaunchPageObject() {

}

public LaunchPageObject(AppiumDriver<AndroidElement> driver) {

    this.driver=driver;
    PageFactory.initElements(new AppiumFieldDecorator(this.driver), this);
}

public void Click_SigninNow() {

    lnk_SigninNow.click();
}

@AndroidFindBy(xpath="//android.widget.Button[@text='LOGIN WITH FACEBOOK']")
MobileElement btn_SignupWithEmail;

@AndroidFindBy(xpath="//android.widget.Button[@text='SIGN UP WITH EMAIL']")
MobileElement btn_LoginWithFacebook;

@AndroidFindBy(xpath="//android.widget.TextView[@text='Sign in now']")
MobileElement lnk_SigninNow;
}

我有这个类作为我的测试用例类:

public class LaunchPageTest extends Android {

  @Test
  public void Click_SigninNow() throws MalformedURLException {

  LaunchPageObject lp = new LaunchPageObject(setDriver());
  lp.Click_SigninNow();
  }
}

我有这个错误日志:

失败:Click_SigninNow java.lang.ExceptionInInitializerError 在 io.appium.java_client.pagefactory.utils.ProxyFactory.getEnhancedProxy(ProxyFactory.java:52) 在 io.appium.java_client.pagefactory.utils.ProxyFactory.getEnhancedProxy(ProxyFactory.java:33) 在 io.appium.java_client.pagefactory.AppiumFieldDecorator.proxyForAnElement(AppiumFieldDecorator.java:217) 在 io.appium.java_client.pagefactory.AppiumFieldDecorator.access$0(AppiumFieldDecorator.java:215) 在 io.appium.java_client.pagefactory.AppiumFieldDecorator$1.proxyForLocator(AppiumFieldDecorator.java:107) 在 org.openqa.selenium.support.pagefactory.DefaultFieldDecorator.decorate(DefaultFieldDecorator.java:62) 在 io.appium.java_client.pagefactory.AppiumFieldDecorator.decorate(AppiumFieldDecorator.java:155) 在 org.openqa.selenium.support.PageFactory.proxyFields(PageFactory.java:113) 在 org.openqa.selenium.support.PageFactory.initElements(PageFactory.java:105) 在 POM.LaunchPageObject.(LaunchPageObject.java:35) 在 TestCases.LaunchPageTest.Click_SigninNow(LaunchPageTest.java:17) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

测试打开应用但无法点击元素。知道这里发生了什么吗?

【问题讨论】:

  • 你也可以添加 setDriver() 方法吗?
  • 我认为将您的 AppiumDriver 设置为静态可以解决问题。

标签: appium appium-android


【解决方案1】:

保留您的页面对象和测试类,如下所示

public class LaunchPageObject {

    @AndroidFindBy(xpath="//android.widget.Button[@text='LOGIN WITH FACEBOOK']")
    MobileElement btn_SignupWithEmail;

    @AndroidFindBy(xpath="//android.widget.Button[@text='SIGN UP WITH EMAIL']")
    MobileElement btn_LoginWithFacebook;

    @AndroidFindBy(xpath="//android.widget.TextView[@text='Sign in now']")
    MobileElement lnk_SigninNow;

    public void click_SigninNow() {
        lnk_SigninNow.click();
    }

}




public class LaunchPageTest extends Android {

  LaunchPageObject lp       = PageFactory.initElements(getDriver(), LaunchPageObject.class);

  @Test
  public void Click_SigninNow() throws MalformedURLException {
    lp.Click_SigninNow();
  }

}

【讨论】:

  • 你能解释一下为什么这对这张海报有用吗?我能看到的唯一真正的区别是,您没有做更标准的(在我看来)将驱动程序对象作为参数传递给页面对象并在页面对象本身内初始化页面对象元素。还是我还缺少其他东西?
  • 感谢比尔的 cmets.. 我曾经遵循不同类型的选项。每当我用来创建页面对象并将创建相应的操作方法时。 (例如:如果您为按钮创建对象并将在同一个类中创建相应的操作单击)当进行驱动程序创建时,将创建各种驱动程序作为静态方法并用于将驱动程序保持在 ThreadLoacl 中。它会更多有助于并行执行..
猜你喜欢
  • 2018-05-20
  • 2021-11-02
  • 1970-01-01
  • 1970-01-01
  • 2021-06-30
  • 2021-07-05
  • 2019-01-01
  • 2016-03-25
  • 2017-10-25
相关资源
最近更新 更多