python - 来自 Splinter 的 UnboundLocalError?
问题描述
我安装了 Firefox 并使用 Ubuntu 18.04。
from splinter import Browser
with Browser() as browser:
# Visit URL
url = "http://www.google.com"
browser.visit(url)
结果是:
Traceback (most recent call last):
File "test.py", line 3, in <module>
with Browser() as browser:
File "/home/sebastian/PycharmProjects/SupremeBot/venv/lib/python3.6/site-packages/splinter/browser.py", line 90, in Browser
return get_driver(driver, *args, **kwargs)
File "/home/sebastian/PycharmProjects/SupremeBot/venv/lib/python3.6/site-packages/splinter/browser.py", line 68, in get_driver
raise e
UnboundLocalError: local variable 'e' referenced before assignment
Traceback (most recent call last):
File "test.py", line 3, in <module>
with Browser() as browser:
File "/home/sebastian/PycharmProjects/SupremeBot/venv/lib/python3.6/site-packages/splinter/browser.py", line 90, in Browser
return get_driver(driver, *args, **kwargs)
File "/home/sebastian/PycharmProjects/SupremeBot/venv/lib/python3.6/site-packages/splinter/browser.py", line 68, in get_driver
raise e
UnboundLocalError: local variable 'e' referenced before assignment
Traceback (most recent call last):
File "test.py", line 3, in <module>
with Browser() as browser:
File "/home/sebastian/PycharmProjects/SupremeBot/venv/lib/python3.6/site-packages/splinter/browser.py", line 90, in Browser
return get_driver(driver, *args, **kwargs)
File "/home/sebastian/PycharmProjects/SupremeBot/venv/lib/python3.6/site-packages/splinter/browser.py", line 68, in get_driver
raise e
UnboundLocalError: local variable 'e' referenced before assignment
我不知道如何解决这个问题。我检查了 Splinter 的文档,但没有提示此错误。
我做错了什么?
更新纵梁库后:
Traceback (most recent call last):
File "test.py", line 3, in <module>
with Browser() as browser:
File "/home/sebastian/PycharmProjects/SupremeBot/venv/lib/python3.6/site-packages/splinter/browser.py", line 92, in Browser
return get_driver(driver, *args, **kwargs)
File "/home/sebastian/PycharmProjects/SupremeBot/venv/lib/python3.6/site-packages/splinter/browser.py", line 70, in get_driver
raise err
File "/home/sebastian/PycharmProjects/SupremeBot/venv/lib/python3.6/site-packages/splinter/browser.py", line 66, in get_driver
return driver(*args, **kwargs)
File "/home/sebastian/PycharmProjects/SupremeBot/venv/lib/python3.6/site-packages/splinter/driver/webdriver/firefox.py", line 88, in __init__
**kwargs
File "/home/sebastian/PycharmProjects/SupremeBot/venv/lib/python3.6/site-packages/selenium/webdriver/firefox/webdriver.py", line 164, in __init__
self.service.start()
File "/home/sebastian/PycharmProjects/SupremeBot/venv/lib/python3.6/site-packages/selenium/webdriver/common/service.py", line 83, in start
os.path.basename(self.path), self.start_error_message)
selenium.common.exceptions.WebDriverException: Message: 'geckodriver' executable needs to be in PATH.
解决方案
我遇到过同样的问题。我意识到 splinter 的 pip 安装在 splinter/browser.py 文件中的 get_broswer() 函数中有一个错误。
pip install 给出错误的 splinter 版本UnboundLocalError: local variable 'e' referenced before assignment
:
def get_driver(driver, retry_count=3, *args, **kwargs):
"""Try to instantiate the driver.
Common selenium errors are caught and a retry attempt occurs.
This can mitigate issues running on Remote WebDriver.
"""
for _ in range(retry_count):
try:
return driver(*args, **kwargs)
except (IOError, HTTPException, WebDriverException, MaxRetryError) as e:
pass
raise e
GitHub版本:
def get_driver(driver, retry_count=3, *args, **kwargs):
"""Try to instantiate the driver.
Common selenium errors are caught and a retry attempt occurs.
This can mitigate issues running on Remote WebDriver.
"""
err = None
for _ in range(retry_count):
try:
return driver(*args, **kwargs)
except (IOError, HTTPException, WebDriverException, MaxRetryError) as e:
err = e
raise err
更新到 GitHub 版本后,我找到了真正的根本原因问题,那就是我使用的是旧版本的设置 chromedriver。我在这里为这个问题找到了一个很好的解决方案。
在此解决方案中,Navarasu建议您pip install webdriver-manager
,然后您可以按如下方式调用您的浏览器:
from splinter import Browser
from webdriver_manager.chrome import ChromeDriverManager
executable_path = {'executable_path': ChromeDriverManager().install()}
browser = Browser('chrome', **executable_path)
类似的方法可以用于 Firefox。
推荐阅读
- php - 使用排列在 MySQL 中搜索
- graphql - 从 reactjs apollo 调用 graphAPI 的通用方法
- javascript - 在浏览器中渐进式加载大型 PDF 文档(线性化)
- math - 基于输入数据的自动缩放散点图轴
- powerbi - Power BI 筛选列的 MAX
- jquery - 覆盖 jQuery 插件的 init 函数
- python - 如何从数据框中修改子类的自身数据?
- ruby-on-rails - 在 textarea 表单字段中编辑 JSONB 数据
- python - 如何在 Python 中避免区分大小写
- android - getSupportActionBar() 在片段中不支持