javascript - 将 Perl Selenium::Remote::Driver 用于稍后加载页面的 Javascript
问题描述
我正在尝试自动登录 https://strade.sharekhan.com
my $driver = Selenium::Remote::Driver->new;
$driver->get("https://strade.sharekhan.com/");
我能够成功打开 firefox 浏览器并获取页面。但是输入元素是不可见的。
my $page_source = $driver->get_page_source();
$driver->find_element('emailLoginId')->send_keys("abcdefg");
登录部分似乎在一个单独的类项中,其 html 源出现在浏览器调试器中,但是当通过 selenium 尝试时,类项为空。我只知道基本的 Javascript/jQuery ......请帮帮我,我错过了什么
my $login_element = $driver->find_element_by_class('loginresponsive');
解决方案
您可以随时等待它出现。
以下是为 Selenium::Chrome 编写的,但它展示了可移植的原则。
use constant POLL_INTERVAL => 0.1;
use Time::HiRes qw( sleep time );
sub wait_for {
my ($xpath, $max_wait) = @_;
my $wait_until = time() + $max_wait;
while (1) {
if ( my $nodes = nf_find_elements($xpath) ) {
return wantarray ? @$nodes : $nodes->[0];
}
my $time_left = $wait_until - time();
return () if $time_left <= 0;
sleep(min($time_left, POLL_INTERVAL));
}
}
# Version of `find_elements` that doesn't die (non-fatal) when the element isn't found.
sub nf_find_elements {
my $nodes;
if (!eval {
$nodes = $web_driver->find_elements(@_);
return 1; # No exception.
}) {
return undef if $@ =~ /Unable to locate element|An element could not be located on the page using the given search parameters/;
die($@);
}
return wantarray ? @$nodes : $nodes;
}
示例用法:
my $node = wait_for('//some/path', 4.0) # Wait up to 4s
or die("Login was unsuccessful.\n");
Time::HiRessleep
不会被信号打断,因此我使用以下内容使我的 Ctrl-C 处理程序响应:
use Time::HiRes qw( );
use constant SLEEP_INTERVAL => 0.1;
# Hi-res sleep that gives signal handlers a chance to run.
use subs qw( sleep );
sub sleep {
if (!$_[0]) {
Time::HiRes::sleep(SLEEP_INTERVAL) while 1;
return; # Never reached.
}
my $sleep_until = time() + $_[0];
while (1) {
my $time_left = $sleep_until - Time::HiRes::time();
return if $time_left <= 0;
Time::HiRes::sleep(min($time_left, SLEEP_INTERVAL));
}
}
sleep
确保不要从 Time::HiRes导入。
推荐阅读
- python - 操作系统在打开文件时如何传递文件?
- mongodb - 如果不存在但不更新,如何在猫鼬中创建
- python - 解析 JSON 文件和对选定字段使用 API PUSH 时遇到问题
- python - 如何解决有关“NoneType”错误的问题?
- r - 在闪亮的仪表板中向散点图点添加音频
- sql-server - 我们如何在 SQL Server 2008 R2 中使用 LAG()?
- c++ - Understanding TOTW 153 example with namespace polution
- gradle - Intellij 未找到 gradle 中包含的运行时依赖项
- css - 设置行高以适应 CSS Grid 中行中的最高单元格
- debugging - 如何在 VSCode 调试模式下显示整个值