Commands.pm 12 KB

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