Commands.pm 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334
  1. package Selenium::Remote::Commands;
  2. # ABSTRACT: Implement commands for Selenium::Remote::Driver
  3. use Moo;
  4. has '_cmds' => (
  5. is => 'lazy',
  6. reader => 'get_cmds',
  7. builder => sub {
  8. return {
  9. 'status' => {
  10. 'method' => 'GET',
  11. 'url' => 'status'
  12. },
  13. 'newSession' => {
  14. 'method' => 'POST',
  15. 'url' => 'session'
  16. },
  17. 'getSessions' => {
  18. 'method' => 'GET',
  19. 'url' => 'sessions'
  20. },
  21. 'getCapabilities' => {
  22. 'method' => 'GET',
  23. 'url' => 'session/:sessionId'
  24. },
  25. 'setTimeout' => {
  26. 'method' => 'POST',
  27. 'url' => 'session/:sessionId/timeouts'
  28. },
  29. 'setAsyncScriptTimeout' => {
  30. 'method' => 'POST',
  31. 'url' => 'session/:sessionId/timeouts/async_script'
  32. },
  33. 'setImplicitWaitTimeout' => {
  34. 'method' => 'POST',
  35. 'url' => 'session/:sessionId/timeouts/implicit_wait'
  36. },
  37. 'quit' => {
  38. 'method' => 'DELETE',
  39. 'url' => "session/:sessionId"
  40. },
  41. 'getCurrentWindowHandle' => {
  42. 'method' => 'GET',
  43. 'url' => "session/:sessionId/window_handle"
  44. },
  45. 'getWindowHandles' => {
  46. 'method' => 'GET',
  47. 'url' => "session/:sessionId/window_handles"
  48. },
  49. 'getWindowSize' => {
  50. 'method' => 'GET',
  51. 'url' => "session/:sessionId/window/:windowHandle/size"
  52. },
  53. 'getWindowPosition' => {
  54. 'method' => 'GET',
  55. 'url' => "session/:sessionId/window/:windowHandle/position"
  56. },
  57. 'setWindowSize' => {
  58. 'method' => 'POST',
  59. 'url' => "session/:sessionId/window/:windowHandle/size"
  60. },
  61. 'setWindowPosition' => {
  62. 'method' => 'POST',
  63. 'url' => "session/:sessionId/window/:windowHandle/position"
  64. },
  65. 'getCurrentUrl' => {
  66. 'method' => 'GET',
  67. 'url' => "session/:sessionId/url"
  68. },
  69. 'get' => {
  70. 'method' => 'POST',
  71. 'url' => "session/:sessionId/url"
  72. },
  73. 'goForward' => {
  74. 'method' => 'POST',
  75. 'url' => "session/:sessionId/forward"
  76. },
  77. 'goBack' => {
  78. 'method' => 'POST',
  79. 'url' => "session/:sessionId/back"
  80. },
  81. 'refresh' => {
  82. 'method' => 'POST',
  83. 'url' => "session/:sessionId/refresh"
  84. },
  85. 'executeScript' => {
  86. 'method' => 'POST',
  87. 'url' => "session/:sessionId/execute"
  88. },
  89. 'executeAsyncScript' => {
  90. 'method' => 'POST',
  91. 'url' => "session/:sessionId/execute_async"
  92. },
  93. 'screenshot' => {
  94. 'method' => 'GET',
  95. 'url' => "session/:sessionId/screenshot"
  96. },
  97. 'availableEngines' => {
  98. 'method' => 'GET',
  99. 'url' => "session/:sessionId/ime/available_engines"
  100. },
  101. 'switchToFrame' => {
  102. 'method' => 'POST',
  103. 'url' => "session/:sessionId/frame"
  104. },
  105. 'switchToWindow' => {
  106. 'method' => 'POST',
  107. 'url' => "session/:sessionId/window"
  108. },
  109. 'getAllCookies' => {
  110. 'method' => 'GET',
  111. 'url' => "session/:sessionId/cookie"
  112. },
  113. 'addCookie' => {
  114. 'method' => 'POST',
  115. 'url' => "session/:sessionId/cookie"
  116. },
  117. 'deleteAllCookies' => {
  118. 'method' => 'DELETE',
  119. 'url' => "session/:sessionId/cookie"
  120. },
  121. 'deleteCookieNamed' => {
  122. 'method' => 'DELETE',
  123. 'url' => "session/:sessionId/cookie/:name"
  124. },
  125. 'getPageSource' => {
  126. 'method' => 'GET',
  127. 'url' => "session/:sessionId/source"
  128. },
  129. 'getTitle' => {
  130. 'method' => 'GET',
  131. 'url' => "session/:sessionId/title"
  132. },
  133. 'findElement' => {
  134. 'method' => 'POST',
  135. 'url' => "session/:sessionId/element"
  136. },
  137. 'findElements' => {
  138. 'method' => 'POST',
  139. 'url' => "session/:sessionId/elements"
  140. },
  141. 'getActiveElement' => {
  142. 'method' => 'POST',
  143. 'url' => "session/:sessionId/element/active"
  144. },
  145. 'describeElement' => {
  146. 'method' => 'GET',
  147. 'url' => "session/:sessionId/element/:id"
  148. },
  149. 'findChildElement' => {
  150. 'method' => 'POST',
  151. 'url' => "session/:sessionId/element/:id/element"
  152. },
  153. 'findChildElements' => {
  154. 'method' => 'POST',
  155. 'url' => "session/:sessionId/element/:id/elements"
  156. },
  157. 'clickElement' => {
  158. 'method' => 'POST',
  159. 'url' => "session/:sessionId/element/:id/click"
  160. },
  161. 'submitElement' => {
  162. 'method' => 'POST',
  163. 'url' => "session/:sessionId/element/:id/submit"
  164. },
  165. 'sendKeysToElement' => {
  166. 'method' => 'POST',
  167. 'url' => "session/:sessionId/element/:id/value"
  168. },
  169. 'sendKeysToActiveElement' => {
  170. 'method' => 'POST',
  171. 'url' => "session/:sessionId/keys"
  172. },
  173. 'sendModifier' => {
  174. 'method' => 'POST',
  175. 'url' => "session/:sessionId/modifier"
  176. },
  177. 'isElementSelected' => {
  178. 'method' => 'GET',
  179. 'url' => "session/:sessionId/element/:id/selected"
  180. },
  181. 'setElementSelected' => {
  182. 'method' => 'POST',
  183. 'url' => "session/:sessionId/element/:id/selected"
  184. },
  185. 'toggleElement' => {
  186. 'method' => 'POST',
  187. 'url' => "session/:sessionId/element/:id/toggle"
  188. },
  189. 'isElementEnabled' => {
  190. 'method' => 'GET',
  191. 'url' => "session/:sessionId/element/:id/enabled"
  192. },
  193. 'getElementLocation' => {
  194. 'method' => 'GET',
  195. 'url' => "session/:sessionId/element/:id/location"
  196. },
  197. 'getElementLocationInView' => {
  198. 'method' => 'GET',
  199. 'url' => "session/:sessionId/element/:id/location_in_view"
  200. },
  201. 'getElementTagName' => {
  202. 'method' => 'GET',
  203. 'url' => "session/:sessionId/element/:id/name"
  204. },
  205. 'clearElement' => {
  206. 'method' => 'POST',
  207. 'url' => "session/:sessionId/element/:id/clear"
  208. },
  209. 'getElementAttribute' => {
  210. 'method' => 'GET',
  211. 'url' => "session/:sessionId/element/:id/attribute/:name"
  212. },
  213. 'elementEquals' => {
  214. 'method' => 'GET',
  215. 'url' => "session/:sessionId/element/:id/equals/:other"
  216. },
  217. 'isElementDisplayed' => {
  218. 'method' => 'GET',
  219. 'url' => "session/:sessionId/element/:id/displayed"
  220. },
  221. 'close' => {
  222. 'method' => 'DELETE',
  223. 'url' => "session/:sessionId/window"
  224. },
  225. 'dragElement' => {
  226. 'method' => 'POST',
  227. 'url' => "session/:sessionId/element/:id/drag"
  228. },
  229. 'getElementSize' => {
  230. 'method' => 'GET',
  231. 'url' => "session/:sessionId/element/:id/size"
  232. },
  233. 'getElementText' => {
  234. 'method' => 'GET',
  235. 'url' => "session/:sessionId/element/:id/text"
  236. },
  237. 'getElementValueOfCssProperty' => {
  238. 'method' => 'GET',
  239. 'url' => "session/:sessionId/element/:id/css/:propertyName"
  240. },
  241. 'mouseMoveToLocation' => {
  242. 'method' => 'POST',
  243. 'url' => "session/:sessionId/moveto"
  244. },
  245. 'getAlertText' => {
  246. 'method' => 'GET',
  247. 'url' => 'session/:sessionId/alert_text'
  248. },
  249. 'sendKeysToPrompt' => {
  250. 'method' => 'POST',
  251. 'url' => 'session/:sessionId/alert_text'
  252. },
  253. 'acceptAlert' => {
  254. 'method' => 'POST',
  255. 'url' => 'session/:sessionId/accept_alert'
  256. },
  257. 'dismissAlert' => {
  258. 'method' => 'POST',
  259. 'url' => 'session/:sessionId/dismiss_alert'
  260. },
  261. 'click' => {
  262. 'method' => 'POST',
  263. 'url' => 'session/:sessionId/click'
  264. },
  265. 'doubleClick' => {
  266. 'method' => 'POST',
  267. 'url' => 'session/:sessionId/doubleclick'
  268. },
  269. 'buttonDown' => {
  270. 'method' => 'POST',
  271. 'url' => 'session/:sessionId/buttondown'
  272. },
  273. 'buttonUp' => {
  274. 'method' => 'POST',
  275. 'url' => 'session/:sessionId/buttonup'
  276. },
  277. 'uploadFile' => {
  278. 'method' => 'POST',
  279. 'url' => 'session/:sessionId/file'
  280. },
  281. #'setVisible' => {
  282. # 'method' => 'POST',
  283. # 'url' => "session/:sessionId/visible"
  284. #},
  285. #'getVisible' => {
  286. # 'method' => 'GET',
  287. # 'url' => "session/:sessionId/visible"
  288. #},
  289. };
  290. }
  291. );
  292. # helper methods to manipulate the _cmds hash
  293. sub get_url {
  294. my ( $self, $command ) = @_;
  295. return $self->get_cmds->{$command}->{url};
  296. }
  297. sub get_method {
  298. my ( $self, $command ) = @_;
  299. return $self->get_cmds->{$command}->{method};
  300. }
  301. # This method will replace the template & return
  302. sub get_params {
  303. my ( $self, $args ) = @_;
  304. if ( !( defined $args->{'session_id'} ) ) {
  305. return;
  306. }
  307. my $data = {};
  308. my $command = $args->{'command'};
  309. my $url = $self->get_url($command);
  310. # Do the var substitutions.
  311. $url =~ s/:sessionId/$args->{'session_id'}/;
  312. $url =~ s/:id/$args->{'id'}/;
  313. $url =~ s/:name/$args->{'name'}/;
  314. $url =~ s/:propertyName/$args->{'property_name'}/;
  315. $url =~ s/:other/$args->{'other'}/;
  316. $url =~ s/:windowHandle/$args->{'window_handle'}/;
  317. $data->{'method'} = $self->get_method($command);
  318. $data->{'url'} = $url;
  319. return $data;
  320. }
  321. 1;
  322. __END__