【问题标题】:How To Fix "TypeError: 'NoneType' object is not callable"如何修复“TypeError:‘NoneType’对象不可调用”
【发布时间】:2017-02-07 13:49:13
【问题描述】:

当我运行我的脚本时:

from selenium import webdriver
# from selenium.webdriver.firefox.firefox_binary import FirefoxBinary
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
import os
import pytest
import unittest
from nose_parameterized import parameterized

    class multiBrowsers(unittest.TestCase):
        @parameterized.expand([
            ("chrome"),
            ("firefox"),
        ])

        def setUp(self, browser):

            if browser == "firefox":
                caps = DesiredCapabilities.FIREFOX
                caps["marionette"] = True
                caps["binary"] = "/Applications/Firefox.app/Contents/MacOS/firefox-bin"
                self.driver = webdriver.Firefox(capabilities=caps)
            elif browser == "chrome":
                self.driver = webdriver.Chrome()

        def test_loadPage(self):
            driver = self.driver
            driver.get("http://www.google.com")

        def tearDown(self):
            self.driver.quit()

我得到错误:

Error
TypeError: 'NoneType' object is not callable

我读到我没有正确传递一些东西,但我不知道去哪里看。提前感谢您的帮助!

【问题讨论】:

  • 至少指定错误所在的行
  • 那是另一回事。它没有说明是哪条线路造成的。我假设它在 test_loadPage(self),但它没有指定行。
  • 能否在错误上方提供控制台输出?我怀疑您是在“test_loadPage”方法而不是“multiBrowsers”类上运行测试。

标签: python selenium nose-parameterized


【解决方案1】:

不确定参数化是否可以应用于setUp,我设法让它与测试功能一起工作:

@parameterized.expand([
    ("chrome"),
    ("firefox"),
])
def test_loadPage(self, browser):

添加@parametrized 装饰器后,我收到'NoneType' object is not callable 错误,并且测试名称在测试资源管理器中未正确显示。

在测试资源管理器中刷新方法后,测试名称被格式化为 test_loadPage_0_chrome 并且测试工作正常。

【讨论】:

    【解决方案2】:

    完全猜测,但我认为这可能是你的问题:

    @parameterized.expand([
        ("chrome"),
        ("firefox"),
    ])
    

    @parameterized 中的某些内容可能无法将它们识别为元组。尝试添加逗号以使它们成为明确的元组:

    @parameterized.expand([
        ("chrome", ),
        ("firefox", ),
    ])
    

    【讨论】:

    • 刚刚添加了相同的结果。还有其他想法吗?
    • 问题肯定出在@parameterized.expand 装饰器上。如果我把它拿出来,一切都会好起来的。从进一步阅读中,我得到的印象是装饰器不能很好地处理继承自 unittest.TestCase 的类。
    • 有道理。我真的希望我可以将它用于我的测试工作。非常感谢您的帮助!
    【解决方案3】:

    我在使用带有 unittest.TestCase 类的 parametrized.expand 时遇到了同样的错误。 在构建西装参数化时,测试 _0、_1 就足够了,因此如果您手动将测试添加到套件中,则会引发此错误。 最好的解决方案是使用,

    suite = unittest.TestSuite()
    testloader = unittest.TestLoader()
    testnames = testloader.getTestCaseNames(t_class)
    for name in testnames:
        suite.addTest(t_class(name))
    runner = unittest.TextTestRunner(verbosity=2)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-27
      • 2021-12-05
      • 1970-01-01
      • 2019-10-04
      • 2016-08-17
      • 2012-04-28
      • 2021-08-18
      • 2016-10-10
      相关资源
      最近更新 更多