3

我正在尝试通过 WWW::Mechanize::Firefox's 执行 jQuery/Angular 调用eval_in_page。我猜测存在某种范围问题,因为我遇到了错误。

如果我尝试执行此代码:

angular.element(document.getElementsByClassName("input")[0]).triggerHandler(('change');

我得到这个回应:

MozRepl::RemoteObject: ReferenceError: 角度未定义在...

如果我尝试执行此代码:

$(".input").val("Foo")

我得到这个回应:

MozRepl::RemoteObject: ReferenceError: $ is not defined ...

看来我无权访问这两个框架。但是,该页面似乎都已加载。如果我在浏览器控制台中执行代码,它工作正常。

4

2 回答 2

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
}
于 2016-12-29T01:26:57.917 回答
0

感谢所有的想法。我无法解决最初的问题,但我能够想出这个替代解决方案。使用这个 javascript,我能够填写该字段并触发适当的更改和模糊事件。这样做可以让 Angular 完成它需要做的处理。

$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);

请注意,我使用的功能是在此处找到的精简解决方案。我将其缩减为仅 Firefox 代码。如果你使用不同的浏览器,你会想要使用他们更健壮的代码。如果有人想出原始问题的解决方案,我很乐意接受。

于 2016-12-29T17:27:20.610 回答