1
0
mirror of https://pagure.io/fedora-qa/os-autoinst-distri-fedora.git synced 2024-11-22 05:53:09 +00:00

Add support for mouse dragging.

This commit is contained in:
Lukáš Růžička 2020-08-06 12:00:47 +02:00
parent 855aaef258
commit b7689cd4b9

View File

@ -7,7 +7,9 @@ use Exporter;
use lockapi;
use testapi;
our @EXPORT = qw/run_with_error_check type_safely type_very_safely desktop_vt boot_to_login_screen console_login console_switch_layout desktop_switch_layout console_loadkeys_us do_bootloader boot_decrypt check_release menu_launch_type repo_setup setup_workaround_repo cleanup_workaround_repo gnome_initial_setup anaconda_create_user check_desktop download_modularity_tests quit_firefox advisory_get_installed_packages advisory_check_nonmatching_packages start_with_launcher quit_with_shortcut lo_dismiss_tip disable_firefox_studies select_rescue_mode copy_devcdrom_as_isofile bypass_1691487 get_release_number workaround_ble26 check_left_bar check_top_bar check_prerelease check_version spell_version_number _assert_and_click is_branched rec_log click_unwanted_notifications repos_mirrorlist register_application get_registered_applications solidify_wallpaper/;
use autotest "query_isotovideo";
our @EXPORT = qw/run_with_error_check type_safely type_very_safely desktop_vt boot_to_login_screen console_login console_switch_layout desktop_switch_layout console_loadkeys_us do_bootloader boot_decrypt check_release menu_launch_type repo_setup setup_workaround_repo cleanup_workaround_repo gnome_initial_setup anaconda_create_user check_desktop download_modularity_tests quit_firefox advisory_get_installed_packages advisory_check_nonmatching_packages start_with_launcher quit_with_shortcut lo_dismiss_tip disable_firefox_studies select_rescue_mode copy_devcdrom_as_isofile bypass_1691487 get_release_number workaround_ble26 check_left_bar check_top_bar check_prerelease check_version spell_version_number _assert_and_click is_branched rec_log click_unwanted_notifications repos_mirrorlist register_application get_registered_applications solidify_wallpaper mouse_drag/;
# We introduce this global variable to hold the list of applications that have
# registered during the apps_startstop_test when they have sucessfully run.
@ -1326,4 +1328,87 @@ sub solidify_wallpaper {
}
}
# Mouse drags are not implemented yet in testapi and the importance of such proposal has been
# recently lowered to "Low" so we might assume that this functionality will not be implemented
# any time soon. Therefore, let's to do it by ourselves.
#
# The function can either use the cartesian coordinates or a needle that provides them. If both
# are given, the function prefers the coordinates to the needles. Combinations are allowed, i.e.
# one point can be given using coordinates, while the other can be given as a needle.
# If neither are correctly provided, the functions terminates with an error message.
#
# The $button variable specifies which button should be used to drag. The $timeout tells the engine
# how long to wait for the needle to appear.
#
# Syntax
# using needles:
# mouse_drag(startpoint => "needle1", endpoint => "needle2", button => 'left', timeout => 30);
# using coordinates:
# mouse_drag(startx => "300", starty => "200", endx => "390", endy => "250", button => 'left', timeout => 30);
# using a combination:
# mouse_drag(startpoint => "needle1", endx => "390", endy => "250", button => 'left', timeout => 30);
sub mouse_drag {
my %args = @_;
my $startx =
my $starty =
my $endx =
my $endy = 0;
# If full coordinates are provided, work with them as a priority,
if (defined $args{startx} and defined $args{starty}) {
$startx = $args{startx};
$starty = $args{starty};
}
# If the coordinates were not complete, use the needle as a fallback solution.
elsif (defined $args{startpoint}) {
my $startmatch = $args{startpoint};
# Check that the needle exists.
my $start_matched_needle = assert_screen($startmatch, $args{timeout});
# Calculate the click point from the area defined by the needle (take the center of it)
my $start_area = $start_matched_needle->{area}->[-1];
my $start_click_point = {
xpos => $start_area->{w} / 2,
ypos => $start_area->{h} / 2,
};
$startx = int($start_area->{x} + $start_click_point->{xpos});
$starty = int($start_area->{y} + $start_click_point->{ypos});
}
# If neither coordinates nor a needle is provided, report an error and quit.
else {
die "The starting point of the drag was not correctly provided. Either provide the 'startx' and 'starty' coordinates, or a needle marking the starting point.";
}
# Repeat the same for endpoint coordinates or needles.
if (defined $args{endx} and defined $args{endy}) {
$endx = $args{endx};
$endy = $args{endy};
}
elsif (defined $args{endpoint}) {
my $endmatch = $args{endpoint};
my $end_matched_needle = assert_screen($endmatch, $args{timeout});
my $end_area = $end_matched_needle->{area}->[-1];
my $end_click_point = {
xpos => $end_area->{w} / 2,
ypos => $end_area->{h} / 2,
};
$endx = int($end_area->{x} + $end_click_point->{xpos});
$endy = int($end_area->{y} + $end_click_point->{ypos});
}
else {
die "The ending point of the drag was not correctly provided. Either provide the 'endx' and 'endy' coordinates, or a needle marking the starting point.";
}
# Get the button variable. If no button has been provided, assume the "left" button.
my $button = $args{button} //= "left";
# Now, perform the actual mouse drag. Navigate to the startpoint location,
# press and hold the mouse button, then navigate to the endpoint location
# and release the mouse button.
mouse_set($startx, $starty);
query_isotovideo('backend_mouse_button', {button => $button, bstate => 1});
mouse_set($endx, $endy);
query_isotovideo('backend_mouse_button', {button => $button, bstate => 0});
# Sleep for a while to leave a trace on the SUT video.
sleep("5");
}
1;