±à¼ÍƼö: |
±¾ÎÄÏêϸ½éÉÜÈçºÎʹÓÃÔÚ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
Ó¦ÓÃ×Ô¶¯»¯Ò²ÊÇÀàËÆ·½Ê½½øÐС£ |