Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
´´½¨»ùÓÚAppium + CucumberµÄÊÖ»ú¶Ë×Ô¶¯»¯²âÊÔ
 
×÷Õßêdzƣº¿ì¿ÍÏÀ
  4301  次浏览      27
 2019-12-9
 
±à¼­ÍƼö:
±¾ÎÄÏêϸ½éÉÜÈçºÎʹÓÃÔÚgithubÉÏ¿ªÔ´ÏîÄ¿ÓïÑÔJavaScript´´½¨app×Ô¶¯»¯½Å±¾µÄ·½·¨£¬Ï£Íû¶ÔÄúµÄѧϰÓÐËù°ïÖú¡£
±¾ÎÄÀ´×ÔÓÚ¹«ÖÚºÅ-ñö²¥Î¢²¼ £¬ÓÉ»ðÁú¹ûÈí¼þAlice±à¼­¡¢ÍƼö¡£

ǰÑÔ

ÏÖÔÚ×Ô¶¯»¯ÊÖ»úÓ¦ÓÃÓõÄ×î¶àµÄ¹¤¾ßµÄ¾ÍÊÇAppium£¬Appium×÷ΪÁ÷ÐеÄÒÆ¶¯É豸×Ô¶¯»¯¹¤¾ß£¬¿ÉÒÔ¶ÔAndroidºÍiOSÓ¦ÓýøÐÐ×Ô¶¯»¯²âÊÔ¡£Appium×÷Ϊ×Ô¶¯»¯²âÊԵķþÎñÆ÷£¬ÐèÒª¿Í»§¶Ë½Å±¾Ê¹ÓÃ×Ô¶¯»¯¿ò¼ÜºÍ×Ô¶¯»¯¿âÀ´Çý¶¯£¬¿Í»§¶Ë½Å±¾¿ÉÒÔʹÓöàÖÖÓïÑÔ°üÀ¨JavaScript¡¢Python¡¢Java¡¢.NETµÈµÈ¡£ÎÒÃÇÕâÀïʹÓÃʱÏÂÔÚgithubÉÏ¿ªÔ´ÏîÄ¿×îÁ÷ÐÐÓïÑÔJavaScript±àд×Ô¶¯»¯½Å±¾¡£JavaScriptÒ²ÊÇȫջ¹¤³Ìʦ¿ª·¢ÓõÄ×îÊʺϵÄÓïÑÔ¡£

±¾ÎÄÑ¡ÓÃÁËÁ÷ÐеÄÐÐΪÇý¶¯(BDD£©¿ò¼ÜCucumber.jsÒÔ¼°×Ô¶¯»¯¿âwebdriverio×÷Ϊ¿ò¼Ü£¬À´¿ª·¢×Ô¶¯»¯½Å±¾¡£ËüÃÇÊÇÍêÈ«¿ªÔ´µÄ£¬ÓÐÍêÉÆµÄÎĵµºÍÉçÇøÖ§³Ö¡£¿ª·¢¹¤¾ßÑ¡ÓÃÁËCucumber.jsרÓõĿª·¢¹¤¾ßCukeTest¡£

Õ⼸¸ö¿ò¼ÜºÍ¹¤¾ß¿ÉÔÚÏÂÃæµÄÁ´½ÓÃâ·Ñ»ñµÃ£º

Cucumber.js: https://github.com/cucumber/cucumber-js

webdriverio: https://www.npmjs.com/package/webdriverio

CukeTest: http://cuketest.com

²½Öè

1.´´½¨ÏîÄ¿

´ò¿ªCukeTest£¬Ð½¨ÏîÄ¿£¬ÏîĿģ°åÑ¡Ôñ Mobile£¬ÌîдÏîĿ·¾¶£¬µã»÷´´½¨£¬¼´¿ÉÍê³ÉÏîÄ¿´´½¨¡£

Ä£°åÌṩÁËȱʡµÄ´úÂ룬ֻҪÉÔ×÷Ð޸ļ´¿ÉÊÊÓÃÄúµÄÒÆ¶¯É豸×Ô¶¯»¯²âÊÔ¡£

2.ÐÞ¸ÄÉ豸²ÎÊý

´´½¨ºÃµÄÏîÄ¿´úÂëÖУ¬featureÎļþ¼´ÓÃÀýµÄ¶¨Ò壬ÒÔ¼°´úÂë¶¼·ÅÔÚfeaturesĿ¼Ï¡£ÕâÒ²ÊÇCucumberµÄ¹æ·¶¡£

ÔÚ features/support/get_driver.jsÎļþÖУ¬Ä¬ÈϵĴúÂëÈçÏ¡£Ëü´´½¨ÁËÇý¶¯AppiumµÄdriver¶ÔÏ󣬲¢µ¼³ö¸øÆäËüµÄµ÷ÓÃÎļþ£º

const webdriverio = require('webdriverio');
//ÉèÖñ»²âÓ¦ÓòÎÊý
let options = {
desiredCapabilities: {
platformName: "Android",
deviceName: "xxxxxxxx", //É豸ÐòÁд®ºÅ
platformVersion: "5.1", //ϵͳƽ̨°æ±¾
appPackage: "cn.com.xxx", //package Ãû×Ö
appActivity: "cn.com.xxx", //Æô¶¯activity Ãû×Ö
resetKeyboard: true,
noReset: true,
unicodeKeyboard: true
},
host: "127.0.0.1",
port: 4723
}
//¸ù¾Ý²ÎÊýÅäÖô´½¨WebDriverIOʵÀý;
function createDriver() {
const client = webdriverio.remote(options);
return client;
} exports.driver = createDriver();

¸ù¾ÝÄãµÄÉ豸ÒÔ¼°Ïà¹ØÐÅÏ¢ÊäÈëÐ޸ĶÔÓ¦ÄÚÈÝ¡£¿ÉÒԲο¼ Appium ¹Ù·½ÎĵµÖйØÓÚ Desired CapabilitiesµÄ¾ßÌåÃèÊö½øÐÐÏà¹ØÅäÖÃÐ޸ġ£ http://appium.io/docs/en/writing-running-appium/caps/

ÐèҪעÒâµÄÊÇ£¬°²×¿Ó¦ÓõÄ×Ô¶¯»¯²âÊÔÇëÅäÖúÃAndroid SDK»·¾³£»²âÊÔiOSÓ¦ÓÃÇëÔÚMacÉϲÙ×÷£¬²¢ÏÂÔØCukeTestµÄMac°æ±¾¡£

3.ÏîÄ¿ÔËÐÐ

´´½¨ÏîĿʱÒÀÀµ°üÒѾ­ÅäÖÃÔÚpackage.jsonÖС£Ê¹Óà npm install °²×°ÏîÄ¿ÔËÐÐÒÀÀµ°ü¼´¿É¡£Æô¶¯Appium£¬½«É豸Á¬½Óµ½µçÄÔ£¬µã»÷CukeTest ÔËÐÐÏîÄ¿°´Å¥¼´¿É½øÐÐÏîÄ¿ÔËÐС£

4.±àÂë

Cucumber.js±¾Éí¾ÍÊÇÒ»¸ö×Ô¶¯»¯²âÊԵĿò¼Ü£¬»ùÓÚÐÐΪÇý¶¯Òâζןù¾Ý±»²âÓ¦ÓõÄÍⲿÐÐΪÃèÊö±»²âÓ¦Óá£*.featureÎļþ°üº¬Á˲âÊÔÓÃÀý£¬½Å±¾´úÂë·ÅÔÚstep_definitionsĿ¼Ï¡£°´ÕÕCucumber.jsµÄÍÆ¼öµÄ·½·¨ÏÈдϲâÊÔÓÃÀý£¬È»ºóÔÙʵÏÖ²âÊÔÓÃÀý£¬»áÈÃ×Ô¶¯»¯½Å±¾±äµÃ·Ç³£ÇåÎúÃ÷ÁË¡£ÏÂÃæÎÒÃǾͰ´ÕÕÕâÒ»Á÷³Ì¿ª·¢×Ô¶¯»¯½Å±¾¡£

1. ±à¼­featureÎļþ

ÒÔ֮ǰ½éÉܵÄiOS DemoÓ¦ÓÃΪÀý¿ª·¢×Ô¶¯»¯£¬¾ßÌåÇë²Î¿¼ÎÄÕ¡°¹¹½¨ÐÐΪÇý¶¯µÄiOS×Ô¶¯»¯²âÊÔ¡±¡£Ê×ÏÈÔÚfeature1.featureÎļþÖб༭½Å±¾£º

# language: zh-CN
¹¦ÄÜ: iOS Demo ²Ù×÷
³£¼ûµÄÔöɾ¸Ä²é²Ù×÷
³¡¾°: Ìí¼ÓÒ»¸öеļǼ
¼ÙÈçµã»÷Ìí¼Ó°´Å¥
µ±meal name ÖÐÊäÈë"abcdefg"
ͬʱµã»÷ͼƬ´ÓÏà²áÖÐÑ¡ÔñÒ»ÕÅͼƬ
²¢ÇÒÑ¡Ôñ4¿ÅÐÇ
µ±µã»÷±£´æ°´Å¥
ÄÇôÊ×Ò³Ó¦¸Ã»áÓÐ4¸öÁбí

¶ÔÓ¦µÄ¿ÉÊÓ»¯½çÃæÎª£º

2. Éú³É¿ò¼Ü´úÂë

´ò¿ªstep_definitons/definitions1.js ,µã»÷²Ù×÷²½ÖèºóÃæµÄ»ÒÉ«°´Å¥£¬»á×Ô¶¯Éú³ÉNode.jsµÄ¿ò¼Ü´úÂë¡£ºóÃæÒª×öµÄ¾ÍÊÇʵÏÖÕâЩ¿ò¼Üº¯Êý¡£Node.jsÎĵµÇë²Î¿¼(https://nodejs.org/dist/latest-v8.x/docs/api/)

const { Given, When, Then } = require('cucumber');
const { driver } = require('../support/get_driver');
const assert = require('assert');
//// ÄãµÄ²½Ö趨Òå /////
Given(/^µã»÷Ìí¼Ó°´Å¥$/, async function () {
return 'pending';
});

When(/^meal name ÖÐÊäÈë"([^"]*)"$/, async function (arg1) {
return 'pending';
});
When(/^µã»÷ͼƬ´ÓÏà²áÖÐÑ¡ÔñÒ»ÕÅͼƬ$/, async function () {
return 'pending';
});
When(/^Ñ¡Ôñ(\d+)¿ÅÐÇ$/, async function (arg1) {
return 'pending';
});
When(/^µã»÷±£´æ°´Å¥$/, async function () {
return 'pending';
});
Then(/^Ê×Ò³Ó¦¸Ã»áÓÐ(\d+)¸öÁбí$/, async function (arg1) {
return 'pending';
});

3. ÍêÉÆ×Ô¶¯»¯´úÂë

ʹÓÃwebdriverio µÄAPIʵÏÖ²½Ö趨ÒåµÄ²Ù×÷¡£

const { Given, When, Then } = require('cucumber');
const {driver} = require('../support/get_driver');
const assert = require('assert');
//// ÄãµÄ²½Ö趨Òå /////
Given(/^µã»÷Ìí¼Ó°´Å¥$/, async function () {
let add = await driver.element('~Add')
await driver.click('~Add');
});
When(/^meal name ÖÐÊäÈë"([^"]*)"$/, async function
(text) {
await driver.setValue('//*[@name="FoodTracker"]
/XCUIElementTypeWindow
[1]/XCUIElementTypeOther[1]/XCUIElementTypeOther
[1]/XCUIElementTypeOther
[1]/XCUIElementTypeOther[1]/XCUIElementTypeOther
[1]/XCUIElementTypeOther
[1]/XCUIElementTypeTextField[1]',text)
await driver.hideDeviceKeyboard();
});
When(/^µã»÷ͼƬ´ÓÏà²áÖÐÑ¡ÔñÒ»ÕÅͼƬ$/, async
function () {
await driver.click('~defaultPhoto');
await driver.pause(2000);

await driver.click('~Moments')
await driver.pause(2000);
let ele = await driver.element('//XCUIElementTypeCell
[@name="Photo, Landscape, August 09, 2012, 2:52 AM"]')
await driver.click('//XCUIElementTypeCell[@name="Photo,
Landscape, August 09, 2012, 2:52 AM"]')
});
When(/^Ñ¡Ôñ(\d+)¿ÅÐÇ$/, async function (arg1) {
await driver.click('//XCUIElementTypeButton[@name="
Set 4 star rating"]');
});
When(/^µã»÷±£´æ°´Å¥$/, async function () {
await driver.click('#Save');
});
Then(/^Ê×Ò³Ó¦¸Ã»áÓÐ(\d+)¸öÁбí$/, async function
(num) { let itemlist = await driver.elements('//XCUIElementTypeApplication[@name=
"FoodTracker"]
/XCUIElementTypeWindow[1]/XCUIElementTypeOther
/XCUIElement
TypeOther
/XCUIElementTypeOther/XCUIElementTypeTable
/XCUIElementTypeCell')
return assert.equal(num,itemlist.value.length)
});

¿ÉÒÔ¿´µ½£¬ÔªËصIJÙ×÷ʹÓÃÁËwebdriverioµÄAPI¡£¶øÔªËصÄXPathµÄ²éÕÒÖ÷ҪʹÓÃAppium desktop °æµÄÔªËØ²éÕÒÆ÷£¬¾ßÌå¿ÉÒÔ²éÔÄAppiumÏà¹ØÎĵµ¡£

4.ÔËÐÐ

ÔÚCukeTestÖÐÔËÐÐÏîÄ¿£¬¼È¿É¿´µ½Õû¸öUI×Ô¶¯»¯µÄÔËÐÐÇé¿ö£¬ÔËÐнáÊøºó×Ô¶¯Éú³É²âÊÔ±¨¸æ¡£

×ܽá

ÎÒÃÇΪ´ó¼ÒչʾÁËʹÓÃAppium + webdriverio ¿ª·¢Ò»¸öiOS DemoÓ¦ÓÃ×Ô¶¯»¯µÄ½Å±¾£¬Í¬ÑùµÄ£¬Android Ó¦ÓÃ×Ô¶¯»¯Ò²ÊÇÀàËÆ·½Ê½½øÐС£

 
   
4301 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

΢·þÎñ²âÊÔÖ®µ¥Ôª²âÊÔ
һƪͼÎÄ´øÄãÁ˽â°×ºÐ²âÊÔÓÃÀýÉè¼Æ·½·¨
È«ÃæµÄÖÊÁ¿±£ÕÏÌåϵ֮»Ø¹é²âÊÔ²ßÂÔ
È˹¤ÖÇÄÜ×Ô¶¯»¯²âÊÔ̽Ë÷
Ïà¹ØÎĵµ

×Ô¶¯»¯½Ó¿Ú²âÊÔʵ¼ù֮·
jenkins³ÖÐø¼¯³É²âÊÔ
ÐÔÄܲâÊÔÕï¶Ï·ÖÎöÓëÓÅ»¯
ÐÔÄܲâÊÔʵÀý
Ïà¹Ø¿Î³Ì

³ÖÐø¼¯³É²âÊÔ×î¼Ñʵ¼ù
×Ô¶¯»¯²âÊÔÌåϵ½¨ÉèÓë×î¼Ñʵ¼ù
²âÊԼܹ¹µÄ¹¹½¨ÓëÓ¦ÓÃʵ¼ù
DevOpsʱ´úµÄ²âÊÔ¼¼ÊõÓë×î¼Ñʵ¼ù