2017-06-05 100 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()