Flask/Python経由でSeleniumを実行しているときに次のエラーを受け取る
browser = webdriver.Firefox()
[Wed Mar 07 03:02:27.719608 2018] [:error] [pid 21555] [client 108.162.250.6:36139] File "/usr/local/lib/python2.7/dist-packages/Selenium/webdriver/firefox/webdriver.py", line 151, in __init__
[Wed Mar 07 03:02:27.719611 2018] [:error] [pid 21555] [client 108.162.250.6:36139] log_path=log_path)
[Wed Mar 07 03:02:27.719614 2018] [:error] [pid 21555] [client 108.162.250.6:36139] File "/usr/local/lib/python2.7/dist-packages/Selenium/webdriver/firefox/service.py", line 44, in __init__
[Wed Mar 07 03:02:27.719617 2018] [:error] [pid 21555] [client 108.162.250.6:36139] log_file = open(log_path, "a+") if log_path is not None and log_path != "" else None
[Wed Mar 07 03:02:27.719620 2018] [:error] [pid 21555] [client 108.162.250.6:36139] IOError: [Errno 13] Permission denied: 'geckodriver.log'
機能は
def get_index(api_key):
if str(api_key)!=the_api_key:
return 401
base_url = 'www.google.com'
browser = webdriver.Firefox()
browser.get(base_url)
html = browser.page_source
return html
アプリケーションディレクトリに直接移動してスクリプト(python run.py
)を実行しても、エラーは発生しません。
これに基づくと、Flask経由で実行した場合、ログファイルは書き込み可能ではないようですが、ファイルはどこに配置する必要がありますか?
geckdriver
実行可能ファイルは/usr/local/bin/
にインストールされます
エラーは、次のように何が間違っているかについてのヒントを与えてくれます。
[Wed Mar 07 03:02:27.719608 2018] [:error] [pid 21555] [client 108.162.250.6:36139] File "/usr/local/lib/python2.7/dist-packages/Selenium/webdriver/firefox/webdriver.py", line 151, in __init__
[Wed Mar 07 03:02:27.719611 2018] [:error] [pid 21555] [client 108.162.250.6:36139] log_path=log_path)
ソースコードによると、GeckoDriverは、次のように2つのデフォルト引数executable_path
とlog_path=log_path
で開始されます。
if capabilities.get("marionette"):
capabilities.pop("marionette")
self.service = Service(executable_path, log_path=log_path)
self.service.start()
あなたのプログラムはここでValuelog_path(log_file
)に対応するKeylog_pathは編集可能(追加可能)ではなく、最終的に失敗します:
[Wed Mar 07 03:02:27.719617 2018] [:error] [pid 21555] [client 108.162.250.6:36139] log_file = open(log_path, "a+") if log_path is not None and log_path != "" else None
[Wed Mar 07 03:02:27.719620 2018] [:error] [pid 21555] [client 108.162.250.6:36139] IOError: [Errno 13] Permission denied: 'geckodriver.log'
ソースコードによると、GeckoDriverサービスはデフォルトで次のように開始されます:
class Service(service.Service): "" "GeckoDriverの開始と停止を管理するオブジェクト。" ""
def __init__(self, executable_path, port=0, service_args=None,
log_path="geckodriver.log", env=None):
"""Creates a new instance of the GeckoDriver remote service proxy.
GeckoDriver provides a HTTP interface speaking the W3C WebDriver
protocol to Marionette.
:param log_path: Optional path for the GeckoDriver to log to.
Defaults to _geckodriver.log_ in the current working directory.
"""
log_file = open(log_path, "a+") if log_path is not None and log_path != "" else None
これは、geckodriver.log
の場所をプログラムに明示的に渡さない場合、GeckoDriverがに独自にファイルを作成する傾向があることを意味します。 )現在の作業ディレクトリおよび必要な権限がない場合、メッセージ権限でエラーになります拒否: 'geckodriver.log'
何よりも重要なのは、使用しているバイナリ間の互換性を確認することです。
解決策は次のとおりです。
GeckoDriverを必要な引数executable_path
およびlog_path
で有効な値(chmod 777 geckodriver.log
) 次のように :
def get_index(api_key):
if str(api_key)!=the_api_key:
return 401
base_url = 'www.google.com'
browser = webdriver.Firefox(executable_path="/usr/local/bin/geckodriver", log_path="/path/to/geckodriver.log")
browser.get(base_url)
html = browser.page_source
return html
プロジェクトワークスペース内にgeckodriver.log
を作成する場合は、次のように必要な権限(chmod 777 Project Workspace
)を確認してください。
def get_index(api_key):
if str(api_key)!=the_api_key:
return 401
base_url = 'www.google.com'
browser = webdriver.Firefox(executable_path='/usr/local/bin/geckodriver')
browser.get(base_url)
html = browser.page_source
return html
Windowsのcmdシェルからテストを実行している場合、Windowsマシンを使用している場合は、ユーザー特権が管理者レベルであることを確認することをお勧めします。 cmd.exeアプリケーション "C:\ Windows\System32\cmd.exe"に移動します。 cmd.exeアイコンを右クリックし、「Elevate!」のオプションがあるかどうかを確認してクリックします。これにより、管理者権限でcmdシェルが開き、geckodriverがログファイルを作成できるようになります。 cmdシェルでコードを実行してみて、機能するかどうかを確認してください。
もう1つのオプションは、C:\ Windows\System32\cmd.exeに移動して右クリックし、[管理者として実行]を選択して、アプリケーションを管理者として実行することです。
私はWindows10コンピューターを使用しています。 geckodriver.logファイルを削除すると、問題が修正されました。