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

问题描述:

我开始自动化一个应用程序(在Android和iOS上)。这个想法是使页面对象可重用,所以我使用@AndroidFindBy和@iOSFindBy方法来获取应用程序上的元素。由Appluent上的FluentWait.until引起的“NoSuchMethodError”

我开发了一些应用程序的页面对象,我开始写几个测试。但问题是,每次我必须使用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有番石榴,在版本3.5.2有硒。

在POM改变硒服务器的版本3.0.1后随机解决...... 3.5.2是给我的元素,甚至是NullPointerException异常明显存在

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

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

Appium's unit test很好的证明了注释的用法:

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

应作为进一步访问。


编辑

注为Android,如果你多的Android SDK版本的测试:

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

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

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

+0

我有困难的时候怎么看这不同于OP在不起作用的示例中所做的事情? – mrfreester

+0

@mrfreester有多种访问WebElement的方法。OP正在试图同时访问实现多种方式的相同元素。在给定的例子中, – nullpointer

+1

不起作用,我没有看到'driver.findElement'的任何实例。在这个例子中,我只能看到两者都起作用,看起来注释只留在那里,但没有被使用,因为OP使用'driver.findElement'来代替。如果我理解正确,问题是为什么在使用注释版本时发生错误,就像在答案中一样。 – mrfreester