angular_webdriver 0.0.7 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -0
  3. data/.gitmodules +3 -0
  4. data/.rspec +2 -0
  5. data/.travis.yml +32 -0
  6. data/Gemfile +2 -0
  7. data/Thorfile +33 -1
  8. data/angular_webdriver.gemspec +10 -3
  9. data/docs/overview.md +101 -0
  10. data/docs/sync.md +53 -0
  11. data/lib/angular_webdriver/protractor/by.rb +331 -0
  12. data/lib/angular_webdriver/protractor/by_repeater_inner.rb +106 -0
  13. data/lib/angular_webdriver/protractor/client_side_scripts.rb +1035 -0
  14. data/lib/angular_webdriver/protractor/protractor.rb +396 -77
  15. data/lib/angular_webdriver/protractor/protractor_element.rb +33 -0
  16. data/lib/angular_webdriver/protractor/rspec_helpers.rb +19 -0
  17. data/lib/angular_webdriver/protractor/watir_patch.rb +209 -0
  18. data/lib/angular_webdriver/protractor/webdriver_patch.rb +246 -0
  19. data/lib/angular_webdriver/version.rb +2 -2
  20. data/lib/angular_webdriver.rb +14 -1
  21. data/{LICENSE → license/angular_webdriver/LICENSE.txt} +0 -0
  22. data/{lib/angular_webdriver → license}/protractor/LICENSE.txt +0 -0
  23. data/{lib/angular_webdriver/protractor/get_url_trace.rb → notes/bootstrap_notes.md} +13 -0
  24. data/notes/element_by_id/element_by_id_sync_off.txt +12 -0
  25. data/notes/element_by_id/element_by_id_sync_on.txt +74 -0
  26. data/notes/element_chaining_debug.txt +94 -0
  27. data/notes/evaluate/js_evaluate_sync_on.txt +60 -0
  28. data/notes/evaluate/ruby_evaluate_sync_on.txt +35 -0
  29. data/notes/get_title/browser_get_title_sync_off.txt +11 -0
  30. data/notes/get_title/browser_get_title_sync_on.txt +54 -0
  31. data/notes/phantomjs.md +23 -0
  32. data/notes/protractor_cli_bugs.txt +39 -0
  33. data/notes/protractor_get/protractor_get.rb +102 -0
  34. data/notes/protractor_get/protractor_get_website_sync_off.txt +11 -0
  35. data/notes/protractor_get/protractor_get_website_sync_on.txt +86 -0
  36. data/notes/repeater/findAllRepeaterRows_annotated.txt +150 -0
  37. data/notes/repeater/findAllRepeaterRows_raw.txt +145 -0
  38. data/notes/repeater/findRepeaterColumn_annotated.txt +317 -0
  39. data/notes/repeater/findRepeaterColumn_raw.txt +310 -0
  40. data/notes/repeater/findRepeaterElement_annotated.txt +152 -0
  41. data/notes/repeater/findRepeaterElement_raw.txt +146 -0
  42. data/notes/repeater/findRepeaterRows_annotated.txt +156 -0
  43. data/notes/repeater/findRepeaterRows_raw.txt +152 -0
  44. data/notes/sync_after.md +46 -0
  45. data/notes/sync_notes.md +137 -0
  46. data/notes/synchronize_spec/status_gettext.txt +121 -0
  47. data/notes/synchronize_spec/status_gettext_x3.txt +451 -0
  48. data/notes/synchronize_spec/synchronize_spec.js.txt +74 -0
  49. data/notes/synchronize_spec/watir_gettext.txt +73 -0
  50. data/readme.md +52 -12
  51. data/release_notes.md +127 -0
  52. data/selenium_server/lib/logs.rb +50 -0
  53. data/selenium_server/lib/selenium_server.rb +21 -0
  54. data/selenium_server/readme.md +3 -0
  55. data/selenium_server/spec/logs_spec.rb +18 -0
  56. data/selenium_server/spec/nodejs_sync_spec_waithttp_annotated.txt +54 -0
  57. data/selenium_server/spec/nodejs_sync_spec_waithttp_raw.txt +367 -0
  58. data/selenium_server/spec/nodejs_sync_spec_waithttp_raw_processed.txt +43 -0
  59. data/selenium_server/spec/ruby_sync_spec_waithttp_annotated.txt +59 -0
  60. data/selenium_server/spec/ruby_sync_spec_waithttp_raw.txt +267 -0
  61. data/selenium_server/spec/ruby_sync_spec_waithttp_raw_processed.txt +39 -0
  62. data/selenium_server/spec/spec_helper.rb +6 -0
  63. data/selenium_server/spec/status_gettext_x3.txt +429 -0
  64. data/selenium_server/spec/status_gettext_x3_annotated.txt +86 -0
  65. metadata +91 -18
  66. data/lib/angular_webdriver/protractor/clientSideScripts.json +0 -19
  67. data/lib/angular_webdriver/protractor/clientsidescripts.js +0 -671
  68. data/lib/angular_webdriver/protractor/scripts.rb +0 -7
  69. data/lib/angular_webdriver/protractor/scripts_to_json.js +0 -11
  70. data/spec/protractor_spec.rb +0 -40
  71. data/spec/spec_helper.rb +0 -5
@@ -1,19 +0,0 @@
1
- {
2
- "waitForAngular": "try { return (function (rootSelector, callback) {\n var el = document.querySelector(rootSelector);\n\n try {\n if (!window.angular) {\n throw new Error('angular could not be found on the window');\n }\n if (angular.getTestability) {\n angular.getTestability(el).whenStable(callback);\n } else {\n if (!angular.element(el).injector()) {\n throw new Error('root element (' + rootSelector + ') has no injector.' +\n ' this may mean it is not inside ng-app.');\n }\n angular.element(el).injector().get('$browser').\n notifyWhenNoOutstandingRequests(callback);\n }\n } catch (err) {\n callback(err.message);\n }\n}).apply(this, arguments); }\ncatch(e) { throw (e instanceof Error) ? e : new Error(e); }",
3
- "findBindings": "try { return (function (binding, exactMatch, using, rootSelector) {\n var root = document.querySelector(rootSelector || 'body');\n using = using || document;\n if (angular.getTestability) {\n return angular.getTestability(root).\n findBindings(using, binding, exactMatch);\n }\n var bindings = using.getElementsByClassName('ng-binding');\n var matches = [];\n for (var i = 0; i < bindings.length; ++i) {\n var dataBinding = angular.element(bindings[i]).data('$binding');\n if (dataBinding) {\n var bindingName = dataBinding.exp || dataBinding[0].exp || dataBinding;\n if (exactMatch) {\n var matcher = new RegExp('({|\\\\s|^|\\\\|)' + binding + '(}|\\\\s|$|\\\\|)');\n if (matcher.test(bindingName)) {\n matches.push(bindings[i]);\n }\n } else {\n if (bindingName.indexOf(binding) != -1) {\n matches.push(bindings[i]);\n }\n }\n\n }\n }\n return matches; /* Return the whole array for webdriver.findElements. */\n}).apply(this, arguments); }\ncatch(e) { throw (e instanceof Error) ? e : new Error(e); }",
4
- "findRepeaterRows": "try { return (function (repeater, exact, index, using) {\n function repeaterMatch(ngRepeat, repeater, exact) {\n if (exact) {\n return ngRepeat.split(' track by ')[0].split(' as ')[0].split('|')[0].\n trim() == repeater;\n } else {\n return ngRepeat.indexOf(repeater) != -1;\n }\n }\n\n using = using || document;\n\n var prefixes = ['ng-', 'ng_', 'data-ng-', 'x-ng-', 'ng\\\\:'];\n var rows = [];\n for (var p = 0; p < prefixes.length; ++p) {\n var attr = prefixes[p] + 'repeat';\n var repeatElems = using.querySelectorAll('[' + attr + ']');\n attr = attr.replace(/\\\\/g, '');\n for (var i = 0; i < repeatElems.length; ++i) {\n if (repeaterMatch(repeatElems[i].getAttribute(attr), repeater, exact)) {\n rows.push(repeatElems[i]);\n }\n }\n }\n /* multiRows is an array of arrays, where each inner array contains\n one row of elements. */\n var multiRows = [];\n for (var p = 0; p < prefixes.length; ++p) {\n var attr = prefixes[p] + 'repeat-start';\n var repeatElems = using.querySelectorAll('[' + attr + ']');\n attr = attr.replace(/\\\\/g, '');\n for (var i = 0; i < repeatElems.length; ++i) {\n if (repeaterMatch(repeatElems[i].getAttribute(attr), repeater, exact)) {\n var elem = repeatElems[i];\n var row = [];\n while (elem.nodeType != 8 ||\n !repeaterMatch(elem.nodeValue, repeater, exact)) {\n if (elem.nodeType == 1) {\n row.push(elem);\n }\n elem = elem.nextSibling;\n }\n multiRows.push(row);\n }\n }\n }\n var row = rows[index] || [], multiRow = multiRows[index] || [];\n return [].concat(row, multiRow);\n }).apply(this, arguments); }\ncatch(e) { throw (e instanceof Error) ? e : new Error(e); }",
5
- "findAllRepeaterRows": "try { return (function (repeater, exact, using) {\n function repeaterMatch(ngRepeat, repeater, exact) {\n if (exact) {\n return ngRepeat.split(' track by ')[0].split(' as ')[0].split('|')[0].\n trim() == repeater;\n } else {\n return ngRepeat.indexOf(repeater) != -1;\n }\n }\n\n using = using || document;\n\n var rows = [];\n var prefixes = ['ng-', 'ng_', 'data-ng-', 'x-ng-', 'ng\\\\:'];\n for (var p = 0; p < prefixes.length; ++p) {\n var attr = prefixes[p] + 'repeat';\n var repeatElems = using.querySelectorAll('[' + attr + ']');\n attr = attr.replace(/\\\\/g, '');\n for (var i = 0; i < repeatElems.length; ++i) {\n if (repeaterMatch(repeatElems[i].getAttribute(attr), repeater, exact)) {\n rows.push(repeatElems[i]);\n }\n }\n }\n for (var p = 0; p < prefixes.length; ++p) {\n var attr = prefixes[p] + 'repeat-start';\n var repeatElems = using.querySelectorAll('[' + attr + ']');\n attr = attr.replace(/\\\\/g, '');\n for (var i = 0; i < repeatElems.length; ++i) {\n if (repeaterMatch(repeatElems[i].getAttribute(attr), repeater, exact)) {\n var elem = repeatElems[i];\n while (elem.nodeType != 8 ||\n !repeaterMatch(elem.nodeValue, repeater, exact)) {\n if (elem.nodeType == 1) {\n rows.push(elem);\n }\n elem = elem.nextSibling;\n }\n }\n }\n }\n return rows;\n }).apply(this, arguments); }\ncatch(e) { throw (e instanceof Error) ? e : new Error(e); }",
6
- "findRepeaterElement": "try { return (function (repeater, exact, index, binding, using, rootSelector) {\n function repeaterMatch(ngRepeat, repeater, exact) {\n if (exact) {\n return ngRepeat.split(' track by ')[0].split(' as ')[0].split('|')[0].\n trim() == repeater;\n } else {\n return ngRepeat.indexOf(repeater) != -1;\n }\n }\n\n var matches = [];\n var root = document.querySelector(rootSelector || 'body');\n using = using || document;\n\n var rows = [];\n var prefixes = ['ng-', 'ng_', 'data-ng-', 'x-ng-', 'ng\\\\:'];\n for (var p = 0; p < prefixes.length; ++p) {\n var attr = prefixes[p] + 'repeat';\n var repeatElems = using.querySelectorAll('[' + attr + ']');\n attr = attr.replace(/\\\\/g, '');\n for (var i = 0; i < repeatElems.length; ++i) {\n if (repeaterMatch(repeatElems[i].getAttribute(attr), repeater, exact)) {\n rows.push(repeatElems[i]);\n }\n }\n }\n /* multiRows is an array of arrays, where each inner array contains\n one row of elements. */\n var multiRows = [];\n for (var p = 0; p < prefixes.length; ++p) {\n var attr = prefixes[p] + 'repeat-start';\n var repeatElems = using.querySelectorAll('[' + attr + ']');\n attr = attr.replace(/\\\\/g, '');\n for (var i = 0; i < repeatElems.length; ++i) {\n if (repeaterMatch(repeatElems[i].getAttribute(attr), repeater, exact)) {\n var elem = repeatElems[i];\n var row = [];\n while (elem.nodeType != 8 || (elem.nodeValue &&\n !repeaterMatch(elem.nodeValue, repeater, exact))) {\n if (elem.nodeType == 1) {\n row.push(elem);\n }\n elem = elem.nextSibling;\n }\n multiRows.push(row);\n }\n }\n }\n var row = rows[index];\n var multiRow = multiRows[index];\n var bindings = [];\n if (row) {\n if (angular.getTestability) {\n matches.push.apply(\n matches,\n angular.getTestability(root).findBindings(row, binding));\n } else {\n if (row.className.indexOf('ng-binding') != -1) {\n bindings.push(row);\n }\n var childBindings = row.getElementsByClassName('ng-binding');\n for (var i = 0; i < childBindings.length; ++i) {\n bindings.push(childBindings[i]);\n }\n }\n }\n if (multiRow) {\n for (var i = 0; i < multiRow.length; ++i) {\n var rowElem = multiRow[i];\n if (angular.getTestability) {\n matches.push.apply(\n matches,\n angular.getTestability(root).findBindings(rowElem, binding));\n } else {\n if (rowElem.className.indexOf('ng-binding') != -1) {\n bindings.push(rowElem);\n }\n var childBindings = rowElem.getElementsByClassName('ng-binding');\n for (var j = 0; j < childBindings.length; ++j) {\n bindings.push(childBindings[j]);\n }\n }\n }\n }\n for (var i = 0; i < bindings.length; ++i) {\n var dataBinding = angular.element(bindings[i]).data('$binding');\n if (dataBinding) {\n var bindingName = dataBinding.exp || dataBinding[0].exp || dataBinding;\n if (bindingName.indexOf(binding) != -1) {\n matches.push(bindings[i]);\n }\n }\n }\n return matches;\n}).apply(this, arguments); }\ncatch(e) { throw (e instanceof Error) ? e : new Error(e); }",
7
- "findRepeaterColumn": "try { return (function (repeater, exact, binding, using, rootSelector) {\n function repeaterMatch(ngRepeat, repeater, exact) {\n if (exact) {\n return ngRepeat.split(' track by ')[0].split(' as ')[0].split('|')[0].\n trim() == repeater;\n } else {\n return ngRepeat.indexOf(repeater) != -1;\n }\n }\n\n var matches = [];\n var root = document.querySelector(rootSelector || 'body');\n using = using || document;\n\n var rows = [];\n var prefixes = ['ng-', 'ng_', 'data-ng-', 'x-ng-', 'ng\\\\:'];\n for (var p = 0; p < prefixes.length; ++p) {\n var attr = prefixes[p] + 'repeat';\n var repeatElems = using.querySelectorAll('[' + attr + ']');\n attr = attr.replace(/\\\\/g, '');\n for (var i = 0; i < repeatElems.length; ++i) {\n if (repeaterMatch(repeatElems[i].getAttribute(attr), repeater, exact)) {\n rows.push(repeatElems[i]);\n }\n }\n }\n /* multiRows is an array of arrays, where each inner array contains\n one row of elements. */\n var multiRows = [];\n for (var p = 0; p < prefixes.length; ++p) {\n var attr = prefixes[p] + 'repeat-start';\n var repeatElems = using.querySelectorAll('[' + attr + ']');\n attr = attr.replace(/\\\\/g, '');\n for (var i = 0; i < repeatElems.length; ++i) {\n if (repeaterMatch(repeatElems[i].getAttribute(attr), repeater, exact)) {\n var elem = repeatElems[i];\n var row = [];\n while (elem.nodeType != 8 || (elem.nodeValue &&\n !repeaterMatch(elem.nodeValue, repeater, exact))) {\n if (elem.nodeType == 1) {\n row.push(elem);\n }\n elem = elem.nextSibling;\n }\n multiRows.push(row);\n }\n }\n }\n var bindings = [];\n for (var i = 0; i < rows.length; ++i) {\n if (angular.getTestability) {\n matches.push.apply(\n matches,\n angular.getTestability(root).findBindings(rows[i], binding));\n } else {\n if (rows[i].className.indexOf('ng-binding') != -1) {\n bindings.push(rows[i]);\n }\n var childBindings = rows[i].getElementsByClassName('ng-binding');\n for (var k = 0; k < childBindings.length; ++k) {\n bindings.push(childBindings[k]);\n }\n }\n }\n for (var i = 0; i < multiRows.length; ++i) {\n for (var j = 0; j < multiRows[i].length; ++j) {\n if (angular.getTestability) {\n matches.push.apply(\n matches,\n angular.getTestability(root).findBindings(multiRows[i][j], binding));\n } else {\n var elem = multiRows[i][j];\n if (elem.className.indexOf('ng-binding') != -1) {\n bindings.push(elem);\n }\n var childBindings = elem.getElementsByClassName('ng-binding');\n for (var k = 0; k < childBindings.length; ++k) {\n bindings.push(childBindings[k]);\n }\n }\n }\n }\n for (var j = 0; j < bindings.length; ++j) {\n var dataBinding = angular.element(bindings[j]).data('$binding');\n if (dataBinding) {\n var bindingName = dataBinding.exp || dataBinding[0].exp || dataBinding;\n if (bindingName.indexOf(binding) != -1) {\n matches.push(bindings[j]);\n }\n }\n }\n return matches;\n}).apply(this, arguments); }\ncatch(e) { throw (e instanceof Error) ? e : new Error(e); }",
8
- "findByModel": "try { return (function (model, using, rootSelector) {\n var root = document.querySelector(rootSelector || 'body');\n using = using || document;\n\n if (angular.getTestability) {\n return angular.getTestability(root).\n findModels(using, model, true);\n }\n var prefixes = ['ng-', 'ng_', 'data-ng-', 'x-ng-', 'ng\\\\:'];\n for (var p = 0; p < prefixes.length; ++p) {\n var selector = '[' + prefixes[p] + 'model=\"' + model + '\"]';\n var elements = using.querySelectorAll(selector);\n if (elements.length) {\n return elements;\n }\n }\n}).apply(this, arguments); }\ncatch(e) { throw (e instanceof Error) ? e : new Error(e); }",
9
- "findByOptions": "try { return (function (optionsDescriptor, using) {\n using = using || document;\n\n var prefixes = ['ng-', 'ng_', 'data-ng-', 'x-ng-', 'ng\\\\:'];\n for (var p = 0; p < prefixes.length; ++p) {\n var selector = '[' + prefixes[p] + 'options=\"' + optionsDescriptor + '\"] option';\n var elements = using.querySelectorAll(selector);\n if (elements.length) {\n return elements;\n }\n }\n}).apply(this, arguments); }\ncatch(e) { throw (e instanceof Error) ? e : new Error(e); }",
10
- "findByButtonText": "try { return (function (searchText, using) {\n using = using || document;\n\n var elements = using.querySelectorAll('button, input[type=\"button\"], input[type=\"submit\"]');\n var matches = [];\n for (var i = 0; i < elements.length; ++i) {\n var element = elements[i];\n var elementText;\n if (element.tagName.toLowerCase() == 'button') {\n elementText = element.textContent || element.innerText || '';\n } else {\n elementText = element.value;\n }\n if (elementText.trim() === searchText) {\n matches.push(element);\n }\n }\n\n return matches;\n}).apply(this, arguments); }\ncatch(e) { throw (e instanceof Error) ? e : new Error(e); }",
11
- "findByPartialButtonText": "try { return (function (searchText, using) {\n using = using || document;\n\n var elements = using.querySelectorAll('button, input[type=\"button\"], input[type=\"submit\"]');\n var matches = [];\n for (var i = 0; i < elements.length; ++i) {\n var element = elements[i];\n var elementText;\n if (element.tagName.toLowerCase() == 'button') {\n elementText = element.textContent || element.innerText || '';\n } else {\n elementText = element.value;\n }\n if (elementText.indexOf(searchText) > -1) {\n matches.push(element);\n }\n }\n\n return matches;\n}).apply(this, arguments); }\ncatch(e) { throw (e instanceof Error) ? e : new Error(e); }",
12
- "findByCssContainingText": "try { return (function (cssSelector, searchText, using) {\n using = using || document;\n\n var elements = using.querySelectorAll(cssSelector);\n var matches = [];\n for (var i = 0; i < elements.length; ++i) {\n var element = elements[i];\n var elementText = element.textContent || element.innerText || '';\n if (elementText.indexOf(searchText) > -1) {\n matches.push(element);\n }\n }\n return matches;\n}).apply(this, arguments); }\ncatch(e) { throw (e instanceof Error) ? e : new Error(e); }",
13
- "testForAngular": "try { return (function (attempts, asyncCallback) {\n var callback = function(args) {\n setTimeout(function() {\n asyncCallback(args);\n }, 0);\n };\n var check = function(n) {\n try {\n if (window.angular && window.angular.resumeBootstrap) {\n callback([true, null]);\n } else if (n < 1) {\n if (window.angular) {\n callback([false, 'angular never provided resumeBootstrap']);\n } else {\n callback([false, 'retries looking for angular exceeded']);\n }\n } else {\n window.setTimeout(function() {check(n - 1);}, 1000);\n }\n } catch (e) {\n callback([false, e]);\n }\n };\n check(attempts);\n}).apply(this, arguments); }\ncatch(e) { throw (e instanceof Error) ? e : new Error(e); }",
14
- "evaluate": "try { return (function (element, expression) {\n return angular.element(element).scope().$eval(expression);\n}).apply(this, arguments); }\ncatch(e) { throw (e instanceof Error) ? e : new Error(e); }",
15
- "allowAnimations": "try { return (function (element, value) {\n var ngElement = angular.element(element);\n if (ngElement.allowAnimations) {\n // AngularDart: $testability API.\n return ngElement.allowAnimations(value);\n } else {\n // AngularJS\n var enabledFn = ngElement.injector().get('$animate').enabled;\n return (value == null) ? enabledFn() : enabledFn(value);\n }\n}).apply(this, arguments); }\ncatch(e) { throw (e instanceof Error) ? e : new Error(e); }",
16
- "getLocationAbsUrl": "try { return (function (selector) {\n var el = document.querySelector(selector);\n if (angular.getTestability) {\n return angular.getTestability(el).\n getLocation();\n }\n return angular.element(el).injector().get('$location').absUrl();\n}).apply(this, arguments); }\ncatch(e) { throw (e instanceof Error) ? e : new Error(e); }",
17
- "setLocation": "try { return (function (selector, url) {\n var el = document.querySelector(selector);\n if (angular.getTestability) {\n return angular.getTestability(el).\n setLocation(url);\n }\n var $injector = angular.element(el).injector();\n var $location = $injector.get('$location');\n var $rootScope = $injector.get('$rootScope');\n\n if (url !== $location.url()) {\n $location.url(url);\n $rootScope.$digest();\n }\n}).apply(this, arguments); }\ncatch(e) { throw (e instanceof Error) ? e : new Error(e); }",
18
- "installInBrowser": "window.clientSideScripts = {waitForAngular: function (rootSelector, callback) {\n var el = document.querySelector(rootSelector);\n\n try {\n if (!window.angular) {\n throw new Error('angular could not be found on the window');\n }\n if (angular.getTestability) {\n angular.getTestability(el).whenStable(callback);\n } else {\n if (!angular.element(el).injector()) {\n throw new Error('root element (' + rootSelector + ') has no injector.' +\n ' this may mean it is not inside ng-app.');\n }\n angular.element(el).injector().get('$browser').\n notifyWhenNoOutstandingRequests(callback);\n }\n } catch (err) {\n callback(err.message);\n }\n}, findBindings: function (binding, exactMatch, using, rootSelector) {\n var root = document.querySelector(rootSelector || 'body');\n using = using || document;\n if (angular.getTestability) {\n return angular.getTestability(root).\n findBindings(using, binding, exactMatch);\n }\n var bindings = using.getElementsByClassName('ng-binding');\n var matches = [];\n for (var i = 0; i < bindings.length; ++i) {\n var dataBinding = angular.element(bindings[i]).data('$binding');\n if (dataBinding) {\n var bindingName = dataBinding.exp || dataBinding[0].exp || dataBinding;\n if (exactMatch) {\n var matcher = new RegExp('({|\\\\s|^|\\\\|)' + binding + '(}|\\\\s|$|\\\\|)');\n if (matcher.test(bindingName)) {\n matches.push(bindings[i]);\n }\n } else {\n if (bindingName.indexOf(binding) != -1) {\n matches.push(bindings[i]);\n }\n }\n\n }\n }\n return matches; /* Return the whole array for webdriver.findElements. */\n}, findRepeaterRows: function (repeater, exact, index, using) {\n function repeaterMatch(ngRepeat, repeater, exact) {\n if (exact) {\n return ngRepeat.split(' track by ')[0].split(' as ')[0].split('|')[0].\n trim() == repeater;\n } else {\n return ngRepeat.indexOf(repeater) != -1;\n }\n }\n\n using = using || document;\n\n var prefixes = ['ng-', 'ng_', 'data-ng-', 'x-ng-', 'ng\\\\:'];\n var rows = [];\n for (var p = 0; p < prefixes.length; ++p) {\n var attr = prefixes[p] + 'repeat';\n var repeatElems = using.querySelectorAll('[' + attr + ']');\n attr = attr.replace(/\\\\/g, '');\n for (var i = 0; i < repeatElems.length; ++i) {\n if (repeaterMatch(repeatElems[i].getAttribute(attr), repeater, exact)) {\n rows.push(repeatElems[i]);\n }\n }\n }\n /* multiRows is an array of arrays, where each inner array contains\n one row of elements. */\n var multiRows = [];\n for (var p = 0; p < prefixes.length; ++p) {\n var attr = prefixes[p] + 'repeat-start';\n var repeatElems = using.querySelectorAll('[' + attr + ']');\n attr = attr.replace(/\\\\/g, '');\n for (var i = 0; i < repeatElems.length; ++i) {\n if (repeaterMatch(repeatElems[i].getAttribute(attr), repeater, exact)) {\n var elem = repeatElems[i];\n var row = [];\n while (elem.nodeType != 8 ||\n !repeaterMatch(elem.nodeValue, repeater, exact)) {\n if (elem.nodeType == 1) {\n row.push(elem);\n }\n elem = elem.nextSibling;\n }\n multiRows.push(row);\n }\n }\n }\n var row = rows[index] || [], multiRow = multiRows[index] || [];\n return [].concat(row, multiRow);\n }, findAllRepeaterRows: function (repeater, exact, using) {\n function repeaterMatch(ngRepeat, repeater, exact) {\n if (exact) {\n return ngRepeat.split(' track by ')[0].split(' as ')[0].split('|')[0].\n trim() == repeater;\n } else {\n return ngRepeat.indexOf(repeater) != -1;\n }\n }\n\n using = using || document;\n\n var rows = [];\n var prefixes = ['ng-', 'ng_', 'data-ng-', 'x-ng-', 'ng\\\\:'];\n for (var p = 0; p < prefixes.length; ++p) {\n var attr = prefixes[p] + 'repeat';\n var repeatElems = using.querySelectorAll('[' + attr + ']');\n attr = attr.replace(/\\\\/g, '');\n for (var i = 0; i < repeatElems.length; ++i) {\n if (repeaterMatch(repeatElems[i].getAttribute(attr), repeater, exact)) {\n rows.push(repeatElems[i]);\n }\n }\n }\n for (var p = 0; p < prefixes.length; ++p) {\n var attr = prefixes[p] + 'repeat-start';\n var repeatElems = using.querySelectorAll('[' + attr + ']');\n attr = attr.replace(/\\\\/g, '');\n for (var i = 0; i < repeatElems.length; ++i) {\n if (repeaterMatch(repeatElems[i].getAttribute(attr), repeater, exact)) {\n var elem = repeatElems[i];\n while (elem.nodeType != 8 ||\n !repeaterMatch(elem.nodeValue, repeater, exact)) {\n if (elem.nodeType == 1) {\n rows.push(elem);\n }\n elem = elem.nextSibling;\n }\n }\n }\n }\n return rows;\n }, findRepeaterElement: function (repeater, exact, index, binding, using, rootSelector) {\n function repeaterMatch(ngRepeat, repeater, exact) {\n if (exact) {\n return ngRepeat.split(' track by ')[0].split(' as ')[0].split('|')[0].\n trim() == repeater;\n } else {\n return ngRepeat.indexOf(repeater) != -1;\n }\n }\n\n var matches = [];\n var root = document.querySelector(rootSelector || 'body');\n using = using || document;\n\n var rows = [];\n var prefixes = ['ng-', 'ng_', 'data-ng-', 'x-ng-', 'ng\\\\:'];\n for (var p = 0; p < prefixes.length; ++p) {\n var attr = prefixes[p] + 'repeat';\n var repeatElems = using.querySelectorAll('[' + attr + ']');\n attr = attr.replace(/\\\\/g, '');\n for (var i = 0; i < repeatElems.length; ++i) {\n if (repeaterMatch(repeatElems[i].getAttribute(attr), repeater, exact)) {\n rows.push(repeatElems[i]);\n }\n }\n }\n /* multiRows is an array of arrays, where each inner array contains\n one row of elements. */\n var multiRows = [];\n for (var p = 0; p < prefixes.length; ++p) {\n var attr = prefixes[p] + 'repeat-start';\n var repeatElems = using.querySelectorAll('[' + attr + ']');\n attr = attr.replace(/\\\\/g, '');\n for (var i = 0; i < repeatElems.length; ++i) {\n if (repeaterMatch(repeatElems[i].getAttribute(attr), repeater, exact)) {\n var elem = repeatElems[i];\n var row = [];\n while (elem.nodeType != 8 || (elem.nodeValue &&\n !repeaterMatch(elem.nodeValue, repeater, exact))) {\n if (elem.nodeType == 1) {\n row.push(elem);\n }\n elem = elem.nextSibling;\n }\n multiRows.push(row);\n }\n }\n }\n var row = rows[index];\n var multiRow = multiRows[index];\n var bindings = [];\n if (row) {\n if (angular.getTestability) {\n matches.push.apply(\n matches,\n angular.getTestability(root).findBindings(row, binding));\n } else {\n if (row.className.indexOf('ng-binding') != -1) {\n bindings.push(row);\n }\n var childBindings = row.getElementsByClassName('ng-binding');\n for (var i = 0; i < childBindings.length; ++i) {\n bindings.push(childBindings[i]);\n }\n }\n }\n if (multiRow) {\n for (var i = 0; i < multiRow.length; ++i) {\n var rowElem = multiRow[i];\n if (angular.getTestability) {\n matches.push.apply(\n matches,\n angular.getTestability(root).findBindings(rowElem, binding));\n } else {\n if (rowElem.className.indexOf('ng-binding') != -1) {\n bindings.push(rowElem);\n }\n var childBindings = rowElem.getElementsByClassName('ng-binding');\n for (var j = 0; j < childBindings.length; ++j) {\n bindings.push(childBindings[j]);\n }\n }\n }\n }\n for (var i = 0; i < bindings.length; ++i) {\n var dataBinding = angular.element(bindings[i]).data('$binding');\n if (dataBinding) {\n var bindingName = dataBinding.exp || dataBinding[0].exp || dataBinding;\n if (bindingName.indexOf(binding) != -1) {\n matches.push(bindings[i]);\n }\n }\n }\n return matches;\n}, findRepeaterColumn: function (repeater, exact, binding, using, rootSelector) {\n function repeaterMatch(ngRepeat, repeater, exact) {\n if (exact) {\n return ngRepeat.split(' track by ')[0].split(' as ')[0].split('|')[0].\n trim() == repeater;\n } else {\n return ngRepeat.indexOf(repeater) != -1;\n }\n }\n\n var matches = [];\n var root = document.querySelector(rootSelector || 'body');\n using = using || document;\n\n var rows = [];\n var prefixes = ['ng-', 'ng_', 'data-ng-', 'x-ng-', 'ng\\\\:'];\n for (var p = 0; p < prefixes.length; ++p) {\n var attr = prefixes[p] + 'repeat';\n var repeatElems = using.querySelectorAll('[' + attr + ']');\n attr = attr.replace(/\\\\/g, '');\n for (var i = 0; i < repeatElems.length; ++i) {\n if (repeaterMatch(repeatElems[i].getAttribute(attr), repeater, exact)) {\n rows.push(repeatElems[i]);\n }\n }\n }\n /* multiRows is an array of arrays, where each inner array contains\n one row of elements. */\n var multiRows = [];\n for (var p = 0; p < prefixes.length; ++p) {\n var attr = prefixes[p] + 'repeat-start';\n var repeatElems = using.querySelectorAll('[' + attr + ']');\n attr = attr.replace(/\\\\/g, '');\n for (var i = 0; i < repeatElems.length; ++i) {\n if (repeaterMatch(repeatElems[i].getAttribute(attr), repeater, exact)) {\n var elem = repeatElems[i];\n var row = [];\n while (elem.nodeType != 8 || (elem.nodeValue &&\n !repeaterMatch(elem.nodeValue, repeater, exact))) {\n if (elem.nodeType == 1) {\n row.push(elem);\n }\n elem = elem.nextSibling;\n }\n multiRows.push(row);\n }\n }\n }\n var bindings = [];\n for (var i = 0; i < rows.length; ++i) {\n if (angular.getTestability) {\n matches.push.apply(\n matches,\n angular.getTestability(root).findBindings(rows[i], binding));\n } else {\n if (rows[i].className.indexOf('ng-binding') != -1) {\n bindings.push(rows[i]);\n }\n var childBindings = rows[i].getElementsByClassName('ng-binding');\n for (var k = 0; k < childBindings.length; ++k) {\n bindings.push(childBindings[k]);\n }\n }\n }\n for (var i = 0; i < multiRows.length; ++i) {\n for (var j = 0; j < multiRows[i].length; ++j) {\n if (angular.getTestability) {\n matches.push.apply(\n matches,\n angular.getTestability(root).findBindings(multiRows[i][j], binding));\n } else {\n var elem = multiRows[i][j];\n if (elem.className.indexOf('ng-binding') != -1) {\n bindings.push(elem);\n }\n var childBindings = elem.getElementsByClassName('ng-binding');\n for (var k = 0; k < childBindings.length; ++k) {\n bindings.push(childBindings[k]);\n }\n }\n }\n }\n for (var j = 0; j < bindings.length; ++j) {\n var dataBinding = angular.element(bindings[j]).data('$binding');\n if (dataBinding) {\n var bindingName = dataBinding.exp || dataBinding[0].exp || dataBinding;\n if (bindingName.indexOf(binding) != -1) {\n matches.push(bindings[j]);\n }\n }\n }\n return matches;\n}, findByModel: function (model, using, rootSelector) {\n var root = document.querySelector(rootSelector || 'body');\n using = using || document;\n\n if (angular.getTestability) {\n return angular.getTestability(root).\n findModels(using, model, true);\n }\n var prefixes = ['ng-', 'ng_', 'data-ng-', 'x-ng-', 'ng\\\\:'];\n for (var p = 0; p < prefixes.length; ++p) {\n var selector = '[' + prefixes[p] + 'model=\"' + model + '\"]';\n var elements = using.querySelectorAll(selector);\n if (elements.length) {\n return elements;\n }\n }\n}, findByOptions: function (optionsDescriptor, using) {\n using = using || document;\n\n var prefixes = ['ng-', 'ng_', 'data-ng-', 'x-ng-', 'ng\\\\:'];\n for (var p = 0; p < prefixes.length; ++p) {\n var selector = '[' + prefixes[p] + 'options=\"' + optionsDescriptor + '\"] option';\n var elements = using.querySelectorAll(selector);\n if (elements.length) {\n return elements;\n }\n }\n}, findByButtonText: function (searchText, using) {\n using = using || document;\n\n var elements = using.querySelectorAll('button, input[type=\"button\"], input[type=\"submit\"]');\n var matches = [];\n for (var i = 0; i < elements.length; ++i) {\n var element = elements[i];\n var elementText;\n if (element.tagName.toLowerCase() == 'button') {\n elementText = element.textContent || element.innerText || '';\n } else {\n elementText = element.value;\n }\n if (elementText.trim() === searchText) {\n matches.push(element);\n }\n }\n\n return matches;\n}, findByPartialButtonText: function (searchText, using) {\n using = using || document;\n\n var elements = using.querySelectorAll('button, input[type=\"button\"], input[type=\"submit\"]');\n var matches = [];\n for (var i = 0; i < elements.length; ++i) {\n var element = elements[i];\n var elementText;\n if (element.tagName.toLowerCase() == 'button') {\n elementText = element.textContent || element.innerText || '';\n } else {\n elementText = element.value;\n }\n if (elementText.indexOf(searchText) > -1) {\n matches.push(element);\n }\n }\n\n return matches;\n}, findByCssContainingText: function (cssSelector, searchText, using) {\n using = using || document;\n\n var elements = using.querySelectorAll(cssSelector);\n var matches = [];\n for (var i = 0; i < elements.length; ++i) {\n var element = elements[i];\n var elementText = element.textContent || element.innerText || '';\n if (elementText.indexOf(searchText) > -1) {\n matches.push(element);\n }\n }\n return matches;\n}, testForAngular: function (attempts, asyncCallback) {\n var callback = function(args) {\n setTimeout(function() {\n asyncCallback(args);\n }, 0);\n };\n var check = function(n) {\n try {\n if (window.angular && window.angular.resumeBootstrap) {\n callback([true, null]);\n } else if (n < 1) {\n if (window.angular) {\n callback([false, 'angular never provided resumeBootstrap']);\n } else {\n callback([false, 'retries looking for angular exceeded']);\n }\n } else {\n window.setTimeout(function() {check(n - 1);}, 1000);\n }\n } catch (e) {\n callback([false, e]);\n }\n };\n check(attempts);\n}, evaluate: function (element, expression) {\n return angular.element(element).scope().$eval(expression);\n}, allowAnimations: function (element, value) {\n var ngElement = angular.element(element);\n if (ngElement.allowAnimations) {\n // AngularDart: $testability API.\n return ngElement.allowAnimations(value);\n } else {\n // AngularJS\n var enabledFn = ngElement.injector().get('$animate').enabled;\n return (value == null) ? enabledFn() : enabledFn(value);\n }\n}, getLocationAbsUrl: function (selector) {\n var el = document.querySelector(selector);\n if (angular.getTestability) {\n return angular.getTestability(el).\n getLocation();\n }\n return angular.element(el).injector().get('$location').absUrl();\n}, setLocation: function (selector, url) {\n var el = document.querySelector(selector);\n if (angular.getTestability) {\n return angular.getTestability(el).\n setLocation(url);\n }\n var $injector = angular.element(el).injector();\n var $location = $injector.get('$location');\n var $rootScope = $injector.get('$rootScope');\n\n if (url !== $location.url()) {\n $location.url(url);\n $rootScope.$digest();\n }\n}};"
19
- }