Source: browser-command/generic-browser-commands.js

  1. 'use strict';
  2. /**
  3. * @module browser-command/generic-browser-commands
  4. * @desc Defines custom browser commands that are made available through the global WebdriverIO browser object.
  5. */
  6. const genericBrowserCommands = {
  7. /**
  8. * @function waitForAllVisible
  9. * @desc Similar to waitForVisible from webdriverio but on multiple elements
  10. * @since 1.0.0
  11. * @param {string[]} elements - Array of elements that are CSS selectors
  12. * @returns {Promise}
  13. */
  14. waitForAllVisible(elements) {
  15. const promises = [];
  16. for (const i in elements) {
  17. if (elements.hasOwnProperty(i)) {
  18. promises.push(browser.waitForVisible(elements[i]));
  19. }
  20. }
  21. return Promise.all(promises);
  22. },
  23. /**
  24. * @function getNumberOfElements
  25. * @desc Get the number of elements matching a specific CSS selector
  26. * @since 1.0.0
  27. * @param {string} selector - CSS selector to identify the elements
  28. * @returns {Promise}
  29. */
  30. async getNumberOfElements(selector) {
  31. const elements = await browser.elements(selector);
  32. return elements.value.length;
  33. },
  34. /**
  35. * @function clickNthElement
  36. * @desc Click on the nth element of the list of elements matching the CSS selector
  37. * @since 1.0.0
  38. * @param {string} selector - CSS selector to identify the elements
  39. * @param {number} nth - Element to click on. First element is at rank 1.
  40. * @returns {Promise}
  41. */
  42. async clickNthElement(selector, nth) {
  43. const elements = await browser.elements(selector);
  44. return browser.elementIdClick(elements.value[nth - 1].ELEMENT);
  45. },
  46. /**
  47. * @function clickFirstElement
  48. * @desc Click on the first element of the list of elements matching the CSS selector
  49. * @since 1.0.0
  50. * @param {string} selector - CSS selector to identify the elements
  51. * @returns {Promise}
  52. */
  53. async clickFirstElement(selector) {
  54. const elements = await browser.elements(selector);
  55. return browser.elementIdClick(elements.value[0].ELEMENT);
  56. },
  57. /**
  58. * @function clickLastElement
  59. * @desc Click on the last element of the list of elements matching the CSS selector
  60. * @since 1.0.0
  61. * @param {string} selector - CSS selector to identify the elements
  62. * @returns {Promise}
  63. */
  64. async clickLastElement(selector) {
  65. const elements = await browser.elements(selector);
  66. return browser.elementIdClick(elements.value[elements.value.length - 1].ELEMENT);
  67. },
  68. /**
  69. * @desc Scroll vertically and horizontally from the element position before clicking.
  70. * It can be used for instance when there is a floating object that hides a button to click on. A scroll would allow to make the button
  71. * move out of the floating object and thus be clickable.
  72. * @since 1.1.0
  73. * @param {string} selector CSS selector to match
  74. * @param {int} hOffset Offset for the horizontal scroll
  75. * @param {int} vOffset Offset for the vertical scroll
  76. * @param {int} [pause = 200] Pause in ms after scrolling (for the floating element to disappear for instance)
  77. */
  78. async scrollAndClick(selector, hOffset, vOffset, pause = 200) {
  79. const elementId = await browser
  80. .scroll(selector, hOffset, vOffset)
  81. .pause(pause)
  82. .element(selector);
  83. return browser.elementIdClick(elementId.value.ELEMENT);
  84. },
  85. };
  86. /**
  87. * @alias genericBrowserCommand.waitForAllVisible
  88. * @memberOf browser
  89. * @method waitForAllVisible
  90. */
  91. browser.addCommand(
  92. 'waitForAllVisible',
  93. function (elements) {
  94. return genericBrowserCommands.waitForAllVisible(elements);
  95. }
  96. );
  97. /**
  98. * @alias genericBrowserCommand.getNumberOfElements
  99. * @memberOf browser
  100. * @method getNumberOfElements
  101. */
  102. browser.addCommand(
  103. 'getNumberOfElements',
  104. function (selector) {
  105. return genericBrowserCommands.getNumberOfElements(selector);
  106. }
  107. );
  108. /**
  109. * @alias genericBrowserCommand.clickNthElement
  110. * @memberOf browser
  111. * @method clickNthElement
  112. */
  113. browser.addCommand(
  114. 'clickNthElement',
  115. function (selector, nth) {
  116. return genericBrowserCommands.clickNthElement(selector, nth);
  117. }
  118. );
  119. /**
  120. * @alias genericBrowserCommand.clickFirstElement
  121. * @memberOf browser
  122. * @method clickFirstElement
  123. */
  124. browser.addCommand(
  125. 'clickFirstElement',
  126. function (selector) {
  127. return genericBrowserCommands.clickFirstElement(selector);
  128. }
  129. );
  130. /**
  131. * @alias genericBrowserCommand.clickLastElement
  132. * @memberOf browser
  133. * @method clickLastElement
  134. */
  135. browser.addCommand(
  136. 'clickLastElement',
  137. function (selector) {
  138. return genericBrowserCommands.clickLastElement(selector);
  139. }
  140. );
  141. /**
  142. * @alias genericBrowserCommand.scrollAndClick
  143. * @memberOf browser
  144. * @method scrollAndClick
  145. */
  146. browser.addCommand(
  147. 'scrollAndClick',
  148. function (selector, hOffset, vOffset, pause) {
  149. return genericBrowserCommands.scrollAndClick(selector, hOffset, vOffset, pause);
  150. }
  151. );
  152. module.exports = genericBrowserCommands;