该脚本可以单击登录按钮,这是有效的。登录后,如果有其他用户登录,则可以选择强制登录用户。
这里是按钮......
<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看起来就像是在选择按钮。然而,没有点击按钮。我将其设置为永不超时,因此它不是超时问题。
答案 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
即使这对我来说也是非常错误,但至少你可以检查是否找到按钮
如果你透露了更多的代码,特别是你正在使用的模块,那么我相信我们可以帮助你更好