Appium框架中的非法参数异常

时间:2018-08-22 17:36:44

标签: java selenium appium pageobjects

(愚蠢地)将Appium Server与各种项目库一起升级之后,以至于我无法确定是哪一个导致了问题,我先前运行的Appium框架在尝试查找任何元素时突然开始失败。

服务器启动(通过桌面或通过Java代码手动启动),并启动我的仿真器(如果尚未加载),建立连接,打开应用程序(在本例中为简单设置),并在失败后立即它会通过检查是否存在“设置”文本来验证是否显示了设置主页:

  

显示设置应用程序(失败)   (java.lang.IllegalArgumentException:无法设置   io.appium.java_client.android.AndroidElement字段   com.mindtree.pageobjects.SettingsMainPage.header为   org.openqa.selenium.remote.RemoteWebElement $$ EnhancerByCGLIB $$ d27c0df4)

适用于台式机和nodeJS的Appium服务器版本当前为1.7.2,我认为问题最初是在我最初为1.7.1或1.7.2时开始的,并且成功地将台式机版本自动更新为1.8。 1。

硒版本为3.11.0(尝试了从3.9.0到3.13.0的多种口味)

Appium Java客户端为6.0.0-BETA5(尝试6​​.0.0-BETA4、6.0.0、6.1.0)

Java是1.8

报告错误的JBehave测试步骤:

@Given("the settings app is displayed")
public void givenTheSettingsAppIsDisplayed() {
    main = new SettingsMainPage(driver);
    if (main.pageLoaded())
        test.logGivenPass("the settings app is displayed");
    else {
        test.logGivenFail("the settings app is displayed");
        fail();
    }
}

相应的页面对象代码段:

public class SettingsMainPage extends MobilePageObject {

    public SettingsMainPage(AndroidDriver<AndroidElement> driver) {
        super(driver);
        System.out.println("Settings Main page class has been initialized");
    }

    @AndroidFindBy(xpath = "//android.widget.TextView[@text='Settings']")
    AndroidElement header;
    @AndroidFindBy(id= "android:id/title")
    List<AndroidElement> titles;
    @AndroidFindBy(id= "android:id/summary")
    List<AndroidElement> summaries;

    public Boolean pageLoaded() {
        return helper.isDisplayed(header);
    }

}

搜索该特定错误会返回一些匹配,但没有提供解决方案。

任何指导表示赞赏。

edit:我应该补充一点,该错误似乎是在通过页面工厂初始化页面对象时发生的,因为从未显示文本“ initialized”,所以在尝试初始化所有页面元素(特别是第一个元素)时失败,至少根据错误消息。

我的基本页面对象在下面:

import java.time.Duration;

import org.openqa.selenium.support.PageFactory;

import com.mindtree.helpers.AppiumUtils;

import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.android.AndroidElement;
import io.appium.java_client.pagefactory.AppiumFieldDecorator;

public class MobilePageObject {

    AndroidDriver<AndroidElement> driver;
    AppiumUtils helper;

    public MobilePageObject(AndroidDriver<AndroidElement> driver) {

        this.driver = driver;
        PageFactory.initElements(new AppiumFieldDecorator(driver, Duration.ofSeconds(15)), this);
        helper = new AppiumUtils();

    }

}
  

编辑更新:通过NodeJS将Appium服务器从1.7.2降级到   1.7.1。结果:没有变化,报告了相同的错误。

1 个答案:

答案 0 :(得分:2)

我正在使用 Appium服务器1.8.1 硒3.13.0 java客户端6.1.0 。我使用如下页面对象模型,并且效果很好。

public class SettingsMainPage{

    public SettingsMainPage(AndroidDriver<AndroidElement> driver) {
        PageFactory.initElements(new AppiumFieldDecorator(driver), this);
        System.out.println("Settings Main page class has been initialized");
    }

    @AndroidFindBy(xpath = "//android.widget.TextView[@text='Settings']")
    AndroidElement header;
    @AndroidFindBy(id= "android:id/title")
    List<AndroidElement> titles;
    @AndroidFindBy(id= "android:id/summary")
    List<AndroidElement> summaries;

    public boolean pageLoaded() {
       try{

           (new WebDriverWait(driver, 20)).until(ExpectedConditions.visibilityOfElementLocated(header));
           return header.isDisplayed();
       }
       catch(Exception e){
           return false;
       }
    }

}

并且您必须按如下所示定义您想要的功能:

public static AppiumDriver<MobileElement> driver;
public static AppiumDriver<MobileElement> setupDesiredCapabilities(String appPackage, String appActivity,
                                                                       String udid, String platformVersion, boolean noReset) {

        DesiredCapabilities caps = new DesiredCapabilities();

        caps.setCapability("deviceName", "Android phone");  //any name
        caps.setCapability("udid", udid);   
        caps.setCapability("platformName", "Android");
        caps.setCapability("platformVersion", platformVersion);
        caps.setCapability("appPackage", appPackage);
        caps.setCapability("appActivity", appActivity);
        caps.setCapability("noReset", noReset);    //optional


        try {
            driver = new AndroidDriver<MobileElement>(new URL(
                    "http://127.0.0.1:4723/wd/hub"), caps);

        } catch (MalformedURLException e) {
            //
        } catch (Exception ex) {
            //
        }

        return driver;
    }
  

确保已定义静态AppiumDriver ,并使用相同的   驱动程序对象以调用每个页面的构造函数。