【问题标题】:What causes OSError: Bad file descriptor error in python's selenium package?什么导致 OSError:python 的 selenium 包中的文件描述符错误?
【发布时间】:2021-01-05 13:10:38
【问题描述】:

我使用 selenium 运行 django 测试,我以前从未遇到过这个错误。不知从何而来,我的数百个测试开始失败(尽管奇怪的是,并非所有测试都失败了,而且并非始终如一 - 如果我一次运行一个测试,它们运行良好。)我不知道为什么会发生这种情况,因为没有改变我的环境。

从下面的回溯中,看起来在设置 webdriver 时抛出了错误。有没有人遇到过这个 selenium 错误,有没有人知道如何解决它?

我正在使用 selenium==3.141.0 和 python 3.6.3

这是运行测试时似乎是错误来源的测试类:

from django.contrib.staticfiles.testing import StaticLiveServerTestCase
from selenium import webdriver
from django.test import Client
from rest_framework.test import APIClient


class ViewTestCase(StaticLiveServerTestCase):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.test_client = Client()
        self.api_client = APIClient()

    def setUp(self):
        super().setUp()
        self.selenium = webdriver.Chrome()

        self.selenium.set_window_size(1200, 678)
        self.selenium.implicitly_wait(5)
        self.open_page()

    def tearDown(self):
        self.selenium.quit()
        super().tearDown()

    def open_page(self):
        self.selenium.get('{}/{}'.format(self.live_server_url, self.page_url))

错误跟踪日志:

Traceback (most recent call last):
  File "/Users/daniellong/Documents/Coding/GrubBase/GrubBase/tests/__init__.py", line 174, in setUp
    self.selenium = webdriver.Chrome()
  File "/Users/daniellong/Documents/Coding/GrubBase/venv/lib/python3.6/site-packages/selenium/webdriver/chrome/webdriver.py", line 73, in __init__
    self.service.start()
  File "/Users/daniellong/Documents/Coding/GrubBase/venv/lib/python3.6/site-packages/selenium/webdriver/common/service.py", line 76, in start
    stdin=PIPE)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/subprocess.py", line 709, in __init__
    restore_signals, start_new_session)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/subprocess.py", line 1344, in _execute_child
    raise child_exception_type(errno_num, err_msg, err_filename)
OSError: [Errno 9] Bad file descriptor

【问题讨论】:

  • 你能显示你试图运行的代码吗?
  • 一般来说,“OSError: [Errno 9] Bad file descriptor”会在 python 文件被当前文件对象的“close()”方法关闭时引发。因此,我可以通过列出您的代码来告诉您更多信息。
  • 谢谢德米特里。添加了正在初始化webdriver的测试类的源代码
  • 请查看此页面pypi.org/project/selenium“驱动程序”部分。有没有安装 chrome 驱动?
  • 是的,我安装了 chrome 驱动程序。而且我大部分时间都能很好地使用驱动程序和硒。最奇怪的部分是错误发生不一致。只有当我运行完整的测试套件时才会发生这种情况。如果我自己运行测试,它运行良好。

标签: python django selenium selenium-webdriver file-descriptor


【解决方案1】:

此错误消息...

Traceback (most recent call last):
  File "/Users/daniellong/Documents/Coding/GrubBase/GrubBase/tests/__init__.py", line 174, in setUp
    self.selenium = webdriver.Chrome()
  File "/Users/daniellong/Documents/Coding/GrubBase/venv/lib/python3.6/site-packages/selenium/webdriver/chrome/webdriver.py", line 73, in __init__
.
.
    raise child_exception_type(errno_num, err_msg, err_filename)
OSError: [Errno 9] Bad file descriptor

以及您在 cmets 中的观察结果 ...错误发生不一致。只有当我运行完整的测试套件时才会发生这种情况。如果我自己运行测试,它运行良好....

...暗示 ChromeDriver 无法间歇性地启动/生成新的浏览上下文,即 Chrome 浏览器 会话。

大概您的观察表明您的代码完美无缺,但问题在于退出 Chrome 浏览器并重新初始化它。一般来说,当遇到OSError: [Errno 9] Bad file descriptor 时,您尝试使用的socket 文件描述符 是无效的,这有多种可能的原因:

  • 文件描述符已经在某处关闭。
  • 文件描述符不一致。
  • 您的系统是out of memory

内存使用情况快照可以帮助我们以更好的方式分析问题。然而,一个通用的方法是:


参考文献

您可以在以下位置找到一些相关的详细讨论:

【讨论】:

    猜你喜欢
    • 2020-09-27
    • 1970-01-01
    • 2011-09-08
    • 2016-10-17
    • 2016-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多