1
0

ActionChains.pm 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. package Selenium::ActionChains;
  2. # ABSTRACT: Action chains for Selenium::Remote::Driver
  3. use Moo;
  4. has 'driver' => (
  5. is => 'ro',
  6. );
  7. has 'actions' => (
  8. is => 'lazy',
  9. builder => sub { [] },
  10. clearer => 1,
  11. );
  12. sub perform {
  13. my $self = shift;
  14. foreach my $action (@{$self->actions}) {
  15. $action->();
  16. }
  17. }
  18. sub click {
  19. my $self = shift;
  20. my $element = shift;
  21. if ($element) {
  22. $self->move_to_element($element);
  23. }
  24. # left click
  25. push @{$self->actions}, sub { $self->driver->click('LEFT') };
  26. $self;
  27. }
  28. sub click_and_hold {
  29. my $self = shift;
  30. my $element = shift;
  31. if ($element) {
  32. $self->move_to_element($element);
  33. }
  34. push @{$self->actions}, sub { $self->driver->button_down };
  35. $self;
  36. }
  37. sub context_click {
  38. my $self = shift;
  39. my $element = shift;
  40. if ($element) {
  41. $self->move_to_element($element);
  42. }
  43. # right click
  44. push @{$self->actions}, sub { $self->driver->click('RIGHT') };
  45. $self;
  46. }
  47. sub double_click {
  48. my $self = shift;
  49. my $element = shift;
  50. if ($element) {
  51. $self->move_to_element($element);
  52. }
  53. push @{$self->actions}, sub { $self->driver->double_click };
  54. $self;
  55. }
  56. sub release {
  57. my $self = shift;
  58. my $element = shift;
  59. if ($element) {
  60. $self->move_to_element($element);
  61. }
  62. push @{$self->actions}, sub { $self->driver->button_up };
  63. $self;
  64. }
  65. sub drag_and_drop {
  66. my $self = shift;
  67. my ($source,$target) = @_;
  68. $self->click_and_hold($source);
  69. $self->release($target);
  70. $self;
  71. }
  72. sub drag_and_drop_by_offset {
  73. my $self = shift;
  74. my ($source,$xoffset,$yoffset) = @_;
  75. $self->click_and_hold($source);
  76. $self->move_by_offset($xoffset,$yoffset);
  77. $self->release($source);
  78. $self;
  79. }
  80. sub move_to_element {
  81. my $self = shift;
  82. my $element = shift;
  83. push @{ $self->actions },
  84. sub { $self->driver->move_to( element => $element ) };
  85. $self;
  86. }
  87. sub move_by_offset {
  88. my $self = shift;
  89. my ( $xoffset, $yoffset ) = @_;
  90. push @{ $self->actions }, sub {
  91. $self->driver->move_to( xoffset => $xoffset, yoffset => $yoffset );
  92. };
  93. $self;
  94. }
  95. sub move_to_element_with_offset {
  96. my $self = shift;
  97. my ( $element, $xoffset, $yoffset ) = @_;
  98. push @{ $self->actions }, sub {
  99. $self->driver->move_to( element => $element, xoffset => $xoffset,
  100. yoffset => $yoffset );
  101. };
  102. $self;
  103. }
  104. sub key_down {
  105. my $self = shift;
  106. my ($value ,$element) = @_;
  107. if (defined($element)) {
  108. $self->click($element);
  109. }
  110. push @{ $self->actions }, sub { $self->driver->send_keys_to_active_element(@$value) };
  111. $self;
  112. }
  113. sub key_up {
  114. my $self = shift;
  115. my ($value ,$element) = @_;
  116. if (defined($element)) {
  117. $self->click($element);
  118. }
  119. push @{ $self->actions }, sub { $self->driver->send_keys_to_active_element(@$value) };
  120. $self;
  121. }
  122. sub send_keys {
  123. my $self = shift;
  124. my $keys = shift;
  125. push @{ $self->actions} , sub { $self->driver->get_active_element->send_keys($keys) };
  126. $self;
  127. }
  128. sub send_keys_to_element {
  129. my $self = shift;
  130. my ($element,$keys) = @_;
  131. push @{ $self->actions }, sub { $element->send_keys($keys) };
  132. $self;
  133. }
  134. 1;
  135. __END__
  136. =pod
  137. =head1 SYNOPSIS
  138. use Selenium::Remote::Driver;
  139. use Selenium::ActionChains;
  140. my $driver = Selenium::Remote::Driver->new;
  141. my $action_chains = Selenium::ActionChains->new(driver => $driver);
  142. $driver->get("http://www.some.web/site");
  143. my $elt_1 = $driver->find_element("//*[\@id='someid']");
  144. my $elt_2 = $driver->find_element("//*[\@id='someotherid']");
  145. $action_chains->send_keys_to_element($elt_1)->click($elt_2)->perform;
  146. =head1 DESCRIPTION
  147. Implementation in Perl of ActionChains for Selenium, which is a way of automating
  148. low level interactions like mouse movements, mouse button actions , key presses and
  149. context menu interactions.
  150. =cut