expect.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. var util = require('util');
  2. var events = require('events');
  3. var chai = require('chai-nightwatch');
  4. var expect = chai.expect;
  5. var ChaiAssertion = chai.Assertion;
  6. var Q = require('q');
  7. var flag = chai.flag;
  8. module.exports = function(client) {
  9. var Protocol = require('./protocol.js')(client);
  10. var PresentAssertion = require('./expect/present.js');
  11. var AttributeAssertion = require('./expect/attribute.js');
  12. var CssAssertion = require('./expect/css.js');
  13. var TextAssertion = require('./expect/text.js');
  14. var EnabledAssertion = require('./expect/enabled.js');
  15. var VisibleAssertion = require('./expect/visible.js');
  16. var SelectedAssertion = require('./expect/selected.js');
  17. var TypeAssertion = require('./expect/type.js');
  18. var ValueAssertion = require('./expect/value.js');
  19. var Expect = {};
  20. ChaiAssertion.addMethod('before', function(ms) {
  21. flag(this, 'waitFor', ms);
  22. flag(this, 'before', true);
  23. });
  24. ChaiAssertion.addMethod('after', function(ms) {
  25. flag(this, 'after', true);
  26. flag(this, 'waitFor', ms);
  27. });
  28. ChaiAssertion.addProperty('present', function() {
  29. createAssertion(PresentAssertion, this);
  30. });
  31. ChaiAssertion.addProperty('enabled', function() {
  32. createAssertion(EnabledAssertion, this);
  33. });
  34. ChaiAssertion.addProperty('text', function() {
  35. createAssertion(TextAssertion, this);
  36. });
  37. ChaiAssertion.addProperty('value', function() {
  38. createAssertion(ValueAssertion, this);
  39. });
  40. ChaiAssertion.addProperty('visible', function() {
  41. createAssertion(VisibleAssertion, this);
  42. });
  43. ChaiAssertion.addProperty('selected', function() {
  44. createAssertion(SelectedAssertion, this);
  45. });
  46. ChaiAssertion.addMethod('attribute', function(attribute, msg) {
  47. createAssertion(AttributeAssertion, this, [attribute, msg]);
  48. });
  49. ChaiAssertion.addMethod('css', function(property, msg) {
  50. createAssertion(CssAssertion, this, [property, msg]);
  51. });
  52. function typeAssertion(type, msg) {
  53. createAssertion(TypeAssertion, this, [type, msg]);
  54. }
  55. ChaiAssertion.addMethod('a', typeAssertion);
  56. ChaiAssertion.addMethod('an', typeAssertion);
  57. function createAssertion(AssertionClass, chaiAssert, args) {
  58. function F() {
  59. this.setAssertion(chaiAssert)
  60. .setClient(client)
  61. .setProtocol(Protocol)
  62. .init();
  63. return AssertionClass.apply(this, args);
  64. }
  65. F.prototype = AssertionClass.prototype;
  66. chaiAssert.assertion = new F();
  67. }
  68. function Element(selector, using) {
  69. this.selector = selector;
  70. this.using = using;
  71. this.startTime = null;
  72. this.emitter = null;
  73. this.createPromise();
  74. }
  75. util.inherits(Element, events.EventEmitter);
  76. Element.prototype.getElementsCommand = function(callback) {
  77. this.locator = this.using || client.locateStrategy || 'css selector';
  78. return Protocol.elements(this.locator, this.selector, callback);
  79. };
  80. Element.prototype.promise = function() {
  81. return this.deferred.promise;
  82. };
  83. Element.prototype.createPromise = function() {
  84. this.deferred = Q.defer();
  85. return this.deferred.promise;
  86. };
  87. Element.prototype.locate = function(emitter) {
  88. if (emitter) {
  89. this.emitter = emitter;
  90. this.startTime = new Date().getTime();
  91. }
  92. this.getElementsCommand(function(result) {
  93. if (result.status !== 0 || !result.value || result.value.length === 0) {
  94. this.deferred.reject(result);
  95. } else {
  96. this.deferred.resolve(result.value[0]);
  97. }
  98. }.bind(this));
  99. };
  100. Expect.element = function(selector, using) {
  101. var element = new Element(selector, using);
  102. var promise = element.promise();
  103. var expect = chai.expect(promise);
  104. flag(expect, 'selector', selector);
  105. flag(expect, 'promise', promise);
  106. flag(expect, 'element', element);
  107. return {
  108. element : element,
  109. expect : expect
  110. };
  111. };
  112. return Expect;
  113. };