2

我試圖測試我的應用程序google signup/login feature,particularly用戶嘗試添加未在對話框中列出的新帳戶的情況。使用UiAutomator鍵入文本Android

使用的設置對應於默認的谷歌「添加帳戶」設置。

我遇到的問題是,我似乎無法當應用程序需要它鍵入電子郵件,然後按「下一步」按鈕

這裏是我的代碼

 // Find add account button using uiautomator 
     UiObject addButton = mDevice.findObject(new UiSelector().resourceId("android:id/button2")); 
     assertEquals(true, addButton.exists()); 
     // Click the button 

     // Fill email text box 
     UiObject emailBox = mDevice.findObject(new UiSelector().resourceId("identifierId")); 
     emailBox.waitForExists(TIMEOUT); 
     assertEquals(true, emailBox.exists()); 
     emailBox.legacySetText(googleEmail); 

     // Find 'NEXT' Button 
     UiObject nextButton = mDevice.findObject(new UiSelector().resourceId("identifierNext")); 
     assertEquals(true, nextButton.exists()); 
     nextButton.click(); 

     // Fill password 
     UiObject passwordBox = mDevice.findObject(new UiSelector().resourceId("password")); 
     passwordBox.waitForExists(TIMEOUT); 
     assertEquals(true, passwordBox.exists()); 
     emailBox.clearTextField(); 
     emailBox.setText(googlePassword); 

     // Find 'NEXT' Button 
     nextButton = mDevice.findObject(new UiSelector().resourceId("next")); 
     assertEquals(true, nextButton.exists()); 
     nextButton.click(); 

     // Find 'ACCEPT' Button 
     nextButton = mDevice.findObject(new UiSelector().resourceId("next")); 
     nextButton.waitForExists(TIMEOUT); 
     assertEquals(true, nextButton.exists()); 
     nextButton.click(); 

應用程序進入電子郵件應輸入的屏幕,它不會在"assertEquals(true, emailBox.exists());"上失敗,所以我相信該應用程序正在檢測到它。

我也試過使用"setText"而不是"legacySetText"並且字符串被注入,但是然後「下一個」按鈕沒有被啓用。

此外,有時彈出鍵盤和文本鍵入,但這似乎是隨機的,我不能隨意複製它。

我在這裏做錯了什麼?

編輯:

我評論的代碼的其餘部分,改變了按鈕的斷言和預期的「下一步」按鈕不會被啓用,因爲沒有文本被鍵入。

// Find add account button using uiautomator 
     UiObject addButton = mDevice.findObject(new UiSelector().resourceId("android:id/button2")); 
     assertEquals(true, addButton.exists()); 
     // Click the button 
     addButton.click(); 

     // Fill email text box 
     UiObject emailBox = mDevice.findObject(new UiSelector().resourceId("identifierId").descriptionContains("Enter your email ")); 
     emailBox.waitForExists(TIMEOUT); 
     assertEquals(true, emailBox.exists()); 
     emailBox.legacySetText(googleEmail); 

     // Find 'NEXT' Button 
     UiObject nextButton = mDevice.findObject(new UiSelector().resourceId("identifierNext")); 
     assertEquals(true, nextButton.isEnabled()); 
     nextButton.click(); 

錯誤說,它預計真實的,但結果卻是假的「的assertEquals(真,nextButton.isEnabled());」行

編輯2: 我發現問題是谷歌的登錄頁面解釋文本的方式。

隨着uiautomatorviewer我抓住了視圖的屏幕截圖,並檢查了我手動編寫了一些文本的EditText字段。我發現我寫的文本沒有填充text屬性,而是轉到content-description屬性。

我現在的問題是我只找到一種方法來編輯框架中的setText方法的文本。我嘗試點擊視圖,然後設置文本,但沒有成功。有沒有辦法改變uiautomator的內容描述?

+0

你是否可以用'adb shell input text your_text'鍵入你的文本? – Rilwan

回答

1

代替:

emailBox.legacySetText(googleEmail); 

嘗試寫這樣的代碼:

// click the admin button 
new UiObject(new UiSelector().text("admin")).click(); 
// set pwd text 
new UiObject(new UiSelector().description("pwdEditText")).setText("admin"); 
// click login button 
new UiObject(new UiSelector().description("loginButton")).click(); 

我想你可能也發現Espresso編寫測試非常有用的。我認爲它更適合這個目的。 uiatomator會更好地獲得permisson或通知或屏幕鎖定,它的作品像魅力與Espresso。兩者都是由谷歌開發:

檢查這個網站,以瞭解更多關於他們:https://google.github.io/android-testing-support-library/

檢查EditText與咖啡:Updating an EditText with Espresso

希望它能幫助

+0

我試過在使用uiautomator執行此測試之前,但我無法獲取咖啡來檢測webview中的元素。 我相信問題與設置的文本有關,因爲當我手動輸入文本時填充的字段是內容描述。 – PeachMode

+0

用於測試Espresso中的WebView您需要使用espresso-web - 是的espresso有一個特定的圖書管理員用於此視圖。同時檢查上面的新鏈接 – piotrek1543

0

我能夠登入與Gmail並且請刪除設備中任何已配置的Gmail帳戶。 100%工作和日常成功與西裝運行。

final UiDevice mDevice=    
UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); 
final int timeOut = 1000 * 60; 
mDevice.wait(Until.findObject(By.clazz(WebView.class)), timeOut); 

    // Set Login 
    UiObject emailInput = mDevice.findObject(new UiSelector() 
      .instance(0) 
      .className(EditText.class)); 

    emailInput.waitForExists(timeOut); 
    emailInput.setText("your - Email");// please set your email-id here 
    // Confirm Button Click 
    UiObject Next = mDevice.findObject(new UiSelector() 
      .resourceId("identifierNext")); 
    Next.waitForExists(timeOut); 
    Next.click(); 

    // Set Password 
    UiObject passwordInput = mDevice.findObject(new UiSelector() 
      .resourceId("password")); 

    passwordInput.waitForExists(timeOut); 
    passwordInput.setText("password");// type your password here 

    // Confirm Button Click 
    Next = mDevice.findObject(new UiSelector() 
      .resourceId("passwordNext")); 
    Next.waitForExists(timeOut); 
    Next.click(); 

    UiObject nextButton = mDevice.findObject(new UiSelector() 
      .resourceId("next")); 
    nextButton.waitForExists(timeOut); 
    nextButton.click(); 
    UiObject layout = mDevice.findObject(new UiSelector() 
    .resourceId("suw_layout_content")); 
    layout.waitForExists(timeOut); 
    ElapsedTimeIdlingResource.WaitForScreenContentLoad(5); 
    UiObject buttonNext = mDevice.findObject(new UiSelector() 
      .className(Button.class)); 
    buttonNext.waitForExists(timeOut); 
    assertEquals(false, nextButton.exists()); 
    buttonNext.click(); 
    ElapsedTimeIdlingResource.WaitForScreenContentLoad(50); 
相關問題