当前位置: 首页 > 知识库问答 >
问题:

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

诸葛茂勋
2023-03-14

大家好,我正在使用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个答案

濮阳奇逸
2023-03-14

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

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

Java版本:11.0.15.1

Java-客户端:7.6.0

硒-爪哇:3.141.59

测试:7.4.0

 类似资料:
  • 问题内容: 请解释webdriver页面工厂概念中@FindAll和@FindBys批注之间的区别。 问题答案: 当我们具有多个标准来标识一个或多个WebElement对象时,可以在这些情况下使用这些注释。 @FindBys: 当所需的WebElement对象需要匹配所有给定条件时,请使用@FindBys批注 @FindAll: 必要时,WebElement对象需要至少匹配给定条件之一,请使用@F

  • 创建基类: 然后初始化页面对象: 然后创建测试用例: 输出: 请告诉我怎么了。

  • 我在eclipse中签出了一个gradle项目,但它不能识别任何注释 其中配置是注释。 所有与注释对应的导入也失败,错误如下: 包含所有文件的整个项目将填充错误。但在Intellij中,同样的项目不存在这样的问题。我错过了Eclipse的哪一个设置? gradle build工作很好,尽管

  • 我正在android的clock应用程序上尝试一段appium自动化代码,但我的代码倾向于跳过滚动逻辑。我还尝试了findelement()和gettext()来标识该元素,但仍然没有成功。代码如下:

  • 我是一名新的测试工程师,一直在阅读页面对象模型并实现它们,并不断遇到页面工厂。我知道页面工厂是一个POM,它提供了额外的功能,例如在调用页面工厂时实例化所有元素,以及更可读的测试代码(尽管我不完全赞同可读性)。明确地说,我对POM很感兴趣。代码的可重用性和相对容易的维护非常好,我正在朝着这个方向努力。 我要回答的两个问题是: 为什么我要实例化所有元素,而不是动态地进行

  • 问题内容: 我刚刚开始在在线课程中学习Selenium Webdriver。 因为我是测试和Java编程的初学者,所以请帮我。 我试图运行自动化代码以在Facebook登录页面中自动填写用户名。最初运行该程序已成功输出。 但是在第二次尝试时,我遇到了以下错误 之后,我用Google搜索并找到了这个SO 问题,]复制 到我的代码中。 但是,我得到这个下面的错误。 我的问题是为什么Selenium驱动