2017-06-05 114 views
0

我已经构建了一个python脚本,它使用Selenium和Firefox来加载一些网站并处理它们的内容。因为我想在PHP中使用该脚本的输出,所以我使用PHP的exec()函数。通过PHP执行Selenium webdriver 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() 

当在命令行中运行它,我得到了预期的“驱动程序开始”输出。

然而,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 

我应该还提到,在命令行中我试图运行上脚本既作为根和另一个用户,都工作。网络服务器正在使用“nginx”用户执行它,我不能在命令行中使用它,导致它被网络服务器占用。但我认为,就像我的测试用户一样,nginx用户也应该拥有所有必要的权限来运行脚本。

版Firefox:Mozilla Firefox浏览器52.1.0

硒版本:3.4.3

Geckodriver版本:0.16.1

回答

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()