ActionChains.pm 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. package Selenium::Remote::Driver::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. );
  11. sub perform {
  12. my $self = shift;
  13. foreach my $action (@{$self->actions}) {
  14. $action->();
  15. }
  16. }
  17. sub click {
  18. my $self = shift;
  19. my $element = shift;
  20. if ($element) {
  21. $self->move_to_element($element);
  22. }
  23. # left click
  24. push @{$self->actions}, sub { $self->driver->click(0) };
  25. $self;
  26. }
  27. sub click_and_hold {
  28. my $self = shift;
  29. my $element = shift;
  30. if ($element) {
  31. $self->move_to_element($element);
  32. }
  33. push @{$self->actions}, sub { $self->driver->button_down };
  34. $self;
  35. }
  36. sub context_click {
  37. my $self = shift;
  38. my $element = shift;
  39. if ($element) {
  40. $self->move_to_element($element);
  41. }
  42. # right click
  43. push @{$self->actions}, sub { $self->driver->click(2) };
  44. $self;
  45. }
  46. sub double_click {
  47. my $self = shift;
  48. my $element = shift;
  49. if ($element) {
  50. $self->move_to_element($element);
  51. }
  52. push @{$self->actions}, sub { $self->driver->double_click };
  53. $self;
  54. }
  55. sub release {
  56. my $self = shift;
  57. my $element = shift;
  58. if ($element) {
  59. $self->move_to_element($element);
  60. }
  61. push @{$self->actions}, sub { $self->driver->button_up };
  62. $self;
  63. }
  64. sub drag_and_drop {
  65. my $self = shift;
  66. my ($source,$target) = @_;
  67. $self->click_and_hold($source);
  68. $self->release($target);
  69. $self;
  70. }
  71. sub drag_and_drop_by_offset {
  72. my $self = shift;
  73. my ($source,$xoffset,$yoffset) = @_;
  74. $self->click_and_hold($source);
  75. $self->move_by_offset($xoffset,$yoffset);
  76. $self->release($source);
  77. $self;
  78. }
  79. sub move_to_element {
  80. my $self = shift;
  81. my $element = shift;
  82. push @{ $self->actions },
  83. sub { $self->driver->move_to( element => $element ) };
  84. $self;
  85. }
  86. sub move_by_offset {
  87. my $self = shift;
  88. my ( $xoffset, $yoffset ) = @_;
  89. push @{ $self->actions }, sub {
  90. $self->driver->move_to( xoffset => $xoffset, yoffset => $yoffset );
  91. };
  92. $self;
  93. }
  94. sub move_to_element_with_offset {
  95. my $self = shift;
  96. my ( $element, $xoffset, $yoffset ) = @_;
  97. push @{ $self->actions }, sub {
  98. $self->driver->move_to( element => $element, xoffset => $xoffset,
  99. yoffset => $yoffset );
  100. };
  101. $self;
  102. }
  103. sub key_down {
  104. my $self = shift;
  105. my ($value ,$element) = @_;
  106. if (defined($element)) {
  107. $self->click($element);
  108. }
  109. push @{ $self->actions }, $self->driver->send_keys_to_active_element(@$value);
  110. }
  111. sub key_up {
  112. my $self = shift;
  113. my ($value ,$element) = @_;
  114. if (defined($element)) {
  115. $self->click($element);
  116. }
  117. push @{ $self->actions }, $self->driver->send_keys_to_active_element(@$value);
  118. }
  119. 1;