Kaip „Manus AI“ tapo mano „Appium“ automatikos dalimi

Jei kada nors tris valandas stebėjote, kaip jūsų Appium testas nepavyko dėl priklausomybės konflikto, kurio net nežinojote, šis tinklaraštis skirtas jums.
Mobilioji automatizacija nėra paprastas žiniatinklio automatizavimo išplėtimas. Priemonės skirtingos. Sąranka yra sluoksniuota. Mokymosi kreivė yra tikra – ypač kai tikimasi, kad pateiksite veikiančius scenarijus, kol vis dar išsiaiškinsite dalykus.
Esu rankinio ir žiniatinklio automatizavimo testuotojas, turintis praktinės Selenium Java patirties. Kai su Appium įsitraukiau į mobiliąją automatiką, pasijutau lyg išmokčiau vairuoti iš naujo – tie patys keliai, visiškai kita transporto priemonė.
Pakeliui naudojau AI įrankius. Jie padėjo. Bet gauti teisingą atsakymą už mano sąranka visada užtrukdavo ilgiau nei turėjo.
Ir tada aš supratau kai ką svarbaus:
Problema buvo ne ta, kad AI nežinojo atsakymo.
Problema buvo ta, kad jis nežinojo mano kontekstas.
Tada radau Manus AI – ir mano darbo būdas pasikeitė.
Štai kaip tiksliai.


Neaiškių klausimų problema
Daugelis iš mūsų klausia dirbtinio intelekto įrankių taip pat, kaip ieškodami „Google“:
„Kaip spustelėti mygtuką Appium Java?”
Gaunate bendrą atsakymą. Tai tinka kažkieno projektui – tik ne tavo.
Jūsų sistemos versija skiriasi.
Jūsų projekto struktūra kitokia.
Jūsų priklausomybės sąranka skiriasi.
Kitas 30 minučių skiriate aiškinimui, ką iš tikrųjų turėjote omenyje.
Skamba pažįstamai?
Pataisymas yra ne tik geresnė priemonė.
Tai geresnis klausimas.
Bendrieji klausimai pateikia bendrus atsakymus.
Struktūrą suvokiantys klausimai sukuria sistemą suvokiantį kodą.
Kontekstas sumažina derinimo laiką.
Ir „Manus AI“ sukurtas taip, kad atlygintų būtent už tai.
Kaip aš naudoju „Manus AI“ – su tikru pavyzdžiu
Įsivaizduokite, kad man reikia automatizuoti prisijungimo eigą „Android“ programoje.
1 veiksmas: pasakau savo sistemą ir versiją
„Naudoju Appium Java klientą 8.3.0 su Appium Server 2.x, UIAutomator2 tvarkykle ir Cucumber BDD.
Ta viena eilutė sutaupo 10 minučių važiavimo pirmyn ir atgal.
Manusas iš karto žino:
- Kurios API galimos
- Kas nebenaudojama
- Kokia sintaksė taikoma mano versijai
Jokių bandymų ir klaidų pasiūlymų.
2 veiksmas: aprašau savo projekto struktūrą
„Turiu tinkintą struktūrą. Diegimo logika įrašyta bandomųjų atvejų aplanke. Žingsnio apibrėžimo failas iš ten iškviečia tik vienos eilutės metodą – jame nėra jokios logikos.”
Pavyzdys: Įkeliamas bandomojo šaltinio vaizdas kaip naudotojo profilio nuotrauka.
// StepDefinition.java
@When("I upload image from gallery")
public void iUploadImageFromGallery() throws IOException {
editProfile.uploadImage(); // Single step call
}
//ProfilePictureUpdate.java (Test case class)
public void uploadImage() throws IOException{
editProfilePage.uploadProfileImageFromResources("profile.png");
}
//EditPage.java (Page Object Model class)
public void uploadProfileImageFromResources(String imageName) throws IOException{
wait.until(ExpectedConditions.elementToBeClickable(profileIcon)).click();
// 1. Push image from resources to device
File resourceDir = new File("src/test/resources/images");
File imageFile = new File(resourceDir, imageName);
((AndroidDriver) driver).pushFile("/sdcard/Pictures/" + imageName, imageFile);
try {
// 1. If a profile picture already exists, Add & Remove buttons will be visible
wait.until(ExpectedConditions.visibilityOf(addPhotoButton));
// 2. Click Add Photo → opens gallery
addPhotoButton.click();
// 3. Handle permission dialogs (if any)
handlePermissions();
// 4. Scroll and select media item
scrollToMediaItem();
wait.until(ExpectedConditions.visibilityOf(mediaGrid)).click();
// 5. Click Done in Google Photos
wait.until(ExpectedConditions.visibilityOf(doneButtonFromGPhotos)).click();
// 6. Click profile icon again to verify by removing the photo
wait.until(ExpectedConditions.elementToBeClickable(profileIcon)).click();
wait.until(ExpectedConditions.elementToBeClickable(removePhotoButton)).click();
} catch (Exception e) {
/* If Add button is not visible, the gallery opens directly */
// 1. Handle permission dialogs (if any)
handlePermissions();
// 2. Scroll and select media item
scrollToMediaItem();
wait.until(ExpectedConditions.elementToBeClickable(mediaGrid)).click(); // Merged redundant visibility + clickable waits
// 3. Click Done in Google Photos
wait.until(ExpectedConditions.visibilityOf(doneButtonFromGPhotos)).click();
// 4. Click profile icon again to verify by removing the photo
wait.until(ExpectedConditions.elementToBeClickable(profileIcon)).click();
wait.until(ExpectedConditions.elementToBeClickable(removePhotoButton)).click();
}
}
Manusas supranta šį susirūpinimo atskyrimą.
Tai neįtraukia logikos į žingsnio apibrėžimą.
Tai gerbia mano rėmo dizainą.
Tai svarbiau, nei žmonės galvoja.
3 veiksmas: dalinuosi lokatoriais iš Appium Inspector
Elementų neaprašinėju. Įklijuoju tikrąjį lokatorių.
„Ištekliaus ID: com.example.app:id/et_profileIcon – tai profilio piktograma
„Ištekliaus ID: com.example.app:id/btn_addPhoto – tai yra nuotraukos pridėjimo mygtukas.
„Ištekliaus ID: com.example.app:id/btn_removePhoto – tai yra nuotraukos pašalinimo mygtukas.
„Ištekliaus ID: com.example.app:id/media_mediaGrid – tai neseniai atsisiųsta laikmena.
Tikri lokatoriai = tikri sprendimai. Jokio spėliojimo, jokio vietos rezervavimo kodo.
4 veiksmas: apibrėžiu srautą
1 srautas (matomas nuotraukos pridėjimo mygtukas)
„Vartotojas paliečia profilio piktogramą → rodomas mygtukas Pridėti nuotrauką → bakstelėkite Pridėti nuotrauką → vaizdas paimamas iš sistemos išteklių aplanko → vaizdas parenkamas ir įkeliamas → bakstelėkite Atlikta → įkėlimas patvirtintas → dar kartą palieskite profilio piktogramą → bakstelėkite Pašalinti nuotrauką → patvirtinamas profilio nuotraukos pašalinimas.
2 srautas (galerija atidaroma tiesiogiai)
„Vartotojas paliečia profilio piktogramą → Mygtukas Pridėti nuotrauką nerodomas → galerija atsidaro tiesiai → vaizdas paimamas iš sistemos išteklių aplanko → vaizdas pasirenkamas ir įkeliamas → bakstelėkite Atlikta → įkėlimas patvirtintas → dar kartą palieskite profilio piktogramą → bakstelėkite Pašalinti nuotrauką → patvirtinamas profilio nuotraukos pašalinimas.
Tai sako Manui:
- Veiksmų seka
- Laukiamas elgesys
- Patvirtinimo taškas
Dabar tai ne tik generuoja paspaudimų veiksmus.
Tai supranta ketinimą.
5 veiksmas: „Manus“ pažymi ir mano POM.xml
Tai mane nustebino pirmą kartą.
Manusas man neklausęs atkreipė dėmesį:
„Turėsite pridėti io.app:java-client:8.3.0 į savo POM.xml ir įsitikinkite, kad Selenium versija neprieštarauja.
Tai davė man tikslų XML bloką įklijuoti. Ta vienintelė vėliavėlė išgelbėjo mane nuo scenarijaus gedimo, kurio nebūčiau atsekęs kelias valandas.
Rezultatas? Vienas Šūvis. Darbo kodas.
Pateikęs visa tai, kas išdėstyta pirmiau, „Manus“ grąžino visą, struktūrizuotą, paruoštą paleisti įgyvendinimą, atitinkantį:
- Mano karkasas
- Mano lokatoriai
- Mano srautas
- Mano projekto konvencijos
Jokių neaiškių fragmentų.
Jokių priklausomybės konfliktų.
Nėra struktūrinio neatitikimo.
Tai, kas paprastai trukdavo 45 minutes derinimo ir priklausomybės pataisymų, veikė per vieną iteraciją.
Tai ne laimė. Taip atsitinka, kai tinkamas įrankis gauna tinkamą kontekstą.


