首页 > 解决方案 > 来自 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. 

标签: pythonlinuxfirefoxbrowsersplinter

解决方案


我遇到过同样的问题。我意识到 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。


推荐阅读