มาเขียน Appium ด้วย JAVA กันเถอะ

Phatcharaphan Ananpreechakun
odds.team
Published in
5 min readApr 12, 2022

Appium เป็น framework open-source สำหรับพัฒนา automation test บน mobile iOS, Android และ Windows desktop platforms

โดย Appium จะประกอบไปด้วย 2 ส่วน

  1. Appium server ทำหน้าที่เป็นตัวกลางแปลงชุดคำสั่งที่ Appium Client ส่งเข้ามาและแปลงไปใช้ทั้งใน iOS และ Android
  2. Appium client สามารถรองรับได้หลายภาษา Java, Ruby, Python, PHP, JavaScript, and C# และจะส่งคำสั่งไปหา Appium server ด้วย JSON ซึ่งคำสั่งที่ส่งไปหานั้น เช่น ต้องการให้ click ปุ่มบนหน้าจอ

ถึงแม้ว่าเราจะไม่ใช้ Appium ในการทำ Automation test บนฝั่ง Android และ iOS เราก็สามารถใช้ Native automation framework ในการพัฒนา Automation test ในแต่ละ Platform ได้อยู่แล้ว

ซึ่งใน iOS ก็จะเป็น XCUITest ที่เราสามารถทำ Automation test บน iOS device ได้ เราจะใช้ xcode และก็ภาษา swift ในการพัฒนา และ Android ก็จะมี espresso ที่เราสามารถทำ Automation test บน Android device ได้เช่นกัน ก็จะใช้ Android studio และเขียนด้วยภาษา Kotlin หรือ Java ในการพัฒนา

ข้อเสียก็คือเราต้องเรียนภาษา swift และจะใช้ได้แค่เฉพาะ iOS เท่านั้น และต้องเรียนภาษา Kotlin หรือ Java และจะใช้ได้แค่ใน Android เท่านั้น

นั้นเป็นเหตุผลที่ตัว Appium server เป็นเหมือนตัวแปลงที่รับคำสั่งมาจาก Appium client เช่น ต้องการให้ click ปุ่มบนหน้าจอ และนำไปแปลงคำสั่งให้สามารถใช้ได้ทั้งใน iOS และ Android ซึ่งจะเห็นว่าเราเขียน code ขึ้นมาแค่ชุดเดียวและสามารถใช้ได้ทั้งใน iOS และ Android และการเรียนรู้ค่อนข้างง่ายกว่าและมีภาษาให้เราสามารถเลือกสรรได้เยอะเลย ซึ่งเป็นข้อดีของ Appium

ข้อเสียของ Appium ก็มีเช่นกัน เราจะเห็นว่าจะต้องเอา code จาก Appium client ส่งต่อไปยัง Appium server และก็นำไปแปลงให้สามารถใช้ได้ทั้งใน iOS และ Android ซึ่งจะทำงาน 2 ต่อและก็แปลง code อีกทำให้ความเร็วในการ run ก็จะช้ากว่าตัว Native automation framework

มาเริ่มติดตั้ง Appium และ AppiumLibrary

  1. Download Appium Desktop Apps (เลือกตาม OS ที่เราใช้เลย) จาก Link ซึ่งจะเป็น Appium server

เมื่อ Download มาเสร็จแล้ว จะต้องไป Allow ก่อนน่ะ เข้าไปใน icon mac -> System Preferences -> Security & Privacy ไม่งั้นจะใช้ไม่ได้

หลังจากนั้นเราก็จะเปิดได้ หน้าตา Appium server ก็จะเป็นแบบนี้

2. ต่อให้ลง Appium Inspector โดยกดเข้าไปที่นี่

ให้เลือก Latest และก็เข้าไปให้เลือกตาม OS ที่เราใช้งาน

จะต้องไป Allow ก่อนน่ะ เข้าไปใน icon mac -> System Preferences -> Security & Privacy ไม่งั้นจะใช้ไม่ได้

เมื่อลงสำเร็จแล้วเราจะได้หน้าจอแบบนี้

3. ถ้าใครยังไม่ลง Android studio สามารถเข้า Link

Setup ANDROID_HOME โดยพิมพ์คำสั่งนี้ใน command line

vi ~/.zshrc หรือ vi ~/.bash_profile

เพื่อเปิดไฟล์ในการ config ANDROID_HOME หลังจากนั้นให้พิมพ์

export ANDROID_HOME=/Users/YourName/Library/Android/sdk
export PATH=$PATH:$ANDROID_HOME/tools
export PATH=$PATH:$ANDROID_HOME/platforms
export PATH=$PATH:$ANDROID_HOME/platform-tools
export ANDROID_SDK=$ANDROID_HOME

4. ถ้าใครยังไม่ลง java สามารถเข้าไป download ที่นี่

เมื่อลงเสร็จแล้วสามารถ check version ด้วยคำสั่ง

java -version

Setup $JAVA_HOME โดยพิมพ์คำสั่งนี้ใน command line

หา path ของ JAVA HOME สามารถพิมพ์คำสั่ง

where java

vi ~/.zshrc หรือ vi ~/.bash_profile

export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-14.0.2.jdk/Contents/Home

5. ต่อมาให้เราลง robot framework สามารถเข้าไปดูได้ที่นี่ถ้าใครยังไม่ได้ลง

6. ต่อมาให้เราลง Robot Framework AppiumLibrary เข้าไปที่ command line และพิมพ์คำสั่ง

pip install robotframework-appiumlibrary

เราสามารถเชคว่าเราลง robotframework-appiumlibrary หรือยังด้วยคำสั่ง

pip list

ต่อมาเริ่มเชื่อมต่อ Appium กับ Android กัน

  1. กดปุ่ม Start server เลย

2. เมื่อกดเข้ามาแล้วจะเจอหน้าจอแบบนี้

3. และก็ให้เปิด Appium Inspector หน้าจอจะเป็นแบบนี้

ให้กรอกข้อมูล Appium Desired Capabilities เพื่อเชื่อมไปยัง Device ที่เราต้องการตอนนี้จะไปเชื่อมกับ Android เครื่องจริง

Appium Desired Capabilities

ก่อนที่เราจะเริ่มทำงานจะต้องสร้าง Session ก่อน เพื่อเป็นการไปบอก Appium Server ว่า ช่วยสร้าง Session ให้ 1 session ซึ่งอาจจะเปรียบเสมือนว่าเราไปเปิด Tab บน Browser ขึ้นมา ซึ่งเราต้องจะต้องกรอก url ว่าต้องการจะไปที่ path อะไร ซึ่ง Session Appium นั้นหลักการทำงานก็เหมือนกัน

การที่เราสร้าง Session Appium ขึ้นมา 1 session เราก็จะต้องบอกว่า session นั้นเป็นของอะไรและต้องการจะทำงานอย่างไร เช่น ต้องการ Run test บน HUAWEI P30 และ application ที่ต้องการจะเปิดชื่อว่า com.appium.appiumtest และให้เริ่มต้นหน้าจอที่ com.appium.appiumtest.MainActivity หลังจากนั้น Appium Server ก็จะทำการสร้าง Session และได้ session id กลับมาให้เรา เมื่อเราได้ session id แล้ว เราสามารถให้

Appium Client ส่งคำสั่งที่ต้องการ เช่น บอกว่า click ปุ่มบนหน้าจอและเพื่อไปยังหน้าถัดไป โดยใช้ session id ที่เราสร้างเมื่อครู่นี้ หลังจากนั้นเมื่อ Appium Server ได้รับคำสั่งว่าต้องการจะไปเปิด Android HUAWEI P30 และ application ชื่อว่า com.appium.appiumtest หลังจากนั้น Appium Server ก็จะกดปุ่มให้

ซึ่งในส่วนของ Desired Capabilities นั้นมีหลากหลายอันมากให้เราสามารถที่จะตั้งค่าต่าง สามารถเข้าไปดูเพิ่มเติมได้ที่นี่

หรือสามารถตั้งค่าตามนี้ได้เลย

  • Remote host = 127.0.0.1
  • Remote path = /wd/hub

กด icon ดินสอใน JSON Representation และใส่ข้อมูลตามนี้

ปล. config ในนี้แปรผันตามเครื่อง Android ที่ใช้และ package name

{
"appium:deviceName": "HUAWEI P30",
"appium:platformVersion": "10",
"platformName": "Android",
"appium:appPackage": "com.appium.appiumtest",
"appium:appActivity": "com.appium.appiumtest.MainActivity"
}

เมื่อ config ทั้งหมดแล้วจะได้หน้าตาแบบนี้และกดปุ่ม start session

เมื่อกดเข้ามาแล้วจะเจอหน้าจอของ App ที่ต้องการทดสอบและเราก็สามารถ Inspect element ต่างๆบนหน้าจอได้ ถ้ามาถึงตรงนี้แล้วแสดงว่า Appium กับ Android เชื่อมต่อกันแล้ว

เรามาเริ่มเขียน Code ด้วย Java

  1. Create project

2. ไปที่ file build.gradle เพิ่ม dependencies เข้าไป

implementation group: 'io.appium', name: 'java-client', version: '7.1.0'
implementation group: 'org.seleniumhq.selenium', name: 'selenium-java', version: '3.141.0'
implementation group: 'org.testng', name: 'testng', version: '7.3.0'

3. สร้าง file = BaseClient.java ใน package test สำหรับใช้เป็นตัวกลางในแต่ละ class

  • ใน function setup จะเป็นการบอกว่าก่อนที่จะเริ่มรัน test case (ตรง @BeforeTest)ให้ไปเชื่อมต่อกับ Android ให้หน่อยตามและถ้าต้องการให้ไปเชื่อมต่อกับ Device อื่นก็มาเปลี่ยนที่นี่
  • ใน function teardown นั้นจะบอกว่าหลังจากที่รันทุก test case (ตรง @AfterTest) เสร็จแล้วก็ให้ปิด app ให้หน่อย

3. สร้าง File สำหรับทดสอบ Test101.java สำหรับทดสอบ application ที่เราต้องการและทำการ extends class BaseClient เพื่อใช้ function หรือตัวแปลที่ทาง BaseClient provideไว้ให้ใช้ เช่น จะสามารถเรียกใช้ตัวแปร driver ของ BaseClient ได้

  • ใน function testValidateLabelAndClickButton จะทำการเชคว่า label ที่แสดงบนหน้า App นั้นแสดงคำว่า Hello Appium หรือเปล่า และจะทำการกดปุ่ม

4. กดที่ Edit Configurations เพื่อเพิ่ม Listeners สำหรับออก Report

config ตามภาพข้างล่าง

เมื่อเรากด icon play แล้วก็ทำการสร้าง folder test-output ขึ้นมาให้

และนำไฟล์ emailable.report.html ไปเปิดใน browser ก็จะได้ report หน้าตาแบบนี้

จะเห็นว่าจะมีการสรุปว่าใน Test case ที่ได้ทดสอบนั้นมีละ test case เป็นอย่างไรบ้าง มี List ของ test case ที่ได้ทดสอบว่ามีชื่ออะไรบ้าง ความเร็วในการทดสอบของ test case นั้น

อันนี้จะทำการปิด function driver.quit(); ไว้ก่อนเพื่อทดสอบให้เห็นว่าเมื่อมีการกดปุ่มจะไปยังหน้าต่อไปดังภาพ

ปล. สุดท้ายแล้วถ้าผิดพลาดในส่วนไหนต้องขออภัยด้วยน๊าา เจอกันใหม่บทความต่อไป

--

--