提问者:小点点

< Closed >无法使用页面工厂和roidFindBy批注识别移动元素


大家好,我正在使用TestNG和Page Object Factory练习移动应用程序自动化。不幸的是,脚本无法找到移动元素。请找到以下代码段,并让我知道您的输入以解决问题。

依赖:

<dependency>
    <groupId>io.appium</groupId>
    <artifactId>java-client</artifactId>
    <version>7.6.0</version>
</dependency>

  <!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
<dependency>
    <groupId>org.seleniumhq.selenium</groupId>
    <artifactId>selenium-java</artifactId>
    <version>3.141.59</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.testng/testng -->
<dependency>
    <groupId>org.testng</groupId>
    <artifactId>testng</artifactId>
    <version>7.4.0</version>
</dependency>

测试类别:

   public class LoginTest extends Demo
{
    
    static AppiumDriver<MobileElement> driver =null;
    @BeforeMethod
    public static void androidSetUp() throws MalformedURLException {
        
        
         DesiredCapabilities caps = new DesiredCapabilities();
        
        
        String appPath = "/Users/hnum/Desktop/MobileAutomation/MobileAutomation/Resources/MG.apk";
        File app = new File(appPath);
        
        caps.setCapability(MobileCapabilityType.DEVICE_NAME, "emulator-5554");
        caps.setCapability(MobileCapabilityType.APP, app.getAbsolutePath());
        caps.setCapability(MobileCapabilityType.AUTOMATION_NAME, "uiautomator2");
        caps.setCapability(MobileCapabilityType.UDID, "emulator-5554");
        caps.setCapability("appWaitDuration",20000);
        caps.setCapability("appWaitForLaunch",false);
        caps.setCapability("autoGrantPermissions",true);
        
        
        driver = new AndroidDriver<MobileElement>(new URL("http://127.0.0.1:4723/wd/hub"),caps);
        
    
        driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
        System.out.println("Execution started");
    }
    
    
    @Test
    public static void Login() throws InterruptedException {
        
        Thread.sleep(20000);
        System.out.println("Test Execution started");
        SelectEnvironment_Page selectEnvironment_Page = new SelectEnvironment_Page(driver);
        selectEnvironment_Page.dropDown_Select_Environment_click();
    }
    

}

页面类别:

**Page Class:**

public class SelectEnvironment_Page 
{
    static public AppiumDriver<MobileElement> driver;
    
    
    public SelectEnvironment_Page(AppiumDriver<MobileElement> driver) {
        this.driver = driver;
        
        PageFactory.initElements(new AppiumFieldDecorator(driver,Duration.ofSeconds(10)), SelectEnvironment_Page.class);
        
    }

    @AndroidFindBy(accessibility = "EnvironmentPopUpSelectEnvironmentLabel")
    MobileElement txt_Select_Environment;
        
    @AndroidFindBy (xpath = "//android.widget.Button[@text='Change Environment']")
    MobileElement dropDown_Select_Environment;
    
    @AndroidFindBy(xpath = "//android.widget.TextView[@text='QA']")
    MobileElement QAEnvironment;
    
    @AndroidFindBy(accessibility = "EnvironmentPopUpChangeEnvironmentButton")
    MobileElement btnChangeEnvironment;
    

    
    public void txt_Select_Environment_Visible(){
        txt_Select_Environment.isDisplayed();
    }

    public void dropDown_Select_Environment_click(){
        dropDown_Select_Environment.click();
    }

    public void QAEnvironment_click() {
        QAEnvironment.click();
    }
    
    public void btnChangeEnvironment_click() {
        btnChangeEnvironment.click();
    }
    
}

得到下面的错误:

开始执行

测试执行已开始

失败:登录

java.lang.NullPointerException:无法调用“io.appium.java_client。MobileElement.click()“ 因为 ”this.dropDown_Select_Environment“ 在 Pages.SelectEnvironment_Page.dropDown_Select_Environment_click(SelectEnvironment_Page.java:55) at TestCases.LoginTest.Login(LoginTest.java:62) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) at java.base/java.lang.reflect.Method.invoke(Method.java:577) at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:133) at org.testng.internal.TestInvoker.invokeMethod(TestInvoker.java:598) at org.testng.internal.TestInvoker.invokeTestMethod(TestInvoker.java:173) at org.testng.internal.MethodRunner.runInSequence(MethodRunner.java:46) at org.testng.internal.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:824) at org.testng.internal.TestInvoker.invokeTestMethods(TestInvoker.java:146) atorg.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146) at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:128) at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) at org.testng.TestRunner.privateRun(TestRunner.java:794) at org.testng.TestRunner.run(TestRunner.java:596) at org.testng.SuiteRunner.runTest(SuiteRunner.java:377) at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:371) atorg.testng.SuiteRunner.privateRun(SuiteRunner.java:332) at org.testng.SuiteRunner.run(SuiteRunner.java:276) at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:53) at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:96) at org.testng.TestNG.runSuitesSequentially(TestNG.java:1212) at org.testng.TestNG.runSuitesLocal(TestNG.java:1134) at org.testng.TestNG.runSuites(TestNG.java:1063) at org.testng.TestNG.run(TestNG.java:1031) atorg.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115) at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251) at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)


共1个答案

匿名用户

问题得到了解决,因此长此一问。

解决方法:它是Java,Appium Java客户端版本不匹配。现在,我能够使用pom方法找到元素。目前它适用于以下依赖版本:

Java版本:11.0.15.1

Java-客户端:7.6.0

硒-爪哇:3.141.59

测试:7.4.0