How can I wait for an animation to be finished without using a sleep in selenium using perl?

Viewed 267

I have observed that when I fill a form with selectboxes it does not fill up correclty (it seems like sometimes the option is not selected) if I fill all parameters without a sleep between the click to open the select box and the click to select an option.

If I have a sleep between the first click and the second it seems to work properly, but if I have a big set of select boxes filling the forms slows down a lot.

Is there a way to do this in some kind of "wait for an animation to be finished"? This is the code I'm using simplified:

use strict;
use warnings;
use Selenium::Chrome;
use Selenium::Waiter qw/wait_until/;

my $chrome_driver_path = "chromedriver.exe";
my $driver;
my %settings = (
    'binary' => $chrome_driver_path,
);

$driver = Selenium::Chrome->new(%settings);
$driver->get("http://mywebiste.com/myform_with_selectbox");
_set_select_box($driver, "myoption");

sub _set_select_box{
    
    my ($driver, $input) = @_;
        
    # Open selectbox
    my $element_id = 'some_label';
    my $element;
    wait_until{ $element = ($driver->find_elements("//label[\@id='$element_id']"))[0] };
    
    if (defined($element)){
        $log->debug("element_id: '$element_id' found");
    }else{
        $log->error("element_id: '$element_id' could not be found");
        return -1;
    }
    
    wait_until{$element->click()};
    $log->debug("element_id '$element_id' clicked");    
    # sleep(1); here I put a sleep and it seems to work always
    
    # Click item in selectbox
    my $element_2_id = 'some_items';
    my @elements;
    wait_until{ @elements = ($driver->find_elements("//ul[\@id='$element_2_id']//li")) };
    
    if (defined($elements[0])){
        $log->debug("element_2_id: '$element_2_id' found");
    }else{
        $log->error("element_2_id: '$element_2_id' could not be found");
        return -1;
    }
    
    my $selectbox_text = $config->val( 'MyOptions', $input);
    return -1 if (!defined($selectbox_text));

    foreach my $element_2 (@elements){
        my $option_text = $element_2->get_text();
        $option_text = encode('UTF-8', $option_text, Encode::FB_CROAK) if (defined($option_text)); # otherwise selenium does not return utf8
        if ($option_text eq $selectbox_text){
            $log->debug("selectbox_text '$selectbox_text' found");  
            wait_until{$element_2->click()};
            $log->debug("selectbox_text '$selectbox_text' clicked");    
            return 1;
        }else{
            $log->debug("Selectbox text does not match Found: '$option_text' Expected '$selectbox_text'");              
        }
    }
    
    return 0;
}
0 Answers
Related