ActionChains.pm 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  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->driver->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_down {
  28. my $self = shift;
  29. my $element = shift;
  30. if ($element) {
  31. $self->driver->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->driver->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->driver->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->driver->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. 1;