【发布时间】:2016-01-10 08:40:33
【问题描述】:
CasperJS 版本 1.1.0-beta3,在 OSX 10.10.4 64 位上使用 phantomjs 版本 1.9.8 和 Python 2.7.6。
感谢您的光临和阅读!
我正在使用 python 来启动一个 casperjs 脚本。 casperjs 脚本在使用 casperjs myscript.js 在 bash 中启动时可以完美运行,但在使用以下 python 代码启动时会显示其行为错误:
import os
import subprocess
args = ['/usr/local/Cellar/casperjs/1.1-beta3/libexec/bin/casperjs', '/Users/john/Documents/myjstests/myscript.js']
subprocess.call(args)
APP_ROOT = os.path.dirname(os.path.sys.argv[0])
CASPER = '/usr/local/Cellar/casperjs/1.1-beta3/libexec/bin/casperjs'
SCRIPT = os.path.join(APP_ROOT, 'myscript.js')
params = CASPER + ' ' + SCRIPT
print subprocess.call(params, shell = True)
下面是我的 casperjs 脚本的删节版
var casper = require('casper').create({
});
var x = require('casper').selectXPath;
casper.userAgent('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36');
casper.start('http://www.allforthewatch.bigcartel.com/').viewport(1920, 1080); //The store
casper.wait(5000, function(){
this.echo(this.getTitle());
casper.capture('store1.png');
});
casper.then(function(){
casper.click(x('//*[@id="home"]/div/section[2]/ul/li/a/img'));
});
casper.wait(5000, function(){
casper.capture('store2.png');
});
casper.then(function(){
casper.click(x('//*[@id="product"]/div/section[1]/section[2]/form/button'));
});
casper.wait(5000, function(){
casper.capture('store3.png');
});
casper.then(function(){
casper.click(x('//*[@id="cart"]/div/section/form/button'));
});
casper.wait(5000, function(){
casper.capture('store4.png');
});
casper.then(function(){
casper.sendKeys(x('//*[@id="buyer_first_name"]'), 'John');
});
casper.wait(5000, function(){
casper.capture('store5.png');
});
casper.run();
到目前为止,在使用 python 启动时,脚本的行为存在三个值得注意的错误:
1-捕获显示缺少图像。
没有找到 2 个元素,即使它们确实存在。终端中的以下错误消息证实了这一点
Johns-MacBook-Pro:myjstests john$ python mypythontest.py
All For The Watch — Home
CasperError: Cannot get informations from xpath selector: //*[@id="buyer_first_name"]: element not found.
/usr/local/Cellar/casperjs/1.1-beta3/libexec/modules/casper.js:1058 in getElementInfo
/usr/local/Cellar/casperjs/1.1-beta3/libexec/modules/casper.js:1589
/Users/vegaforte/Documents/myjstests/myscript.js:43
/usr/local/Cellar/casperjs/1.1-beta3/libexec/modules/casper.js:1553 in runStep
/usr/local/Cellar/casperjs/1.1-beta3/libexec/modules/casper.js:399 in checkStep
3-脚本连续运行两次。这很可能是由于 myscript.js 在 args 以及最后通过 params 传递。
注意到的错误 #1 似乎是由于脚本“匆忙”完成了其步骤。我认为 5000 毫秒的等待被忽略了。当我查看捕获之间的变化时,这得到了进一步的支持。以下将是一组“A”捕获 通过使用 casperjs myscript.js 在 bash 中启动,然后在使用 python mypythontest.py。
请注意,在集合“B”中,图像 3B 和 4B 是相同的。就好像卡在了那一步一样。在脚本中的这一点之后(使用 python 启动时),错误消息出现在控制台中并停止执行,因此没有图像 5B。
我研究了使用子进程调用 casperjs 的方式可能存在的问题,但到目前为止,对于将 casperjs 与 python 一起使用,这似乎是正确的用法。
在这一点上,我应该提到我已经将相同的 python 代码与另一个 casperjs 脚本一起使用,并且没有任何问题,除了它也连续运行了两次。
我错过了什么导致这些问题?如果您需要进一步说明,请告诉我。
感谢您的宝贵时间!
【问题讨论】:
-
@Cyrus 感谢您的建议 :) 在这种情况下,我发布的代码是重现我所描述问题的最小、完整代码。感谢您指出这一最佳做法。
-
我还没有阅读过大量的文字和图像(我怀疑是否有人会阅读),但我严重怀疑一个包含 10 个胖图像资产的示例是否最少。
-
不努力减少问题只有一个结果:没有人会阅读问题,因此没有答案。这不符合您的最大利益。
-
@4ae1e1 我理解你的观点。 Casperjs 有一个非常酷的功能,它允许您捕获网页/屏幕以“查看”无头浏览器在做什么。在我的问题的上下文中,捕获对于强调 casperjs 脚本的正确和不正确行为之间的区别至关重要。
-
难道shell中的
casperjs和python中的/usr/local/Cellar/casperjs/1.1-beta3/libexec/bin/casperjs实际上是不同的CasperJS二进制文件?
标签: python python-2.7 phantomjs casperjs