通过PHP exec()执行Selenium webdriver

时间:2017-06-05 16:06:10

标签: php python selenium firefox webdriver

我已经构建了一个python脚本,它使用Selenium和Firefox来加载一些网站并处理它们的内容。因为我想在PHP中使用该脚本的输出,所以我使用PHP的exec()函数。

我的python测试脚本如下所示:

from pyvirtualdisplay import Display
from selenium import webdriver
import sys

display = Display(visible=0, size=(800, 600))
display.start()

driver = webdriver.Firefox()

print("Driver started")

driver.quit()
display.stop()

从命令行运行时,我得到了预期的“Driver started”输出。

但是,在像这样的PHP脚本中运行它时:

exec("python test.py 2>&1", $output);

python脚本产生以下错误:

Traceback (most recent call last):
  File "test.py", line 8, in 
    driver = webdriver.Firefox()
  File "/usr/lib/python2.6/site-packages/selenium-3.4.3-py2.6.egg/selenium/webdriver/firefox/webdriver.py", line 152, in __init__
    keep_alive=True)
  File "/usr/lib/python2.6/site-packages/selenium-3.4.3-py2.6.egg/selenium/webdriver/remote/webdriver.py", line 98, in __init__
    self.start_session(desired_capabilities, browser_profile)
  File "/usr/lib/python2.6/site-packages/selenium-3.4.3-py2.6.egg/selenium/webdriver/remote/webdriver.py", line 188, in start_session
    response = self.execute(Command.NEW_SESSION, parameters)
  File "/usr/lib/python2.6/site-packages/selenium-3.4.3-py2.6.egg/selenium/webdriver/remote/webdriver.py", line 256, in execute
     self.error_handler.check_response(response)
   File "/usr/lib/python2.6/site-packages/selenium-3.4.3-py2.6.egg/selenium/webdriver/remote/errorhandler.py", line 194, in check_response
     raise exception_class(message, screen, stacktrace)
 selenium.common.exceptions.WebDriverException: Message: Unable to find a matching set of capabilities

我还应该提一下,在命令行上,我尝试以root用户身份和另一个用户身份运行脚本,并且都工作了。 Web服务器正在使用“nginx”用户执行它,我无法在命令行上使用它,因为它被Web服务器占用。但我认为,就像我的测试用户一样,nginx用户也应该拥有运行脚本所需的所有权限。

Firefox版:Mozilla Firefox 52.1.0

Selenium版本:3.4.3

Geckodriver版本:0.16.1

更新 试图从PHP运行可执行文件,如Firefox,但这也不起作用。

1 个答案:

答案 0 :(得分:0)

最终可以解决问题。看来,通过PHP exec()运行脚本时,自动找不到firefox二进制文件。因此问题的解决方法是执行以下操作:

from pyvirtualdisplay import Display
from selenium import webdriver
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary

display = Display(visible=0, size=(800, 600))
display.start()

binary = FirefoxBinary('/usr/bin/firefox')
driver = webdriver.Firefox(firefox_binary=binary)

print("Driver started")

driver.quit()
display.stop()