首页 > 解决方案 > 如何在不使用 perl 在 selenium 中使用睡眠的情况下等待动画完成?

问题描述

我观察到,当我用选择框填写表单时,如果我在单击打开选择框和单击选择框之间没有休眠的情况下填写所有参数,则它不会正确填写(有时似乎未选择该选项)选项。

如果我在第一次点击和第二次点击之间有一个睡眠,它似乎可以正常工作,但如果我有一大堆选择框填写表格会减慢很多。

有没有办法在某种“等待动画完成”中做到这一点?这是我使用的简化代码:

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;
}

标签: seleniumperlanimationwait

解决方案


推荐阅读