Perl Selenium webdriver按钮单击无法正常工作

时间:2016-01-05 19:10:31

标签: html perl selenium

该脚本可以单击登录按钮,这是有效的。登录后,如果有其他用户登录,则可以选择强制登录用户。

这里是按钮......

<span id="Pages_DiagnosticsForceout_btnForceout" class="yui-button yui-push-button">
<span class="first-child">
<button type="button" tabindex="0">Force‌·Log‌·Out</button>
</span>
</span>

以下是尝试点击...添加更多信息而不是整个脚本。

#!/root/localperl/bin/perl5.22.0

use warnings;
use strict;

use Selenium::Firefox;
use Selenium::Firefox::Profile;
use Selenium::Remote::WDKeys;
use Selenium::Waiter;
use Data::Dumper;
use Time::Piece;
use Config;
use YAML;

my $ff;

logit("Attempting create profile ");

my $start = getTime();
my $profile;
my $profObject = wait_until { $profile = Selenium::Firefox::Profile->new; };

if ($profObject) {

    my $createProfile = wait_until { $profile->{profile_dir} = $ARGV[3]; };

    if ($createProfile) {
        logit("profile created, attempting browser start ");
    }
    else {
        logit("profile create failed");
        exit;
    }
}
else {
    logit("create profile object failed");
}

my $browser = wait_until {
    $ff = Selenium::Firefox->new(
        'default_finder'  => 'id',
        'firefox_profile' => $profile
    );
};

'''

my $forceOutButton = wait_until {
    $ff->find_element_by_xpath(".//*[\@id='Pages_DiagnosticsForceout_btnForceout']/span/button")->click();
};

在firebug中使用firepath,xpath看起来就像是在选择按钮。然而,没有点击按钮。我将其设置为永不超时,因此它不是超时问题。

2 个答案:

答案 0 :(得分:1)

我认为你没有意识到Selenium::Waiter实际上做了什么。它的文档没有多大帮助,它的名字也没有,因为它与Selenium没什么关系

基本上wait_until { ... }每秒一次调用块中的代码30秒(这些值是默认值,可以在参数中更改为调用)或直到它返回 true

这意味着您的许多wait_until电话都是不必要的。例如

$profile = Selenium::Firefox::Profile->new

将使用新对象快速返回。没有必要重试new直到它工作

同样,当然等待这个陈述没有意义

$profile->{profile_dir} = $ARGV[3]

因为它只是一个简单的任务,将立即执行。但是,如果$ARGV[0]碰巧有 false 值,那么wait_until会继续执行三十次分配,然后放弃

我认为该模块旨在等待页面中的结构由JavaScript创建,如果以这种方式创建强制注销按钮,那么使用{{{ 1}}检查是否已创建。但是你不应该在等待中调用wait_until,你应该继续检查是否可以找到XPath表达式

这样的事可能

click

请注意,由于您使用my $force_out_button = wait_until { $ff->find_element_by_xpath('//span[@id="Pages_DiagnosticsForceout_btnForceout"]/span/button') }; die "Force log out button not found" unless $force_out_button; $force_out_button->click; 并在块内外分配变量的方式,因此您有两个名称可用于处理。例如,wait_until$ff是相同的,$browser$profObject相同。我选择只保留$profile和`$ profile here

此外,这一行

$ff

只需将my $createProfile = wait_until { $profile->{profile_dir} = $ARGV[3]; }; 复制到$ARGV[3]$profile->{profile_dir}即可。您没有“创建”任何内容,就像您的日志消息所暗示的那样,唯一的原因是$createProfile false

您显示的程序程序部分看起来应该更像

$ARGV[3]

答案 1 :(得分:0)

你没有说$ff是什么样的方式,而是

my $forceOutButton = wait_until {$ff->find_element_by_xpath(".//*[\@id='Pages_DiagnosticsForceout_btnForceout']/span/button")->click();};

我很确定wait_until {中的左括号应该是一个左括号,否则你传递wait until对一个哈希的引用,并将按钮作为键和{{1}作为值

我会把它写成

undef

即使这对我来说也是非常错误,但至少你可以检查是否找到按钮

如果你透露了更多的代码,特别是你正在使用的模块,那么我相信我们可以帮助你更好