Menu

Tuesday, August 11, 2020

[Android - Espresso] การกดปุ่ม Allow บนหน้าต่างขอ Permission โดยไม่จำเป็นต้องรู้ชื่อของ Permission
[Android - Espresso] How to Click Allow Permissions with No Need to Know Permission Name

การทำ UI test automation ด้วย Espresso บางครั้งเราต้องเปิดใช้งานกล้องถ่ายรูป ถ้าหากเปิดใช้งานจาก application ของเราเป็นครั้งแรก สิ่งหนึ่งที่เราต้องเจอแน่นอน คือ modal สำหรับขอ permission ให้ application ของเราสามารถใช้งานกล้องดังภาพข้างล่างนี้


ด้วยข้อจำกัดของ Espresso ที่ไม่สามารถทำ action กับ element ที่อยู่ภายนอก application ได้ เราจึงต้องใช้ UI automator ช่วยในการกดปุ่ม Allow แทน โค้ดข้างล่างนี้จะกดปุ่ม Allow ให้เราโดยอัตโนมัติ ถ้าหากปุ่มดังกล่าวปรากฏอยู่
private val device: UiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())

fun allowPermissionsIfNeeded() {
    if (Build.VERSION.SDK_INT >= 23) {
        val allowPermissions = device.findObject(UiSelector().text("Allow"))
        if (allowPermissions.exists()) {
            try {
                allowPermissions.click()
            } catch (e: UiObjectNotFoundException) {

            }
        }
    }
}
เนื่องจากเป็นการกดปุ่ม Allow โดยไม่สนใจว่า เป็นการขอ permission ใด จึงสามารถนำไปใช้กับการขอ permission อื่นๆได้ เช่น การเลือกรูปจาก gallery, การใช้งาน location เป็นต้น

สำหรับข้อมูลเพิ่มเติม สามารถอ่านได้ที่ https://stackoverflow.com/questions/33929937/android-marshmallow-test-permissions-with-espresso

Thursday, August 6, 2020

[Android - Espresso] การติดตั้ง Java เพื่อรัน uiautomatorviewer
[Android - Espresso] How to Install Java to Run uiautomatorviewer

uiautomatorviewer ใช้ในการหารายละเอียดของ element ที่ปรากฎบนหน้าจอ

โดยปกติแล้ว uiautomatorviewer จะอยู่ที่ {android_sdk_path}\tools\bin 
โดยที่ {android_sdk_path} บน Windows จะอยู่ที่ C:\Users\{username}\AppData\Local\Android\Sdk

ถ้าหากรัน uiautomatorviewer แล้วได้ error ตามด้านล่างนี้
-Djava.ext.dirs=/Users/<Username>/Library/Android/sdk/tools/lib/x86_64:/Users/<Username>/Library/Android/sdk/tools/lib is not supported.  Use -classpath instead.
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
สาเหตุที่ทำให้เกิด error เนื่องจาก version ของ Java ที่ติดตั้งอยู่ในเครื่องไม่เข้ากับ version ที่ uiautomatorviewer ใช้รัน

วิธีแก้ error คือ เปลี่ยนไป Java version 8 โดยดาวน์โหลดได้จาก https://www.java.com/en/download/

หมายเหตุ ถ้าดาวน์โหลด Java จาก https://www.oracle.com/java/technologies/javase-downloads.html จะเกิด error ข้างต้น

Wednesday, August 5, 2020

[Javascript] จุดสามจุดใน Javascript หมายถึงอะไร
[Javascript] What is Three Dot in Javascript

หลังจากรีวิวโค้ด Typescript แล้ว พบโค้ดตามข้างล่างนี้

ทำให้เกิความสงสัยว่า ... (จุดสามจุด) หน้าชื่อตัวแปรนั้นมีความหมายอย่างไร

เมื่อหาข้อมูลเพิ่มเติม จุดสามจุดหน้าชื่อตัวแปรนั้นมีใช้อยู่ 2 แบบ ดังนี้

Rest Parameters

ใช้รับค่าแทน parameter ที่เหลืออยู่ นอกเหนือจาก parameter อื่นๆที่มีการกำหนดตัวแปรมารับ โดยตัวแปรนี้จะเป็น array ของ parameter

ตัวอย่าง เช่น
function test(...params){
    console.log(params)
}
function test2(a, b, ...params){
    console.log(params)
}
test(1, 2, 3, 4)  // [1, 2, 3, 4]
test2(1, 2, 3, 4)  // [3, 4]

Spread Operators

ใช้กระจาย item ใน array ออกมา

ตัวอย่าง เช่น
var input = [1, 2, 3, 4]
[...input, 5, 6]  // [1, 2, 3, 4, 5, 6]

อ้างอิงจาก https://dev.to/sagar/three-dots---in-javascript-26ci

Monday, August 3, 2020

[Android - Espresso] การจัดการ System Animation ของ Emulator
[Android - Espresso] Managing Emulator System Animations

การรัน Espresso โดยเปิด system animation เอาไว้ จะทำให้เกิด exception ดังนี้
androidx.test.espresso.PerformException: Error performing 'single click' on view 'Animations or transitions are enabled on the target device.
วิธีแก้ไข exception นี้ คือ ต้องปิด system animation ก่อนรัน Espresso Test

วิธีที่ง่ายที่สุดสำหรับการปิด system animation คือ รันคำสั่งต่อไปนี้ใน Terminal (Powershell สำหรับ Windows)
adb shell settings put global window_animation_scale 0.0
adb shell settings put global transition_animation_scale 0.0
adb shell settings put global animator_duration_scale 0.0
นอกจากการปิด system animation แล้ว ยังมีการตั้งค่าอื่นสำหรับ UI test automation อีก สามารถอ่านเพิ่มเติมได้ที่ https://testyour.app/blog/emulator

หมายเหตุ กรณีที่ทดสอบใน device จริง สามารถใช้คำสั่งข้างต้นเพื่อปิด system animation ได้เช่นกัน แต่ต้องเชื่อมต่อ device เข้ากับเครื่องที่รัน Espresso เสียก่อน

[Android - Espresso] สิ่งที่เราสามารถทำกับ View ได้
[Android - Espresso] View Action

View หมายถึง UI component ที่แสดงอยู่บน Application ใน Android

เราสามารถใช้ Espresso ในการเขียนจำลอง action ที่เราจะทำกับ view ที่ต้องการได้ ดังนี้
onView({component_selector}).perform({action})
ในกรณีที่ต้องการทำ action หลายอย่างต่อเนื่องกัน เราสามารถใช้คำสั่งดังนี้
onView({component_selector}).perform({action1}, {action2}, ..., {actionN})
โดยที่
  • {component_selector} เป็นคำสั่งสำหรับเลือก component ที่เราจะทำ action ด้วย
  • {action} เป็น action ที่เราจะทำกับ component ที่เราเลือก