Appium 页面对象模型返回垃圾收集

问题描述 投票:0回答:1

我对 Appium 还很陌生。我目前按照一些视频创建 POM Appium android 测试。当我尝试运行测试时,它会抛出此错误:

java.lang.IllegalStateException:元素 By.id: nameText 不再可定位,因为其上下文已被垃圾收集

有关更多信息,我在此处附加了我的页面对象类:

public class LoginPage extends AndroidGestures {
    
    AndroidDriver driver;
    
    public LoginPage(AndroidDriver driver) {
        super(driver);
        this.driver = driver;
        PageFactory.initElements(new AppiumFieldDecorator(driver), this);
    }
    
    @AndroidFindBy(id="com.androidsample.generalstore:id/nameField")
    private WebElement nameText;
    
    @AndroidFindBy(id="com.androidsample.generalstore:id/radioMale")
    private WebElement genderMale;
    
    @AndroidFindBy(id="com.androidsample.generalstore:id/radioFemale")
    private WebElement genderFemale;
    
    @AndroidFindBy(id="com.androidsample.generalstore:id/btnLetsShop")
    private WebElement loginButton;
    
    @AndroidFindBy(id="android:id/text1")
    private WebElement country;
    
    public void setName(String name) {
        nameText.sendKeys(name);
        driver.hideKeyboard();
    }
    
    public void setGender(String gender) {
        if(gender.toLowerCase().equals("female")) {
            genderFemale.click();
        } else if (gender.toLowerCase().equals("male")) {
            genderMale.click();
        }
    }
    
    public void selectCountry(String cntr) {
        country.click();
        scrollDownToTextAndClick(cntr);
    }
    
    public void login() {
        loginButton.click();
    }

}

测试班:

public class BasicStore extends BaseClass {
    
    LoginPage lgp = new LoginPage(driver);
    
    @Test (priority = 1, description = "Enter the general store")
    public void POM001() {
        
        // filling the form
        lgp.setName("Ayumi"); --> I assume this is where things go wrong
        lgp.setGender("female");
        lgp.selectCountry("Bahamas");
        lgp.login();
        
        threadSleep(3);
        
        // assert that we enter the correct page
        Boolean page = driver.findElement(AppiumBy.id("com.androidsample.generalstore:id/appbar_btn_cart")).isDisplayed();
            Assert.assertTrue(page);
    }
}

我尝试过的一些事情:

  • [编辑] 添加 thread.sleep() 以等待启动屏幕完成
  • [编辑]使用显式等待该元素可见(10秒)
  • 从模拟器重新安装应用程序
  • 创建具有更大 VM 堆的新虚拟设备

由于我环顾四周,没有发现任何与此相关的内容(或者我太不耐烦了),所以出现了两个问题:

  • 造成这种情况的主要原因是什么?
  • 正如我从 Android studio 设备管理器中看到的,VM 堆似乎与垃圾收集有关。如果可能的话,鉴于应用程序非常简单,就 Appium 测试而言,建议的 VM 堆大小是多少?

非常感谢您的时间和答复!

java appium appium-android
1个回答
0
投票

在测试类中,尝试放置 LoginPage lgp = new LoginPage(driver); 在 public void POM001() {} 内,那么它应该可以工作

public class BasicStore extends BaseClass {
    @Test (priority = 1, description = "Enter the general store")
    public void POM001() {
        LoginPage lgp = new LoginPage(driver);
        // filling the form
        lgp.setName("Ayumi"); --> I assume this is where things go wrong
        lgp.setGender("female");
        lgp.selectCountry("Bahamas");
        lgp.login();
        
        threadSleep(3);
        
        // assert that we enter the correct page
        Boolean page = driver.findElement(AppiumBy.id("com.androidsample.generalstore:id/appbar_btn_cart")).isDisplayed();
            Assert.assertTrue(page);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.