v4.pm 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. package Selenium::Remote::Driver::v4;
  2. use strict;
  3. use warnings;
  4. # Wrapper shim class for Selenium::Client and S::R::D
  5. sub new {
  6. my ( $class, %opts ) = @_;
  7. require Selenium::Client;
  8. my $self = bless {
  9. '_client' => Selenium::Client->new(
  10. 'version' => 'stable',
  11. %opts,
  12. ),
  13. }, $class;
  14. $self->{'debug'} = $opts{'debug'};
  15. $self->_install_wrapper_subs();
  16. return $self;
  17. }
  18. our %cmd_map = (
  19. 'NewSession' => 'new_session',
  20. 'Status' => 'status',
  21. 'GetTimeouts' => 'get_timeouts',
  22. 'SetTimeouts' => 'set_timeout',
  23. 'NavigateTo' => 'navigate',
  24. 'GetCurrentUrl' => 'get_current_url',
  25. 'Back' => 'go_back',
  26. 'Forward' => 'go_forward',
  27. 'Refresh' => 'refresh',
  28. 'GetTitle' => 'get_title',
  29. 'GetWindowHandle' => 'get_current_window_handle', # TODO test this, no idea
  30. 'CloseWindow' => 'close',
  31. 'SwitchToWindow' => 'switch_to_window',
  32. 'GetWindowHandles' => 'get_window_handles',
  33. 'SwitchToFrame' => 'switch_to_frame',
  34. 'SwitchToParentFrame' => 'switch_to_parent_frame',
  35. 'GetWindowRect' => 'get_window_size',
  36. 'SetWindowRect' => 'set_window_rect',
  37. 'MaximizeWindow' => 'maximize_window',
  38. 'MinimizeWindow' => 'minimize_window',
  39. 'FullscreenWindow' => 'fullscreen_window',
  40. 'GetActiveElement' => 'get_active_element',
  41. 'FindElement' => 'find_element',
  42. 'FindElements' => 'find_elements',
  43. 'GetPageSource' => 'get_page_source',
  44. 'ExecuteScript' => 'execute_script',
  45. 'ExecuteAsyncScript' => 'execute_async_script',
  46. 'GetAllCookies' => 'get_all_cookies',
  47. 'GetNamedCookie' => 'get_cookie_named',
  48. 'AddCookie' => 'add_cookie',
  49. 'DeleteCookie' => 'delete_cookie_named',
  50. 'DeleteAllCookies' => 'delete_all_cookies',
  51. 'PerformActions' => 'general_action',
  52. 'ReleaseActions' => 'release_general_actions',
  53. 'DismissAlert' => 'dismiss_alert',
  54. 'AcceptAlert' => 'accept_alert',
  55. 'GetAlertText' => 'get_alert_text',
  56. 'SendAlertText' => 'send_keys_to_prompt',
  57. 'TakeScreenshot' => 'screenshot',
  58. );
  59. my @element_methods = (
  60. 'FindElementFromElement',
  61. 'FindElementsFromElement',
  62. 'IsElementSelected',
  63. 'GetElementAttribute',
  64. 'GetElementProperty',
  65. 'GetElementCSSValue',
  66. 'GetElementText',
  67. 'GetElementTagName',
  68. 'GetElementRect',
  69. 'IsElementEnabled',
  70. 'ElementClick',
  71. 'ElementClear',
  72. 'ElementSendKeys',
  73. 'TakeElementScreenshot',
  74. );
  75. my @unimplemented = qw{
  76. new_desired_session
  77. mouse_move_to_location
  78. move_to
  79. get_capabilities
  80. set_async_script_timeout
  81. set_implicit_wait_timeout
  82. pause
  83. get_window_position
  84. capture_screenshot
  85. available_engines
  86. set_window_position
  87. };
  88. sub _install_wrapper_subs {
  89. my ( $self ) = @_;
  90. foreach my $sub_per_spec (keys(%{$self->{client}{spec}})) {
  91. my $sub2install = $cmd_map{$sub_per_spec};
  92. if( !$sub2install ) {
  93. print "Can't install a subroutine to match '$sub_per_spec', as it isn't mapped to the S::R::D equivalent!" if $self->{'debug'};
  94. next;
  95. }
  96. # Yo dawg... I herd u like Sub::Install
  97. Sub::Install::install_sub(
  98. {
  99. code => sub {
  100. my $self = shift;
  101. my $sub_from_client = $self->{'_client'}->can($sub_per_spec);
  102. return $sub_from_client->( $self->{'_client'}, @_ );
  103. },
  104. as => $sub2install,
  105. into => "Selenium::Remote::Driver::v4",
  106. }
  107. ) unless "Selenium::Remote::Driver::v4"->can($sub2install);
  108. }
  109. foreach my $die_on (@unimplemented) {
  110. Sub::Install::install_sub(
  111. {
  112. code => sub { my $self = shift; die "$die_on is unimplemented in " . ref $self },
  113. as => $die_on,
  114. into => "Selenium::Remote::Driver::v4",
  115. }
  116. );
  117. }
  118. *send_keys_to_alert = \&send_keys_to_prompt;
  119. *get = \&navigate;
  120. }
  121. # Helpers from base module not in Client
  122. sub is_webdriver_3 { return 0 }
  123. sub has_javascript { return 1 }
  124. sub debug_on { return $_[0]->{'debug'} = 1 }
  125. sub debug_off { return $_[0]->{'debug'} = 0 }
  126. sub get_sessions { return $_[0]->{'client'}{'sessions'} }
  127. sub send_keys_to_active_element {
  128. my ($self, $keys) = @_;
  129. my $elem = $self->get_active_element();
  130. return $elem->send_keys($keys); # TODO test
  131. }
  132. sub quit {
  133. my ($self) = @_;
  134. undef $self->{'client'};
  135. return undef $self;
  136. }
  137. *DESTROY = \&quit;
  138. 1;