v4.pm 4.3 KB

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