【问题标题】:Python causes Casperjs to ignore wait time, DOM element and runs twice in a rowPython 导致 Casperjs 忽略等待时间、DOM 元素并连续运行两次
【发布时间】: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.jsargs 以及最后通过 params 传递。

注意到的错误 #1 似乎是由于脚本“匆忙”完成了其步骤。我认为 5000 毫秒的等待被忽略了。当我查看捕获之间的变化时,这得到了进一步的支持。以下将是一组“A”捕获 通过使用 casperjs myscript.js 在 bash 中启动,然后在使用 python mypythontest.py。

请注意,在集合“B”中,图像 3B 和 4B 是相同的。就好像卡在了那一步一样。在脚本中的这一点之后(使用 python 启动时),错误消息出现在控制台中并停止执行,因此没有图像 5B。

我研究了使用子进程调用 casperjs 的方式可能存在的问题,但到目前为止,对于将 casperjs 与 python 一起使用,这似乎是正确的用法。

在这一点上,我应该提到我已经将相同的 python 代码与另一个 casperjs 脚本一起使用,并且没有任何问题,除了它也连续运行了两次。

我错过了什么导致这些问题?如果您需要进一步说明,请告诉我。

感谢您的宝贵时间!

设置“A”

设置“B”

【问题讨论】:

  • @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


【解决方案1】:

这个解决方案是@Vaviloff 提出的,我非常感谢他的帮助:)

问题的主要原因是 shell 和 python 使用的二进制文件是 不同。

这是原始的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) 

所有需要在 python 代码中更改的是 argsCASPER 以及以下内容 /usr/local/Cellar/casperjs/1.1-beta3/bin/casperjs

通过这个修改,整个 casperjs 可以完美运行。观察所有等待时间并找到所有 DOM 元素。

我遇到的最后一个问题是脚本运行了两次。我想出的一个快速而肮脏的解决方案是从 args 中删除 /Users/john/Documents/myjstests/myscript.js

我希望这可以帮助有类似问题的人;)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多