在Python中使用PhantomJS最简单的方法是通过Selenium。最简单的安装方法是:
npm -g install phantomjs-prebuilt
安装完成后,您可以像这样轻松地使用phantom:
from selenium import webdriver
driver = webdriver.PhantomJS() # or add to your PATH
driver.set_window_size(1024, 768) # optional
driver.get('https://google.com/')
driver.save_screenshot('screen.png') # save a screenshot to disk
sbtn = driver.find_element_by_css_selector('button.gbqfba')
sbtn.click()
如果您的系统路径环境变量设置不正确,那么您需要将确切路径作为参数传递给 webdriver.PhantomJS()
。请将此替换为:
如果您的系统路径环境变量没有正确设置,您需要指定确切的路径作为参数传递给 webdriver.PhantomJS()
。 将此内容替换为:
driver = webdriver.PhantomJS() # or add to your PATH
...随附以下内容:
driver = webdriver.PhantomJS(executable_path='/usr/local/lib/node_modules/phantomjs/lib/phantom/bin/phantomjs')
参考文献:
driver.page_source
。 - scharfmnnode
和npm
安装phantomJS
。只需从http://phantomjs.org/download.html下载二进制文件,并将`phantomjs.exe`放置在我的PATH路径中的某个位置(例如`c:\Windows\System32`),或者反之亦然(将其放在任何位置并将该文件夹添加到PATH路径中),就足以让它在Python中工作。 - Dirkghost.py
。你可能想使用它代替:from ghost import Ghost
ghost = Ghost()
with ghost.start() as session:
page, extra_resources = ghost.open("http://jeanphi.me")
assert page.http_status==200 and 'jeanphix' in ghost.content
现在,由于GhostDriver已经与PhantomJS捆绑在一起,因此通过Selenium使用它变得更加方便。
我尝试了Pykler建议的PhantomJS Node安装方式,但实际上我发现它比独立安装的PhantomJS要慢。我猜独立安装版本之前可能没有提供这些功能,但从v1.9开始,它确实提供了这些功能。
现在你可以像这样使用
import selenium.webdriver
driver = selenium.webdriver.PhantomJS()
driver.get('http://google.com')
# do some processing
driver.quit()
以下是我使用PhantomJS和Django测试JavaScript的方法:
mobile/test_no_js_errors.js:
var page = require('webpage').create(),
system = require('system'),
url = system.args[1],
status_code;
page.onError = function (msg, trace) {
console.log(msg);
trace.forEach(function(item) {
console.log(' ', item.file, ':', item.line);
});
};
page.onResourceReceived = function(resource) {
if (resource.url == url) {
status_code = resource.status;
}
};
page.open(url, function (status) {
if (status == "fail" || status_code != 200) {
console.log("Error: " + status_code + " for url: " + url);
phantom.exit(1);
}
phantom.exit(0);
});
mobile/tests.py:
import subprocess
from django.test import LiveServerTestCase
class MobileTest(LiveServerTestCase):
def test_mobile_js(self):
args = ["phantomjs", "mobile/test_no_js_errors.js", self.live_server_url]
result = subprocess.check_output(args)
self.assertEqual(result, "") # No result means no error
Run tests:
manage.py test mobile
@Pykler的回答很棒,但是Node的要求已经过时了。那个答案中的评论提供了更简单的答案,我在这里列出来以节省其他人的时间:
Install PhantomJS
As @Vivin-Paliath points out, it's a standalone project, not part of Node.
Mac:
brew install phantomjs
Ubuntu:
sudo apt-get install phantomjs
etc
Set up a virtualenv
(if you haven't already):
virtualenv mypy # doesn't have to be "mypy". Can be anything.
. mypy/bin/activate
If your machine has both Python 2 and 3 you may need run virtualenv-3.6 mypy
or similar.
Install selenium:
pip install selenium
Try a simple test, like this borrowed from the docs:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.PhantomJS()
driver.get("http://www.python.org")
assert "Python" in driver.title
elem = driver.find_element_by_name("q")
elem.clear()
elem.send_keys("pycon")
elem.send_keys(Keys.RETURN)
assert "No results found." not in driver.page_source
driver.close()
PhantomJS
?使用pip
命令似乎无法正常工作。 - MD. Khairul Basarconda install PhantomJS
在你的脚本中:
from selenium import webdriver
driver=webdriver.PhantomJS()
运行完美。
我做的是 python3.3 相关的工作。我正在处理大量网站列表,所以在超时时失败对于任务能够完成整个列表是至关重要的。
command = "phantomjs --ignore-ssl-errors=true "+<your js file for phantom>
process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE)
# make sure phantomjs has time to download/process the page
# but if we get nothing after 30 sec, just move on
try:
output, errors = process.communicate(timeout=30)
except Exception as e:
print("\t\tException: %s" % e)
process.kill()
# output will be weird, decode to utf-8 to save heartache
phantom_output = ''
for out_line in output.splitlines():
phantom_output += out_line.decode('utf-8')
如果您正在使用Buildout,您可以使用gp.recipe.node食谱轻松自动化Pykler所描述的安装过程。
[nodejs]
recipe = gp.recipe.node
version = 0.10.32
npms = phantomjs
scripts = phantomjs
这部分将以二进制方式安装node.js(至少在我的系统上),然后使用npm安装PhantomJS。最后创建一个入口点bin/phantomjs
,您可以使用它来调用PhantomJS webdriver。(要安装Selenium,您需要在您的egg requirements或Buildout配置中指定它。)
driver = webdriver.PhantomJS('bin/phantomjs')
gp.recipe.phantomjs
,它配置了phantomjs
和casperjs
。 - gakhov
subprocess.popen
,但增加了一些扩展功能,使API无缝连接。 - Pykler