web-dev-qa-db-ja.com

IOError:[Errno 13]アクセスが拒否されました: 'Python / Seleniumの実行時にgeckodriver.log

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/にインストールされます

7
Franco

エラーは、次のように何が間違っているかについてのヒントを与えてくれます。

[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_pathlog_path=log_pathで開始されます。

    if capabilities.get("marionette"):
        capabilities.pop("marionette")
        self.service = Service(executable_path, log_path=log_path)
        self.service.start()

あなたのプログラムはここでValuelog_pathlog_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 
    
6
DebanjanB

Windowsのcmdシェルからテストを実行している場合、Windowsマシンを使用している場合は、ユーザー特権が管理者レベルであることを確認することをお勧めします。 cmd.exeアプリケーション "C:\ Windows\System32\cmd.exe"に移動します。 cmd.exeアイコンを右クリックし、「Elevate!」のオプションがあるかどうかを確認してクリックします。これにより、管理者権限でcmdシェルが開き、geckodriverがログファイルを作成できるようになります。 cmdシェルでコードを実行してみて、機能するかどうかを確認してください。

もう1つのオプションは、C:\ Windows\System32\cmd.exeに移動して右クリックし、[管理者として実行]を選択して、アプリケーションを管理者として実行することです。

0
Roby Mink

私はWindows10コンピューターを使用しています。 geckodriver.logファイルを削除すると、問題が修正されました。

0
Daniel Butler