(愚蠢地)将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。结果:没有变化,报告了相同的错误。
答案 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 ,并使用相同的 驱动程序对象以调用每个页面的构造函数。