Appium ความสามารถที่ต้องการสำหรับ Android ผู้เอาอย่าง

⚡ สรุปอย่างชาญฉลาด

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

  • ???? การประชุมtract: ความสามารถต่างๆ จะถูกส่งไปในส่วนเนื้อหา JSON ของคำขอสร้างเซสชันใหม่ และไม่สามารถเปลี่ยนแปลงได้ในภายหลัง
  • ☑️ Android สิ่งจำเป็น: appPackage และ appActivity ตั้งชื่อแอปพลิเคชันและหน้าจอ Appium ควรเปิดตัว
  • ตัวเลือกการรอ: appWaitPackage และ appWaitActivity ครอบคลุมหน้าจอสาดแสงที่ปรากฏขึ้นก่อนจุดเริ่มต้นการทำงานจริง
  • 🧪 Appium 2 คำนำหน้า: ฟังก์ชันการทำงานที่ไม่เป็นไปตามมาตรฐานทั้งหมดในขณะนี้จำเป็นต้องมีคำนำหน้า appium: vendor มิฉะนั้นเซิร์ฟเวอร์จะปฏิเสธ
  • 🛠️ ทันสมัย Java ลูกค้า: DesiredCapabilities ถูกแทนที่ด้วย UiAutomator2Options และ XCUITestOptions ภายใต้ Selenium 4.
  • 📊 การค้นหาคุณค่า: คำสั่ง adb dumpsys หรือคลาส PackageManager จะแสดงชื่อแพ็กเกจและกิจกรรมต่างๆ

Appium คู่คีย์-ค่าความสามารถที่ต้องการสำหรับ Android เซสชันจำลอง

ความสามารถที่ต้องการคืออะไร

'ความสามารถที่ต้องการ' ช่วยให้เราปรับเปลี่ยนพฤติกรรมของเซิร์ฟเวอร์ระหว่างการทำงานอัตโนมัติ 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. เซิร์ฟเวอร์ระบุว่าไม่สามารถดำเนินการความสามารถใดได้ และบรรทัดนั้นจะระบุวิธีแก้ไข

คำถามที่พบบ่อย

ไม่ platformName และ browserName เป็นคุณสมบัติมาตรฐานของ W3C และไม่ต้องใส่คำนำหน้า ส่วนคุณสมบัติอื่นๆ ทั้งหมด Appium ความสามารถต่างๆ รวมถึง deviceName และ platformVersion เป็นส่วนขยายของผู้จำหน่ายและต้องมีคำนำหน้า appium:

เครื่องมือแมชชีนเลิร์นนิงในระบบคลาวด์ของอุปกรณ์จะแนะนำชุดความสามารถจากอุปกรณ์ที่สร้างขึ้นและอุปกรณ์เป้าหมาย และระบุค่าที่ล้มเหลวในเซสชันที่คล้ายกัน ให้ถือว่าผลลัพธ์เป็นเพียงร่าง และตรวจสอบชื่อแต่ละรายการกับเอกสารประกอบไดรเวอร์อีกครั้ง

นักบินผู้ช่วยทำแบบฝึกหัดพื้นฐานต่างๆ ได้ครบถ้วน แต่ได้รับการฝึกฝนมาอย่างหนักในเรื่องต่างๆ มากมาย Appium โค้ด 1 ตัว และมักจะละเว้นคำนำหน้า หรือแนะนำคลาส DesiredCapabilities ที่เลิกใช้งานแล้ว ตรวจสอบคำแนะนำแต่ละข้อกับคู่มือฉบับปัจจุบัน

appPackage ตั้งชื่อแพ็กเกจ Appium launches.appWaitPackage ตั้งชื่อแพ็กเกจ Appium จะรอให้ปรากฏขึ้นก่อนจึงจะคืนการควบคุม ซึ่งมีความสำคัญเมื่อตัวเรียกใช้งานหรือหน้าจอสแปลชโหลดแพ็กเกจอื่นก่อน

ตั้งค่า platformName เป็น iOS และ appium:automationName เป็น XCUITest นอกจากนี้ ไดรเวอร์ XCUITest ยังต้องการอย่างน้อยหนึ่งอย่างจาก appium:app, appium:bundleId หรือ browserName มิฉะนั้นจะเปิดเซสชันบนหน้าจอหลัก

จำนวนวินาทีที่เซิร์ฟเวอร์รอให้ไคลเอนต์ส่งคำสั่งถัดไป หากเกินเวลาที่กำหนด เซิร์ฟเวอร์จะถือว่าไคลเอนต์ออกจากระบบแล้วและปิดเซสชัน ซึ่งมักจะดูเหมือนความล้มเหลวแบบสุ่ม

noReset จะข้ามขั้นตอนการรีเซ็ตตามปกติ ทำให้ข้อมูลแอปยังคงอยู่หลังจากเซสชันสิ้นสุดลง fullReset จะเพิ่มขั้นตอนพิเศษ รวมถึงการถอนการติดตั้งและการติดตั้งใหม่ เพื่อให้สามารถทำซ้ำได้อย่างแม่นยำที่สุด ทั้งสองตัวเลือกมีค่าเริ่มต้นเป็น false และไม่ควรเปิดใช้งานพร้อมกัน

ไม่ครับ ความสามารถ (Capabilities) เป็นพารามิเตอร์สำหรับการเริ่มต้นเซสชัน และจะคงที่เมื่อสร้างเซสชันแล้ว หากไดรเวอร์อนุญาตให้เปลี่ยนแปลงพฤติกรรมระหว่างเซสชัน ไดรเวอร์จะเปิดเผยการตั้งค่าผ่าน API การตั้งค่าแทนครับ

สรุปโพสต์นี้ด้วย: