我正在尝试通过WWW :: Mechanize :: Firefox的eval_in_page
执行jQuery / Angular调用。我猜是存在某种范围问题,因为我遇到了错误。
如果我尝试执行此代码:
angular.element(document.getElementsByClassName("input")[0]).triggerHandler(('change');
我收到了这个回复:
MozRepl :: RemoteObject:ReferenceError:angular未定义为...
如果我尝试执行此代码:
$(".input").val("Foo")
我收到了这个回复:
MozRepl :: RemoteObject:ReferenceError:$未定义...
似乎我无法访问任何一个框架。但是,该页面似乎都已加载。如果我在浏览器控制台中执行代码,它可以正常工作。
答案 0 :(得分:1)
您可以使用$mech->click()
在字段内单击,接受x, y
坐标,插入文本并再次移除焦点。之前我使用过PhantomJS进行类似的工作。它也适用于WWW::Mechanize::Firefox
。
use WWW::Mechanize::PhantomJS;
use strict;
use warnings;
my $mech = WWW::Mechanize::PhantomJS->new(log => 1);
$mech->get('http://example.com');
if($mech->success) {
# accepts x, y coordinates
$mech->click(.. field[2]);
# set a text for example in input-field number 2
$mech->eval('document.getElementsByTagName("input")[2].value = "Your value";');
# Click somewhere else to trigger blur event
$mech->click(.. outside the field[2]);
# Read the converted textual input from span
}
答案 1 :(得分:0)
感谢所有想法。我无法解决原来的问题,但我能够提出这个替代解决方案。使用这个javascript我能够填写该字段并触发相应的更改和模糊事件。这样做允许角度进行它需要做的处理。
$js = qq(
var myElement = document.getElementsByClassName("input")[0];
myElement.value = "$value";
function fireEvent(element, event) {
var evt = document.createEvent("HTMLEvents");
evt.initEvent(event, true, true); // event type,bubbling,cancelable
return !element.dispatchEvent(evt);
}
fireEvent(myElement, 'change');
fireEvent(myElement, 'blur');
);
$mech->eval_in_page($js);
请注意,我使用的功能是找到here的精简解决方案。我把它修剪成Firefox代码。如果您使用的是其他浏览器,则需要使用更强大的代码。如果有人想出原始问题的解决方案,我很乐意接受它。