Appium ความสามารถที่ต้องการสำหรับ Android ผู้เอาอย่าง
⚡ สรุปอย่างชาญฉลาด
ความสามารถที่ต้องการคือคู่คีย์-ค่า Appium เมื่อไคลเอ็นต์เปิดเซสชัน มันจะส่งข้อมูลไปยังเซิร์ฟเวอร์ เพื่อแจ้งให้เซิร์ฟเวอร์ทราบว่าควรทำการทดสอบอัตโนมัติกับแพลตฟอร์ม อุปกรณ์ ไดรเวอร์ และแอปพลิเคชันใด

ความสามารถที่ต้องการคืออะไร
'ความสามารถที่ต้องการ' ช่วยให้เราปรับเปลี่ยนพฤติกรรมของเซิร์ฟเวอร์ระหว่างการทำงานอัตโนมัติ Appium มันคือแฮชแมป หรือคู่คีย์-ค่า ที่ใช้ในการส่งคำสั่งไปยัง Appium เซิร์ฟเวอร์ที่คำสั่งของไคลเอ็นต์ทุกคำสั่งทำงานในบริบทของเซสชัน
ตัวอย่างเช่น ลูกค้าส่งคำขอ POST/session ที่มีออบเจ็กต์ JSON ไปยัง Appium เซิร์ฟเวอร์
ดังนั้น ในการส่งคำขอหรือรักษาการเชื่อมต่อกับเซิร์ฟเวอร์ จะต้องใช้ชุดคู่คีย์และค่า ซึ่งเรียกว่า 'ความสามารถที่ต้องการ' (Desired Capabilities)
import io.appium.java_client.AppiumDriver; import org.openqa.selenium.remote.DesiredCapabilities; { DesiredCapabilities capabilities = new DesiredCapabilities(); capabilities.setCapability("deviceName","Android Emulator"); capabilities.setCapability("platformVersion", "4.4"); }
บทบาทสำคัญของความสามารถที่ต้องการ
- 'DesiredCapabilities' ช่วยให้ผู้ใช้ควบคุมการร้องขอเซสชันกับเซิร์ฟเวอร์ได้ ตัวอย่างเช่น สำหรับเซสชัน iOS เราตั้งค่า capability platformName = iOS และสำหรับเซสชันอื่นๆ เราตั้งค่า capability platformName = iOS Android ชื่อแพลตฟอร์มเซสชัน = Android.
- 'DesiredCapabilities' ใช้สำหรับตั้งค่าอินสแตนซ์ของ WebDriver เป็นต้น FirefoxDriver, ChromeDriver หรือ InternetExplorerDriver
- DesiredCapability มีประโยชน์มากสำหรับ Selenium Grid คือระบบที่ใช้สำหรับรันกรณีทดสอบต่างๆ บนเบราว์เซอร์และระบบปฏิบัติการที่แตกต่างกัน โดยศูนย์กลางของ Grid จะชี้ไปยังโหนดที่เกี่ยวข้องตามความสามารถที่ระบุไว้ โหนดต่างๆ ถูกกำหนดโดยใช้วิธีการของคุณสมบัติ 'set':
DesiredCapabilities obj = new DesiredCapabilities(); obj.setBrowserName("firefox"); obj.setVersion("18.0.1"); obj.setPlatform(org.openqa.selenium.Platform.WINDOWS);
- 'DesiredCapabilities' คือแพ็กเกจที่กำหนดโดยไลบรารี ก่อนที่จะใช้ 'DesiredCapabilities' จะต้องนำเข้าจากไลบรารีด้านล่างก่อน
Org.openqa.selenium.remote.DesiredCapabilities
Appium รองรับทั้ง Android และ iOS ดังนั้นจึงมีชุดแยกต่างหาก Appium ความสามารถของเซิร์ฟเวอร์สำหรับแต่ละแพลตฟอร์ม
ตารางด้านล่างแสดงตัวอย่างการใช้งานทั่วไปบางส่วน Android ความสามารถและค่าที่ควรนำมาใช้
| ความสามารถในการ | Descriptไอออน | ค่านิยม/การใช้งาน |
|---|---|---|
| แอพแพ็คเกจ | โทรไปยังหมายเลขที่ต้องการ Java แพคเกจใน Android ที่ผู้ใช้ต้องการเรียกใช้ |
ค่า= com.example.myapp/ Obj.setCapability(“appPackage”, “com.whatsapp”); |
| กิจกรรมแอป | กิจกรรมแอปพลิเคชันที่ผู้ใช้ต้องการเรียกใช้จากแพ็กเกจ |
ค่า = MainActivity, .Settings Obj.setCapability(“appActivity”, “com.whatsapp.Main”); |
| แอพรอแพ็คเกจ | แพ็กเกจที่แอปพลิเคชันต้องรอ | ค่า=com.example.android.myapp |
| แอพรอกิจกรรม | ใด Android กิจกรรมที่ผู้ใช้ต้องรอ |
ค่า= กิจกรรมสแปลช ความสามารถ setCapability (“appWaitActivity”, “com.example.game.SplashActivity”) |
หมายเหตุ: โปรดดูที่ Appium เอกสาร เพื่อดูเพิ่มเติม Android ความสามารถในการ
ตารางด้านล่างแสดงคุณสมบัติที่ใช้กันทั่วไปใน iOS และค่าที่ควรใช้
| ความสามารถในการ | Descriptไอออน | ความคุ้มค่า |
|---|---|---|
| หมดเวลาการเปิดตัว | เวลาทั้งหมด (เป็นมิลลิวินาที) เพื่อรอเครื่องมือวัด | 2000 |
| คุณทำ | เพื่อระบุหมายเลขอุปกรณ์เฉพาะของอุปกรณ์ทางกายภาพที่เชื่อมต่ออยู่ | 166สตู4 |
หมายเหตุ: โปรดดูที่ Appium คู่มือความสามารถ เพื่อดูความสามารถเพิ่มเติมของ iOS
ความสามารถที่ต้องการเปลี่ยนแปลงไปอย่างไร Appium 2
ตัวอย่างข้างต้นมาจาก Appium ยุคหนึ่งยังคงแสดงให้เห็นถึงรูปแบบของชุดความสามารถ แต่กฎสองข้อได้เปลี่ยนแปลงไป และทั้งสองข้อจะขัดขวางไม่ให้เซสชั่นสมัยใหม่เริ่มต้นขึ้น
ประการแรก ข้อกำหนด W3C WebDriver กำหนดความสามารถมาตรฐานไว้เพียงชุดเล็กๆ เท่านั้น ซึ่งในจำนวนนี้ platformName และ browserName ประเด็นสำคัญตรงนี้คือ ความสามารถอื่นๆ ทั้งหมดเป็นส่วนขยายของผู้จำหน่าย และต้องมีคำนำหน้าเนมสเปซที่ลงท้ายด้วยเครื่องหมายโคลอน Appiumคำนำหน้าของ คือ appium:. ดังนั้น deviceName จะกลายเป็น appium:deviceName และ platformVersion จะกลายเป็น appium:platformVersion. Appium 2 ยังต้องการ appium:automationNameเนื่องจากไดรเวอร์ถูกติดตั้งแยกต่างหาก ไม่ได้รวมมากับเซิร์ฟเวอร์
ประการที่สอง การใช้คำนำหน้าซ้ำๆ นั้นน่าเบื่อ ดังนั้น Appium รับคนเดียว appium:options ความสามารถที่มีค่าเป็นอ็อบเจ็กต์ ความสามารถภายในอ็อบเจ็กต์นั้นไม่จำเป็นต้องมีคำนำหน้า และหากชื่อปรากฏทั้งภายในและภายนอกอ็อบเจ็กต์ ค่าภายในจะเป็นค่าที่มีผลเหนือกว่า
{
"platformName": "iOS",
"appium:options": {
"automationName": "XCUITest",
"platformVersion": "16.0",
"app": "/path/to/your.app",
"deviceName": "iPhone 12",
"noReset": true
}
}
⚠️ หมายเหตุเกี่ยวกับเวอร์ชัน: บน Java ด้านข้าง Selenium 4 และ Appium Java ลูกค้า 8 เลิกใช้งานแล้ว DesiredCapabilities คลาสที่แสดงไว้ก่อนหน้านี้ ตัวสร้างเฉพาะไดรเวอร์ที่สืบทอดมาจาก BaseOptions เปลี่ยนใหม่ — UiAutomator2Options สำหรับ Android และ XCUITestOptions สำหรับ iOS — พร้อมแผนที่แบบหนึ่งต่อหนึ่งping จากแต่ละเก่า setCapability เรียกใช้โค้ดต้นฉบับด้านบน ซึ่งยังคงเก็บไว้ที่นี่เพื่อเป็นตัวอย่างทางประวัติศาสตร์
Extracข้อมูลแพ็กเกจและกิจกรรมต่างๆ
แพ็กเกจคือกลุ่มไฟล์หรือคลาส ซึ่งช่วยให้การเขียนโปรแกรมแบบโมดูลาร์มีโครงสร้างที่เป็นระเบียบ Javaโดยทั่วไปแล้ว แพ็กเกจต่างๆ จะถูกจัดเก็บไว้ในไฟล์ JAR ไฟล์เดียว และผู้ใช้สามารถเรียกใช้ไฟล์ JAR นั้นเพื่อเรียกใช้งานได้อย่างสมบูรณ์ แนวคิดที่คล้ายกันนี้ยังถูกนำมาใช้ในการพัฒนาแอปพลิเคชันบนมือถือด้วย
ตัว Vortex Indicator ได้ถูกนำเสนอลงในนิตยสาร Android ระบบปฏิบัติการ แอปพลิเคชันทั้งหมดจะถูกติดตั้งในรูปแบบของ Java แพ็คเกจ ดังนั้น ยกตัวอย่างเช่นtracข้อมูลเส้นทางแพ็กเกจ t, the Android ใช้คลาส PackageManager
ฟังก์ชันนี้จะดึงข้อมูลแพ็กเกจและกิจกรรมของแอปพลิเคชันที่ติดตั้งไว้ล่วงหน้าและแอปพลิเคชันที่ติดตั้งภายหลังบนอุปกรณ์
คุณสามารถรับอินสแตนซ์ของคลาส PackageManager ได้โดยการเรียกใช้เมธอด getPackageManager() เมธอดนี้สามารถเข้าถึงและจัดการแพ็กเกจและสิทธิ์ที่เกี่ยวข้องของแอปพลิเคชันที่ติดตั้งไว้ได้
ตัวอย่างเช่น:
PackageManager pManager = getPackageManager();
List<ApplicationInfo> list = pManager.getInstalledApplications(PackageManager.GET_META_DATA)
วิธีการค้นหา appPackage และ appActivity ด้วย adb
วิธีการใช้ PackageManager ตามที่กล่าวไว้ข้างต้นนั้นใช้ได้จากภายในแอปพลิเคชัน ในฐานะผู้ทดสอบ คุณมักจะมีเพียงเวอร์ชันที่ติดตั้งแล้ว ดังนั้นวิธีที่รวดเร็วกว่าคือการสอบถามผ่าน PackageManager ADB เทียบกับอุปกรณ์ที่เชื่อมต่อหรือโปรแกรมจำลอง
เปิดแอปพลิเคชันบนอุปกรณ์ด้วยตนเอง จากนั้นเรียกใช้คำสั่งใดคำสั่งหนึ่งด้านล่างจากเทอร์มินัลในโฟลเดอร์ platform-tools คำสั่งนี้จะแสดงหน้าต่างที่กำลังได้รับโฟกัสอยู่ และค่าที่ได้จะถูกจัดรูปแบบดังนี้ package/activity.
adb shell dumpsys window | find "mCurrentFocus" adb shell dumpsys window windows | grep -i "mCurrentFocus"
ใช้แบบฟอร์มแรกใน Windows ครั้งแรกใช้ใน command prompt และครั้งที่สองใช้ใน Unix shell หรือ Git Bash อ่านผลลัพธ์เป็นสองส่วน: ทุกอย่างก่อนเครื่องหมายทับคือค่าสำหรับ appPackageและทุกสิ่งหลังจากนั้นคือค่าสำหรับ appActivity.
มีข้อควรระวังสองประการ ประการแรก กิจกรรมที่เน้นคือสิ่งที่ปรากฏอยู่บนหน้าจอในขณะนั้น ซึ่งไม่ใช่กิจกรรมที่แอปพลิเคชันเริ่มต้นเสมอไป — หากเซสชันล้มเหลวระหว่างการเริ่มต้นไดรเวอร์ ให้เปิดแอปใหม่และอ่านค่าอีกครั้ง และประการที่สอง หากหน้าจอสาดภาพปรากฏขึ้นก่อน กิจกรรมเริ่มต้นจะแตกต่างจากกิจกรรมที่คุณต้องการตรวจสอบในท้ายที่สุด ซึ่งเป็นกรณีที่เกิดขึ้นจริง appWaitActivity มีอยู่เพื่ออะไร
ทางเลือกด้านภาพคือ uiautomatorviewerซึ่งจะบันทึกโครงสร้างลำดับชั้นของหน้าจอปัจจุบันและแสดงแพ็กเกจและคลาสของแต่ละโหนด
ข้อผิดพลาดเกี่ยวกับความสามารถที่ต้องการทั่วไป (Common Desired Capabilities) และวิธีแก้ไข
ล้มเหลวมากที่สุด Appium เซสชันสิ้นสุดลงก่อนที่จะมีการดำเนินการขั้นตอนการทดสอบใดๆ และสาเหตุส่วนใหญ่มักอยู่ที่ชุดความสามารถมากกว่าตัวการทดสอบ ตารางด้านล่างนี้จะเชื่อมโยงข้อความแต่ละข้อความกับวิธีแก้ไขตามปกติ
| ระบุความประสงค์หรือข้อมูลเพิ่มเติม | สาเหตุน่าจะ | แก้ไขปัญหา |
| ความสามารถของ WebDriver ไม่ถูกต้องหรือไม่รองรับ | มีการส่งความสามารถที่ไม่เป็นไปตามมาตรฐานโดยไม่มีคำนำหน้าของผู้จำหน่าย | เพิ่ม appium: ต่อท้าย หรือย้ายเข้าไปไว้ใน appium:options |
| ความสามารถที่ต้องการจะต้องมี automationName หรือ platformName อย่างใดอย่างหนึ่ง | Appium 2. ไม่สามารถเลือกคนขับได้ | ระบุ platformName และ appium:automationName อย่างชัดเจน |
| ไม่สามารถเริ่มต้นแอปได้ ข้อผิดพลาดเดิม: กิจกรรมที่ใช้ในการเริ่มต้นแอปไม่มีอยู่จริง | appActivity ไม่ตรงกับไฟล์ manifest | อ่านค่าอีกครั้งด้วยคำสั่ง dumpsys ด้านบน |
| การเชื่อมต่อไม่เริ่มต้น: ไม่พบอุปกรณ์ใดๆ | ไม่มีอุปกรณ์จำลองหรืออุปกรณ์มือถือเชื่อมต่ออยู่ | ตรวจสอบอุปกรณ์ด้วยคำสั่ง adb devices ก่อนเริ่มใช้งาน |
| ไม่สามารถสร้างเซสชันใหม่ได้หลังจากหมดเวลา | หน้าจอสาดแสงจะทำให้การป้อนข้อมูลล่าช้าออกไป | ตั้งค่า appWaitActivity และเพิ่มค่า appWaitDuration |
| สถานะของแอปพลิเคชันจะไม่ถูกรีเซ็ตระหว่างการทำงานแต่ละครั้ง | พฤติกรรมการรีเซ็ตเริ่มต้นถูกเปลี่ยนแปลง | Revตรวจสอบคำสั่ง appium:noReset และ appium:fullReset สำหรับการรันที่คุณต้องการ |
หากเซสชั่นไม่เริ่มต้น โปรดอ่าน Appium บันทึกเซิร์ฟเวอร์แทนที่จะเป็นสแต็กไคลเอ็นต์ trace. เซิร์ฟเวอร์ระบุว่าไม่สามารถดำเนินการความสามารถใดได้ และบรรทัดนั้นจะระบุวิธีแก้ไข
