¼ò½é£º ÄÜÔÚÒ»¸öä¯ÀÀÆ÷ÉÏÔËÐÐµÄ JavaScript ²¢²»Ò»¶¨ÄÜÔÚÆäËûä¯ÀÀÆ÷ÉÏÔËÐС£Èç¹ûûÓжԴúÂë½øÐе¥Ôª²âÊÔ£¬ÄÇôÔÚ¾ö¶¨Éý¼¶»òÖ§³ÖÐÂä¯ÀÀÆ÷µÄʱºò£¬¹«Ë¾¾ÍÐèÒª»¨Ç®²âÊÔ»òÖØÐ²âÊÔ
Web Ó¦ÓóÌÐò¡£ÔÚ±¾ÎÄÖУ¬Á˽â JavaScript µ¥Ôª²âÊÔÈçºÎ°ïÖúÄú½µµÍ²âÊԳɱ¾£¬ÇáËÉÖ§³Ö¸ü¶àä¯ÀÀÆ÷¡£
Ò»¸öËð»µµÄ JavaScript ´úÂëʾÀý
Web Ó¦ÓóÌÐòÃæÁÙµÄÒ»¸ö×î´óÌôÕ½ÊÇÖ§³Ö²»Í¬°æ±¾µÄ Web ä¯ÀÀÆ÷¡£ÄÜÔÚ Safari ÉÏÔËÐÐµÄ JavaScript
´úÂë²»Ò»¶¨ÄÜÔÚ Windows? Internet Explorer (IE)¡¢Firefox »ò Google
Chrome ÉÏÔËÐС£Õâ¸öÌôÕ½µÄ¸ùÔ´ÊdzÊÏÖ²ãÖÐµÄ JavaScript ´úÂë´ÓÒ»¿ªÊ¼¾ÍûÓнøÐвâÊÔ¡£Èç¹ûûÓжԴúÂë½øÐе¥Ôª²âÊÔ£¬ÄÇôÔÚÉý¼¶»òÖ§³ÖÐÂä¯ÀÀÆ÷ºó£¬×éÖ¯¿ÉÄÜÐèÒª»¨Ç®·´¸´²âÊÔ
Web Ó¦ÓóÌÐò¡£±¾ÎĽ«Õ¹Ê¾ÈçºÎͨ¹ý¸ßЧµÄ JavaScript ´úÂëµ¥Ôª²âÊÔ½µµÍ²âÊԳɱ¾¡£
Ò»¸ö³£¼ûÓÃÀýÊǵǼ±íµ¥ JavaScript ÑéÖ¤¡£¿¼ÂÇ Çåµ¥ 1 ÖÐµÄ±íµ¥¡£
Çåµ¥ 1. µÇ¼±íµ¥
<FORM> <table> <tr> <td>Username</td> <td><input type="text" id="username"/></td> <td><span id="usernameMessage"></span></td> </tr> <tr> <td>Password</td> <td><input type="password" id="password"/></td> <td><span id="passwordMessage"></span></td> </tr> <tr> <td><input type="button" onclick="new appnamespace. ApplicationUtil().validateLoginForm()" value="Submit"/></td> </tr> </table> </FORM> |
Õâ¸ö±íµ¥ºÜ¼òµ¥£¬½ö°üº¬Óû§ÃûºÍÃÜÂë×ֶΡ£µ¥»÷Ìá½»°´Å¥Ê±£¬½«Í¨¹ý ApplicationUtil
Ö´ÐÐÒ»¸öÌØ¶¨µÄ±íµ¥ÑéÖ¤¡£ÒÔÏÂÊǸºÔðÑéÖ¤ HTML ±íµ¥µÄ JavaScript ¶ÔÏó¡£Çåµ¥ 2 ÏÔʾÁË
ApplicationUtil ¶ÔÏóµÄ´úÂë¡£
<strong>Çåµ¥ 2. Ëð»µµÄ ApplicationUtil ¶ÔÏó´úÂë</strong> appnamespace = {}; appnamespace.ApplicationUtil = function() {}; appnamespace.ApplicationUtil.prototype.validateLoginForm = function(){ var error = true; document.getElementById("usernameMessage").innerText = ""; document.getElementById("passwordMessage").innerText = ""; if (!document.getElementById("username").value) { document.getElementById("usernameMessage").innerText = "This field is required"; error = false; } if (!document.getElementById("password").value) { document.getElementById("passwordMessage").innerText = "This field is required"; error = false; } return error; }; |
ÔÚÇåµ¥ 2 ÖУ¬ApplicationUtil ¶ÔÏóÌṩһ¸ö¼òµ¥ÑéÖ¤£ºÓû§ÃûºÍÃÜÂë×ֶζ¼ÒÑÌî³ä¡£Èç¹ûij¸ö×Ö¶ÎΪ¿Õ£¬¾Í»áÏÔʾһÌõ´íÎóÏûÏ¢£ºThis
field is required¡£
ÉÏÃæµÄ´úÂëÄܹ»ÔÚ Internet Explorer 8 ºÍ Safari 5.1 ÉϹ¤×÷£¬µ«ÎÞ·¨ÔÚ
Firefox 3.6 ÉϹ¤×÷£¬ÔÒòÊÇ Firefox ²»Ö§³Ö innerText ÊôÐÔ¡£Í¨³££¬£¨ÉÏÊö´úÂëºÍÆäËûÀàËÆ
JavaScript ´úÂëÖеģ©Ö÷ÒªÎÊÌâÊDz»ÈÝÒ×·¢ÏÖ±àдµÄ JavaScript ´úÂëÊDz»ÊÇ¿çä¯ÀÀÆ÷¼æÈݵġ£
Õâ¸öÎÊÌâµÄÒ»¸ö½â¾ö·½°¸ÊǽøÐÐ×Ô¶¯»¯µ¥Ôª²âÊÔ£¬¼ì²é´úÂëÊDz»ÊÇ¿çä¯ÀÀÆ÷¼æÈÝ¡£
JsTestDriver
JsTestDriver library ÊÇ×îºÃµÄ JavaScript
µ¥Ôª²âÊÔ¿ò¼ÜÖ®Ò»£¬ËüΪ JavaScript ´úÂëÌṩÁË¿çä¯ÀÀÆ÷²âÊÔ¡£

ͼ 1. JsTestDriver ¼Ü¹¹
¸ßЧµÄJavaScriptµ¥Ôª²âÊÔ
²¶»ñ²»Í¬µÄä¯ÀÀÆ÷Ö®ºó£¬·þÎñÆ÷»á¸ºÔ𽫠JavaScript ²âÊÔÓÃÀýÔËÐгÌÐò´úÂë¼ÓÔØµ½ä¯ÀÀÆ÷ÖС£¿ÉÒÔͨ¹ýÃüÁîÐв¶»ñä¯ÀÀÆ÷£¬Ò²¿ÉÒÔͨ¹ý½«ä¯ÀÀÆ÷Ö¸Ïò·þÎñÆ÷
URL À´²¶»ñä¯ÀÀÆ÷¡£Ò»µ©²¶»ñµ½ä¯ÀÀÆ÷£¬¸Ãä¯ÀÀÆ÷¾Í±»³ÆÎª´ÓÊôä¯ÀÀÆ÷¡£·þÎñÆ÷¿ÉÒÔ¼ÓÔØ JavaScript
´úÂ룬ÔÚÿ¸öä¯ÀÀÆ÷ÉÏÖ´ÐвâÊÔÓÃÀý£¬È»ºó½«½á¹û·µ»Ø¸ø¿Í»§¶Ë¡£
¿Í»§¶Ë£¨ÃüÁîÐУ©ÐèÒªÒÔÏÂÁ½¸öÖ÷ÒªÏîÄ¿£º
1.JavaScript Îļþ£¬¼´Ô´ÎļþºÍ²âÊÔÎļþ
2.ÅäÖÃÎļþ£¬ÓÃÓÚ×éÖ¯Ô´ÎļþºÍ²âÊÔÎļþµÄ¼ÓÔØ
Õâ¸ö¼Ü¹¹±È½ÏÁé»î£¬ÔÊÐíµ¥¸ö·þÎñÆ÷´ÓÍøÂçÖÐµÄÆäËû»úÆ÷²¶»ñÈÎÒâÊýÁ¿µÄä¯ÀÀÆ÷¡£ÀýÈ磬Èç¹ûÄúµÄ´úÂëÔÚ Linux
ÉÏÔËÐе«ÄúÏëÕë¶ÔÁíÒ»¸ö Windows »úÆ÷É쵀 Microsoft Internet Explorer
ÔËÐÐÄúµÄ²âÊÔÓÃÀý£¬ÄÇôÕâ¸ö¼Ü¹¹ºÜÓÐÓá£
ҪʹÓà JsTestDriver ¿â£¬ÇëÏÈÏÂÔØ×îаæµÄ JsTestDriver
1.3.2¡£
±àдµ¥Ôª²âÊÔ´úÂë
ÏÖÔÚ¿ªÊ¼±àд JavaScript ²âÊÔÓÃÀý¡£Îª¼òµ¥Æð¼û£¬ÎÒ½«²âÊÔÒÔÏÂÓÃÀý£º
Óû§ÃûºÍÃÜÂë×ֶξùΪ¿Õ¡£
Óû§ÃûΪ¿Õ£¬ÃÜÂ벻Ϊ¿Õ¡£
Óû§Ãû²»Îª¿Õ£¬ÃÜÂëΪ¿Õ¡£
Çåµ¥ 3 ÏÔʾÁ˱íʾ TestCase ¶ÔÏóµÄ ApplicationUtilTest
¶ÔÏóµÄ²¿·Ö´úÂë¡£
Çåµ¥ 3. ApplicationUtilTest ¶ÔÏó´úÂëµÄÒ»²¿·Ö
ApplicationUtilTest = TestCase("ApplicationUtilTest"); ApplicationUtilTest.prototype.setUp = function () { /*:DOC += <FORM action=""><table><tr><td>Username</td><td> <input type="text" id="username"/></td><td><span id="usernameMessage"> </span></td></tr><tr><td>Password</td><td> <input type="password" id="password"/></td><td><span id="passwordMessage" ></span></td></tr></table></FORM>*/ }; ApplicationUtilTest.prototype.testValidateLoginFormBothEmpty = function () { var applicationUtil = new appnamespace.ApplicationUtil(); /* Simulate empty user name and password */ document.getElementById("username").value = ""; document.getElementById("password").value = ""; applicationUtil.validateLoginForm(); assertEquals("Username is not validated correctly!", "This field is required", document.getElementById("usernameMessage").innerHTML); assertEquals("Password is not validated correctly!", "This field is required", document.getElementById("passwordMessage").innerHTML); }; |
ApplicationUtilTest ¶ÔÏóͨ¹ý JsTestDriver
TestCase ¶ÔÏó´´½¨¡£Èç¹ûÄúÊìϤ JUnit ¿ò¼Ü£¬ÄÇôÄú¿Ï¶¨ÊìϤ setUp ºÍ testXXX
·½·¨¡£setUp ·½·¨ÓÃÓÚ³õʼ»¯²âÊÔÓÃÀý¡£¶ÔÓÚ±¾Àý£¬ÎÒʹÓø÷½·¨À´ÉùÃ÷Ò»¸ö HTML Ƭ¶Î£¬¸ÃƬ¶Î½«ÓÃÓÚÆäËû²âÊÔÓÃÀý·½·¨¡£
DOC ×¢ÊÍÊÇÒ»¸ö JsTestDriver ¹ßÓÃÓ¿ÉÒÔÓÃÓÚÇáËÉÉùÃ÷Ò»¸ö
HTML Ƭ¶Î¡£
ÔÚ testValidateLoginFormBothEmpty ·½·¨ÖУ¬´´½¨ÁËÒ»¸ö ApplicationUtil
¶ÔÏ󣬲¢ÔÚ²âÊÔÓÃÀý·½·¨ÖÐʹÓøöÔÏó¡£È»ºó£¬´úÂëͨ¹ý¼ìË÷Óû§ÃûºÍÃÜÂëµÄ DOM ÔªËØ²¢½«ËüÃǵÄÖµÉèÖÃΪ¿ÕÖµÀ´Ä£ÄâÊäÈë¿ÕÓû§ÃûºÍÃÜÂë¡£¿ÉÒÔµ÷ÓÃ
validateLoginForm ·½·¨À´Ö´ÐÐʵ¼Ê±íµ¥ÑéÖ¤¡£×îºó£¬½« µ÷Óà assertEquals À´È·±£
usernameMessage ºÍ passwordMessage span ÔªËØÖеÄÏûÏ¢ÊÇÕýÈ·µÄ£¬¼´£ºThis
field is required¡£
ÔÚ JsTestDriver ÖУ¬¿ÉÒÔʹÓÃÒÔϹ¹¼þ£º
fail("msg")£º±íÃ÷²âÊÔÒ»¶¨»áʧ°Ü£¬ÏûÏ¢²ÎÊý½«ÏÔʾΪһÌõ´íÎóÏûÏ¢¡£
assertTrue("msg", actual)£º¶Ï¶¨Êµ¼Ê²ÎÊýÕýÈ·¡£·ñÔò£¬ÏûÏ¢²ÎÊý½«ÏÔʾΪһÌõ´íÎóÏûÏ¢¡£
assertFalse("msg", actual)£º¶Ï¶¨Êµ¼Ê²ÎÊý´íÎó¡£·ñÔò£¬ÏûÏ¢²ÎÊý½«ÏÔʾΪһÌõ´íÎóÏûÏ¢¡£
assertSame("msg", expected,
actual)£º¶Ï¶¨Êµ¼Ê²ÎÊýÓëÔ¤ÆÚ²ÎÊýÏàͬ¡£·ñÔò£¬ÏûÏ¢²ÎÊý½«ÏÔʾΪһÌõ´íÎóÏûÏ¢¡£
assertNotSame("msg", expected,
actual)£º¶Ï¶¨Êµ¼Ê²ÎÊýÓëÔ¤ÆÚ²ÎÊý²»Ïàͬ¡£·ñÔò£¬ÏûÏ¢²ÎÊý½«ÏÔʾΪһÌõ´íÎóÏûÏ¢¡£
assertNull("msg", actual)£º¶Ï¶¨²ÎÊýΪ¿Õ¡£·ñÔò£¬ÏûÏ¢²ÎÊý½«ÏÔʾΪһÌõ´íÎóÏûÏ¢¡£
assertNotNull("msg", actual)£º¶Ï¶¨Êµ¼Ê²ÎÊý²»Îª¿Õ¡£·ñÔò£¬ÏûÏ¢²ÎÊý½«ÏÔʾΪһÌõ´íÎóÏûÏ¢¡£
ÆäËû·½·¨µÄ´úÂë°üº¬ÆäËû²âÊÔÓÃÀý¡£Çåµ¥ 4 ÏÔʾÁ˲âÊÔÓÃÀý¶ÔÏóµÄÍêÕû´úÂë¡£
Çåµ¥ 4. ApplicationUtil ¶ÔÏóÍêÕû´úÂë
ApplicationUtilTest = TestCase("ApplicationUtilTest"); ApplicationUtilTest.prototype.setUp = function () { /*:DOC += <FORM action=""><table><tr><td>Username</td><td> <input type="text" id="username"/></td><td><span id="usernameMessage"> </span></td></tr><tr><td>Password</td><td> <input type="password" id="password"/></td><td><span id="passwordMessage" ></span></td></tr></table></FORM>*/ }; ApplicationUtilTest.prototype.testValidateLoginFormBothEmpty = function () { var applicationUtil = new appnamespace.ApplicationUtil(); /* Simulate empty user name and password */ document.getElementById("username").value = ""; document.getElementById("password").value = ""; applicationUtil.validateLoginForm(); assertEquals("Username is not validated correctly!", "This field is required", document.getElementById("usernameMessage").innerHTML); assertEquals("Password is not validated correctly!", "This field is required", document.getElementById("passwordMessage").innerHTML); }; ApplicationUtilTest.prototype.testValidateLoginFormWithEmptyUserName = function () { var applicationUtil = new appnamespace.ApplicationUtil(); /* Simulate empty user name and password */ document.getElementById("username").value = ""; document.getElementById("password").value = "anyPassword"; applicationUtil.validateLoginForm(); assertEquals("Username is not validated correctly!", "This field is required", document.getElementById("usernameMessage").innerHTML); assertEquals("Password is not validated correctly!", "", document.getElementById("passwordMessage").innerHTML); }; ApplicationUtilTest.prototype.testValidateLoginFormWithEmptyPassword = function () { var applicationUtil = new appnamespace.ApplicationUtil(); document.getElementById("username").value = "anyUserName"; document.getElementById("password").value = ""; applicationUtil.validateLoginForm(); assertEquals("Username is not validated correctly!", "", document.getElementById("usernameMessage").innerHTML); assertEquals("Password is not validated correctly!", "This field is required", document.getElementById("passwordMessage"). innerHTML); }; <strong>ÅäÖÃÓÃÓÚ²âÊԵIJ»Í¬ä¯ÀÀÆ÷</strong> |
²âÊÔ JavaScript ´úÂëµÄÒ»¸öÍÆ¼öʵ¼ùÊǽ« JavaScript
Ô´´úÂëºÍ²âÊÔ´úÂë·ÅÖÃÔÚ²»Í¬µÄÎļþ¼ÐÖС£¶ÔÓÚ Í¼ 2 ÖеÄʾÀý£¬ÎÒ½« JavaScript Ô´Îļþ¼ÐÃüÃûΪ
¡°js-src¡±£¬½« JavaScript ²âÊÔÎļþ¼ÐÃüÃûΪ ¡°js-test¡±£¬ËüÃǶ¼Î»ÓÚ ¡°js¡±
¸¸Îļþ¼ÐÏ¡£

ͼ 2. JavaScript ²âÊÔÎļþ¼Ð½á¹¹
×éÖ¯ºÃÔ´ºÍ²âÊÔÎļþ¼Ðºó£¬±ØÐëÌṩÅäÖÃÎļþ¡£Ä¬ÈÏÇé¿öÏ£¬JsTestDriver ÔËÐгÌÐò»áѰÕÒÃûΪ jsTestDriver.conf
µÄÅäÖÃÎļþ¡£Äú¿ÉÒÔ´ÓÃüÁîÐиü¸ÄÅäÖÃÎļþÃû³Æ¡£Çåµ¥ 5 ÏÔʾÁË JsTestDriver ÅäÖÃÎļþµÄÄÚÈÝ¡£
Çåµ¥ 5. JsTestDriver ÅäÖÃÎļþÄÚÈÝ
server: http: //localhost:9876 load: - js-src/*.js - js-test/*.js |
ÅäÖÃÎļþ²ÉÓà YAML ¸ñʽ¡£server Ö¸ÁîÖ¸¶¨²âÊÔ·þÎñÆ÷µÄµØÖ·£¬load
Ö¸ÁîÖ¸³öÁ˽«ÄÄЩ JavaScript Îļþ¼ÓÔØµ½ä¯ÀÀÆ÷ÖÐÒÔ¼°¼ÓÔØËüÃǵÄ˳Ðò¡£
ÏÖÔÚ£¬ÎÒÃǽ«ÔÚ IE¡¢Firefox ºÍ Safari ä¯ÀÀÆ÷ÉÏÔËÐвâÊÔÓÃÀýÀà¡£
ÒªÔËÐвâÊÔÓÃÀýÀ࣬ÐèÒªÆô¶¯·þÎñÆ÷¡£Äú¿ÉÒÔʹÓÃÒÔÏÂÃüÁîÐÐÆô¶¯ JsTestDriver ·þÎñÆ÷£º
java -jar JsTestDriver-1.3.2.jar --port 9876 --browser "[Firefox Path]", "[IE Path]","[Safari Path]" |
ʹÓÃÕâ¸öÃüÁîÐУ¬·þÎñÆ÷½«ÒÔ Port 9876 Æô¶¯£¬²¶»ñÄúµÄ»úÆ÷ÉϵÄ
Firefox¡¢IE ºÍ Safari ä¯ÀÀÆ÷¡£ Æô¶¯²¢²¶»ñä¯ÀÀÆ÷ºó£¬¿ÉÒÔͨ¹ýÒÔÏÂÃüÁîÐÐÔËÐвâÊÔÓÃÀýÀࣺ
java -jar JsTestDriver-1.3.2.jar --tests all |
ÔËÐÐÃüÁîºó£¬Äú½«¿´µ½µÚÒ»ÂÖ½á¹û£¬Èç Çåµ¥ 6Ëùʾ¡£
Çåµ¥ 6. µÚÒ»ÂÖ½á¹û
Total 9 tests (Passed: 6; Fails: 3; Errors: 0) (16.00 ms) Firefox 3.6.18 Windows: Run 3 tests (Passed: 0; Fails: 3; Errors 0) (8.00 ms) ApplicationUtilTest.testValidateLoginFormBothEmpty failed (3.00 ms): AssertError: Username is not validated correctly! expected "This field is required" but was "" Error("Username is not validated correctly! expected \"This field is required\" but was \"\"")@:0()@http: //localhost :9876/test/js-test/TestApplicationUtil.js:16 ApplicationUtilTest.testValidateLoginFormWithEmptyUserName failed (3.00 ms): AssertError: Username is not validated correctly! expected "This field is required" but was "" Error("Username is not validated correctly! expected \"This field is required\" but was \"\"")@:0()@http: //localhost:9876/test /js-test/TestApplicationUtil.js:29 ApplicationUtilTest.testValidateLoginFormWithEmptyPassword failed (2.00 ms): AssertError: Password is not validated correctly! expected "This field is required" but was "" Error("Password is not validated correctly! expected \"This field is required\" but was \"\"")@:0()@http: //localhost:9876/test/ js-test/TestApplicationUtil.js:42 Safari 534.50 Windows: Run 3 tests (Passed: 3; Fails: 0; Errors 0) (2.00 ms) Microsoft Internet Explorer 8.0 Windows: Run 3 tests (Passed: 3; Fails: 0; Errors 0) (16.00 ms) Tests failed: Tests failed. See log for details. |
×¢Ò⣬ÔÚÇåµ¥ 6 ÖУ¬Ö÷ÒªÎÊÌâ³öÔÚ Firefox ÉÏ¡£²âÊÔÔÚ Internet Explorer ºÍ
Safari ÉϾù¿É˳ÀûÔËÐС£ »ØÒ³Ê× ÐÞ¸´ JavaScript ´úÂë²¢ÖØÐÂÔËÐвâÊÔÓÃÀý ÎÒÃÇÀ´ÐÞ¸´Ë𻵵Ä
JavaScript ´úÂë¡£ÎÒÃǽ«Ê¹Óà innerHTML Ìæ´ú innerText¡£Çåµ¥ 7 ÏÔʾÁËÐÞ¸´ºóµÄ
ApplicationUtil¶ÔÏó´úÂë¡£
Çåµ¥ 7. ÐÞ¸´ºóµÄ ApplicationUtil ¶ÔÏó´úÂë
appnamespace = {}; appnamespace.ApplicationUtil = function() {}; appnamespace.ApplicationUtil.prototype.validateLoginForm = function(){ var error = true; document.getElementById("usernameMessage").innerHTML = ""; document.getElementById("passwordMessage").innerHTML = ""; if (!document.getElementById("username").value) { document.getElementById("usernameMessage").innerHTML = "This field is required"; error = false; } if (!document.getElementById("password").value) { document.getElementById("passwordMessage").innerHTML = "This field is required"; error = false; } return error; }; |
ʹÓà --test all ÃüÁîÐвÎÊýÖØÐÂÔËÐвâÊÔÓÃÀý¶ÔÏó¡£Çåµ¥ 8ÏÔʾÁ˵ڶþÂÖÔËÐнá¹û¡£
Çåµ¥ 8. µÚ¶þÂÖÔËÐнá¹û
Total 9 tests (Passed: 9; Fails: 0; Errors: 0) (9.00 ms) Firefox 3.6.18 Windows: Run 3 tests (Passed: 3; Fails: 0; Errors 0) (9.00 ms) Safari 534.50 Windows: Run 3 tests (Passed: 3; Fails: 0; Errors 0) (5.00 ms) Microsoft Internet Explorer 8.0 Windows: Run 3 tests (Passed: 3; Fails: 0; Errors 0) (0.00 ms) |
ÈçÇåµ¥ 8 Ëùʾ£¬JavaScript ´úÂëÏÖÔÚÔÚ IE¡¢Firefox ºÍ Safari É϶¼ÄÜÕý³£ÔËÐС£
½áÊøÓï
ÔÚ±¾ÎÄÖУ¬ÄúÁ˽âÁËÈçºÎʹÓÃÒ»¸ö×îÇ¿´óµÄ JavaScript µ¥Ôª²âÊÔ¹¤¾ß
(JsTestDriver) ÔÚ²»Í¬µÄä¯ÀÀÆ÷ÉϲâÊÔ JavaScriptÓ¦ÓóÌÐò´úÂë¡£»¹Á˽âÁËʲôÊÇ JsTestDriver£¬ÈçºÎÅäÖÃËü£¬ÒÔ¼°ÈçºÎÔÚ
Web Ó¦ÓóÌÐòÖÐʹÓÃËüÀ´È·±£Ó¦ÓóÌÐòµÄ JavaScript´úÂëµÄÖÊÁ¿ºÍ¿É¿¿ÐÔ¡£
|