由Appium上的FluentWait.until引起的“NoSuchMethodError”

时间:2017-08-30 15:14:01

标签: java selenium appium

我开始自动化一个应用程序(在Android和iOS上)。我的想法是使页面对象可重用,所以我使用@AndroidFindBy和@iOSFindBy方法来获取应用程序上的元素。

我为应用程序开发了一些页面对象,我开始编写一些测试。但问题是,每次我必须使用MobileElement时,IntelliJ都会给我一个NoSuchMethodError。 只有在使用@FindBy方法对元素进行实例化和初始化时才会发生这种情况。例如,如果我在方法内部对元素的发现进行硬编码,则它可以正常工作。

这不起作用

import io.appium.java_client.MobileDriver;
import io.appium.java_client.MobileElement;
import io.appium.java_client.android.AndroidElement;
import io.appium.java_client.pagefactory.AndroidFindBy;
import io.appium.java_client.pagefactory.AppiumFieldDecorator;
import io.appium.java_client.pagefactory.SelendroidFindBy;
import io.appium.java_client.pagefactory.iOSFindBy;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.PageFactory;
import org.openqa.selenium.support.ui.WebDriverWait;


public class ActivityMain {

   private final MobileDriver driver;
   private WebDriverWait wait;

   //@iOSFindBy(id = "")
   @SelendroidFindBy(id = "com.testapp.uzapp:id/qrButton")
   public MobileElement qrButton;


   public ActivityMain(MobileDriver driver) {
      this.driver = driver;
      wait = new WebDriverWait(driver, 30);
      PageFactory.initElements(new AppiumFieldDecorator(driver), this);
   }

   public ActivityQRScan goToQRScan() {              
      qrButton.click();
      return new ActivityQRScan(this.driver);
   }
}

但是

此作品不错

package com.userzoom.appium.pageobjects;

import io.appium.java_client.MobileDriver;
import io.appium.java_client.MobileElement;
import io.appium.java_client.android.AndroidElement;
import io.appium.java_client.pagefactory.AndroidFindBy;
import io.appium.java_client.pagefactory.AppiumFieldDecorator;
import io.appium.java_client.pagefactory.SelendroidFindBy;
import io.appium.java_client.pagefactory.iOSFindBy;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.PageFactory;
import org.openqa.selenium.support.ui.WebDriverWait;


public class ActivityMain {

   private final MobileDriver driver;
   private WebDriverWait wait;

   //@iOSFindBy(id = "")
   @SelendroidFindBy(id = "com.testapp.uzapp:id/qrButton")
   public MobileElement qrButton;

   public ActivityMain(MobileDriver driver) {
      this.driver = driver;
      wait = new WebDriverWait(driver, 30);
      PageFactory.initElements(new AppiumFieldDecorator(driver), this);
   }

   public ActivityQRScan goToQRScan() {           
      driver.findElement(By.id("com.userzoom.uzapp:id/qrButton")).click();

      /* This Works too
      WebElement qrButton = driver.findElement(By.id("com.userzoom.uzapp:id/qrButton"));*/
      return new ActivityQRScan(this.driver);
   }
}

给我的错误:

java.lang.NoSuchMethodError: org.openqa.selenium.support.ui.FluentWait.until(Lcom/google/common/base/Function;)Ljava/lang/Object;

at io.appium.java_client.pagefactory.AppiumElementLocator.waitFor(AppiumElementLocator.java:88)
at io.appium.java_client.pagefactory.AppiumElementLocator.findElement(AppiumElementLocator.java:103)
at io.appium.java_client.pagefactory.interceptors.InterceptorOfASingleElement.intercept(InterceptorOfASingleElement.java:57)
at io.appium.java_client.android.AndroidElement$$EnhancerByCGLIB$$c0b591f0.click(<generated>)
at com.userzoom.appium.pageobjects.ActivityMain.goToQRScan(ActivityMain.java:57)
at com.userzoom.appium.testcases.android.QR.QR001.QR001(QR001.java:54)

在maven配置pom上,我有版本21的guava和版本3.5.2的selenium。

2 个答案:

答案 0 :(得分:2)

使用FindBy注释,您应该访问元素的方式是:

@AndroidFindBy(id = "com.testapp.uzapp:id/qrButton")
@iOSFindBy(id = "com.testapp.uzapp:id/qrButton")
@SelendroidFindBy(id = "com.testapp.uzapp:id/qrButton")
public MobileElement qrButton;

应进一步访问:

public ActivityQRScan goToQRScan(){
    qrButton.click(); // no more driver.findElement
}

Appium's unit test非常有理由使用注释。

<强> 修改

如果您正在测试多个Android SDK版本,请注意Android:

  

Selendroid目前捆绑在Appium包中   为Android版本2.3到4.1(API 10到19)提供支持。 Appium   当用户想要运行测试时,会自动切换到Selendroid   这些Android版本。

可能您正在测试的设备(iOS),并不支持Selendroid框架。

何时使用Selendroid或Appium,here是一个很好的阅读。

答案 1 :(得分:0)

将plenium-server的版本更改为3.0.1后随机解决... 3.5.2给了我显然存在的元素的NullPointerExceptions