2017-08-30 25 views
1

我開始自動化一個應用程序(在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有硒。

回答

0

在POM改變硒服務器的版本3.0.1後隨機解決...... 3.5.2是給我的元素,甚至是NullPointerException異常明顯存在

2

使用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

相關問題