通过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/
答案 0 :(得分:4)
错误为我们提供了一些关于错误发生的提示,如下所示:
[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 以两个默认参数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()
您的程序错误在此处作为值 log_path (log_file
)对应键 log_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 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'
首要的是检查您正在使用的二进制文件之间的兼容性。
解决方案是:
使用有效值(chmod 777 executable_path
),使用所需参数log_path
和geckodriver.log
初始化 GeckoDriver 如下:
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
答案 1 :(得分:0)
我在Windows 10计算机上。 当我删除geckodriver.log文件时,它解决了我的问题。
答案 2 :(得分:0)
如果您是从Windows中的 cmd 外壳运行测试的,则可以尝试的是验证您的用户权限是否在管理员级别(如果您使用的是Windows计算机)。转到您的cmd.exe应用程序“ C:\ Windows \ System32 \ cmd.exe ”。右键单击 cmd.exe 图标,查看是否有“ 提升!”选项,然后单击它。这将使用管理员权限打开cmd shell,并应允许geckodriver创建日志文件。尝试在cmd shell中执行代码,看看它是否有效。
另一种选择是尝试通过以C:\ Windows \ System32 \ cmd.exe的身份以管理员身份运行该应用程序,右键单击并选择“以管理员身份运行”。