如何通过GhostDriver(selenium)使用PhantomJS运行网页代码

8 投票
1 回答
6302 浏览
提问于 2025-04-18 03:04

我想用 PhantomJS 通过 GhostDriver 来生成 PDF,而不仅仅是渲染 PDF。当我使用下面的代码时,页面正常加载:

from selenium import webdriver

driver = webdriver.PhantomJS('./node_modules/phantomjs/bin/phantomjs')
driver.set_window_size(1024, 768)
driver.get('http://stackoverflow.com')

当我通过命令行使用这个脚本 https://github.com/ariya/phantomjs/blob/master/examples/rasterize.js 时,PDF 生成得非常完美。

现在我想像 rasterize.js 里那样执行脚本(page.render('file.pdf')),但是是通过 webdriver 来实现。webdriver 有一个 execute_script 方法,但这个方法看起来只是执行 PhantomJS 的代码,并不能访问到 webpage 的实例上下文。此外,webdriver 还有一个 get_screenshot_as_base64 方法,但它只返回 PNG 格式的图片。

我使用的是最新版本的 seleniumphantomjsnodejs

所以我想知道,如何才能通过 GhostDriver 访问到 PhantomJS 的网页实例,并调用 render 方法呢?

1 个回答

9

有一种特别的方法可以通过GhostDriver来执行PhantomJS脚本,使用下面的命令:

POST /session/id/phantom/execute

这个功能是在GhostDriver v1.1.0中加入的,所以从PhantomJS v.1.9.6开始就应该可以使用了。

看看这个例子:

def execute(script, args):
    driver.execute('executePhantomScript', {'script': script, 'args' : args })

driver = webdriver.PhantomJS('phantomjs')

# hack while the python interface lags
driver.command_executor._commands['executePhantomScript'] = ('POST', '/session/$sessionId/phantom/execute')

driver.get('http://stackoverflow.com')

# set page format
# inside the execution script, webpage is "this"
pageFormat = '''this.paperSize = {format: "A4", orientation: "portrait" };'''
execute(pageFormat, [])

# render current page
render = '''this.render("test.pdf")'''
execute(render, [])

需要注意的是,在OS X系统上,PhantomJS会将网页渲染成图片,而且文本是无法选择的,这是因为OS X中的Qt渲染引擎有一些限制(至少在PhantomJS v.1.9.8及更早版本中是这样的)。

撰写回答