【问题标题】:Can't get Page Object Model to work with Appium, Serenity, Selenium, Java无法让页面对象模型与 Appium、Serenity、Selenium、Java 一起使用
【发布时间】:2019-02-05 11:11:24
【问题描述】:

我正在使用带有 Appium 和 Serenity 的 Java 编写一个 selenium 测试自动化框架。

我在创建页面对象模型时遇到问题。

我的页面类如下所示:

public class MattVerifyPage extends PageObject{
private AppiumDriver driver;

public MattVerifyPage(AppiumDriver driver) {
    this.driver = driver;
    PageFactory.initElements(new AppiumFieldDecorator(driver), this);
}


@AndroidFindBy(xpath = "Androidxpath")
@iOSFindBy(xpath = "iOSxpath")
public MobileElement verifyTitle ;


public void verifyTitle(String expectedTitle){

    String actualTitle =verifyTitle.getText();
}

在我的测试步骤文件中,页面是使用以下代码实例化的:

MattVerifyPage VerifyPage = new MattVerifyPage(driver);

但是,当我运行测试时,我收到如下所示的错误。

java.lang.IllegalArgumentException: Can not set io.appium.java_client.MobileElement field com.xxx.test.pages.MattVerifyPage.verifyTitle to com.sun.proxy.$Proxy19
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171)
at sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:81)
at java.lang.reflect.Field.set(Field.java:764)
at org.openqa.selenium.support.PageFactory.proxyFields(PageFactory.java:117)
at org.openqa.selenium.support.PageFactory.initElements(PageFactory.java:105)
at net.thucydides.core.annotations.locators.SmartElementProxyCreator.lambda$new$3(SmartElementProxyCreator.java:37)
at net.thucydides.core.annotations.locators.SmartElementProxyCreator.proxyElements(SmartElementProxyCreator.java:48)
at net.thucydides.core.webdriver.DefaultPageObjectInitialiser.apply(DefaultPageObjectInitialiser.java:21)
at net.serenitybdd.core.pages.PageObject.setDriver(PageObject.java:151)
at net.serenitybdd.core.pages.PageObject.setDriver(PageObject.java:155)
at net.thucydides.core.steps.PageObjectDependencyInjector.updatePageObject(PageObjectDependencyInjector.java:69)
at net.thucydides.core.steps.PageObjectDependencyInjector.instantiatePageObjectIfNotAssigned(PageObjectDependencyInjector.java:59)
at net.thucydides.core.steps.PageObjectDependencyInjector.injectDependenciesInto(PageObjectDependencyInjector.java:33)
at net.serenitybdd.core.Serenity.injectDependenciesInto(Serenity.java:61)
at net.serenitybdd.core.Serenity.initializeWithNoStepListener(Serenity.java:102)
at cucumber.runtime.SerenityObjectFactory.newInstance(SerenityObjectFactory.java:68)
at cucumber.runtime.SerenityObjectFactory.cacheNewInstance(SerenityObjectFactory.java:51)
at cucumber.runtime.SerenityObjectFactory.getInstance(SerenityObjectFactory.java:41)
at cucumber.runtime.java.JavaStepDefinition.execute(JavaStepDefinition.java:37)
at cucumber.runtime.StepDefinitionMatch.runStep(StepDefinitionMatch.java:40)
at cucumber.api.TestStep.executeStep(TestStep.java:102)
at cucumber.api.TestStep.run(TestStep.java:83)
at cucumber.api.TestCase.run(TestCase.java:58)
at cucumber.runner.Runner.runPickle(Runner.java:80)
at cucumber.runtime.Runtime.runFeature(Runtime.java:119)
at cucumber.runtime.Runtime.run(Runtime.java:104)
at cucumber.api.cli.Main.run(Main.java:36)
at cucumber.api.cli.Main.main(Main.java:18)

【问题讨论】:

  • 也许变量和方法具有相同的名称可能会导致这种情况。换一个看看它是否有效。
  • 您的页面对象扩展了一个名为 PageObject 的类。请在您的原始帖子中包含该代码。这不是你的错误,但你的 verifyTitle 方法什么也没做。最后,也许你需要时间参数:PageFactory.initElements(new AppiumFieldDecorator(driver, Duration.ofSeconds(15)), this);
  • 问题在于 public void verifyTitle(String expectedTitle){ String actualTitle =verifyTitle.getText(); }

标签: java selenium appium serenity-bdd


【解决方案1】:

如果您使用的是 Serenity BDD,则无需声明或管理您自己的 WebDriver 实例 - Serenity 会为您解决这些问题。 https://serenity-bdd.rocket.chat 上有很多人在 Serenity 和 Appium 上做了很多工作。

【讨论】:

  • 谢谢约翰,我去看看。
【解决方案2】:

有关信息,它是导致问题的“扩展 PageObject”。 这是 Serenity PageObject。 暂时我删除了这个,然后 Appium 页面对象模型代码就可以工作了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-27
    • 2018-02-20
    • 1970-01-01
    • 1970-01-01
    • 2017-12-03
    • 2011-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多