单击()的另一种方式
Alternative way for click()
我一直在通过page.evaluate()
上的phantomJS引擎使用click()
,它运行得很好。但有时它就是不起作用,我不知道为什么。
例如,我试图点击按钮验证这里的
我试过这个:
page.evaluate(function() {
document.getElementById('recaptcha-verify-button').click();
});
这个:
rect = page.evaluate(function() {
return document.getElementById('recaptcha-verify-button').getBoundingClientRect();
});
console.log(rect.left + " " + rect.right);
page.sendEvent('mousemove', rect.left + rect.width / 2, rect.top + rect.height / 2);
page.sendEvent('mousedown', rect.left + rect.width / 2, rect.top + rect.height / 2);
page.sendEvent('mouseup', rect.left + rect.width / 2, rect.top + rect.height / 2)
两者都不起作用,click()
之后没有输出,但我在chrome上尝试了同样的方法,结果是一样的。欢迎提出任何想法或建议。
您可以使用任何以前已知的方式进行单击。您有两个与点击本身无关的问题:
- 元素只能在其各自的文档中访问。ReCAPTCHA总是加载在iframe中,这是一个您必须切换到的不同文档。例如:
page.switchToFrame(0);
-
谷歌根据用户代理的功能提供不同的页面(本例中为PhantomJS)。它检测到PhantomJS没有启用JavaScript(出于某种原因),并提供了一个没有
#recaptcha-verify-button
元素的不同表单。相反,它有:<div class="fbc-button-verify"> <input type="submit" value="Verify"> </div>
完整脚本:
var page = require('webpage').create();
page.open('https://www.google.com/recaptcha/api2/demo', function() {
page.render('1.png');
page.switchToFrame(0);
page.evaluate(function(){
document.querySelector('.fbc-button-verify > input').click();
});
setTimeout(function(){
page.render('2.png');
phantom.exit();
}, 3000);
});
使用PhantomJS 1.9.8和2.1.1 进行测试
以下是模拟点击元素的函数
function simulateClick(element) {
var event = document.createEvent("MouseEvents");
event.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
element.dispatchEvent(event);
}
我认为这就是您需要解决的问题
我不确定我是否理解你的问题,但有时你会遇到id的意外问题,因为id必须再次使用uniq和一些引擎make元素,这可能会导致问题的发生。
请更多描述如果我在理解问题时有错误
我认为您必须使用class而不是id,并且您可以简单地使用out-jquery来实现这一点
看看这个例子:
var tests = document.querySelectorAll('.test');
for(var i=0; i<tests.length; i++){
tests.item(i).click();
}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>JS Bin</title>
</head>
<body>
<div class="test" onclick="alert(1);">test 1</div>
<div class="test" onclick="alert(2);">test 2</div>
</body>
</html>
相关文章:
- Windows8应用程序(html&Javascript):从图片库(除了文件选择器)显示图像的另一种方式
- 单击()的另一种方式
- Rails 以一种方式格式化 DateTime.now 和 DateTime.yesterday 另一种方式 - 我如何
- 另一种方式是Javascript中的函数堆叠
- require.js是require的另一种方式
- 在创建 toLowerCase 函数时,一种方式比另一种方式更好
- 以两种不同的方式编写函数:一种方式会导致 TypeError,另一种方式不会.为什么
- 编写 if 语句的另一种方式
- 存储JS变量和画布数据的另一种方式,用户可以稍后检索
- 从以另一种方式编写的输入中返回一个字符串
- 用q创造承诺的另一种方式
- 访问AngularJS隔离作用域的另一种方式
- Jquery动画以一种方式工作,而不是另一种方式
- 在facebook应用程序自动完成的另一种方式
- 打印稿,Angular设计——传递依赖的另一种方式
- Scala到JS的加密不起作用,但另一种方式工作得很好
- 警报框以一种方式工作,而不是以另一种方式
- 在表中以AM/PM格式显示小时的另一种方式:在angular JS中,每小时从上午12点到晚上11点
- Emberjs 1.0:如何创建模型并以另一种方式显示它们
- Javascript:将关联数组转换为字符串的最佳方式,稍后再转换成另一种方式