我已经构建了一个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,但这也不起作用。
答案 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()