![](/img/trans.png)
[英]Python Selenium TypeError: __init__() takes 1 positional argument but 2 were given
[英]Unittest + Selenium - __init__() takes 1 positional argument but 2 were given
我第一次使用unittest和selenium,但這也是我在python中的第一個更大的代碼。 我為這個問題找到了一些答案,但是對於具有__ init __繼承和方法super()的類沒有解釋。__ init __()
TL; DR我有一個可以一一繼承的類。 創建chrome實例的第一個類StartInstance從unittest.TestCase繼承,問題出在繼承和super()上。 其他類中的init (),因為當我刪除它時,測試正常開始
一切看起來像:
class StartInstance(unittest.TestCase):
@classmethod
def setUpClass(cls): pass
class A(StartInstance):
def __init__(self):
super().__init__() adding variables etc to init
class B(A):
def __init__(self):
super().__init__() adding variables etc to init
class C(A):
def __init__(self):
super().__init__() adding variables etc to init
class PrepareTests(B, C, D):
def all tests(self):
self.tests_B
self.tests_C
self.tests_D
class Tests(PrepareTests):
def test_click:
click()
all_tests()
#and finally somewhere a test runner
suite = loader.loadTestsFromTestCase(Tests)
runner.run(suite())
#when i run this i get this error and it only raises when i
add classes with their own init
#heh TL;DR almost as long as normal text sorry :(
所有:
完整錯誤訊息:
Traceback (most recent call last):
File "xyz\main_test.py", line 24,
in <module>
runner.run(suite())
File "xyz\main_test.py", line 11,
in suite
about_us = loader.loadTestsFromTestCase(AboutUs)
File
"xyz\Python36\lib\unittest\loader.py", line 92, in loadTestsFromTestCase
loaded_suite = self.suiteClass(map(testCaseClass, testCaseNames))
File "xyz\Python36\lib\unittest\suite.py", line 24, in __init__
self.addTests(tests)
File "xyz\Python36\lib\unittest\suite.py", line 57, in addTests
for test in tests:
TypeError: __init__() takes 1 positional argument but 2 were given
那就是我的代碼:
我有一個settings.py文件,其中包含由settings.xyz [“ layer1”] [“ KEY”]訪問的字典中的變量
setup.py-硒的安裝類
class StartInstance(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.driver = webdriver.Chrome()
cls.driver.get(settings.URLS['MAIN_URL'])
cls.driver.implicitly_wait(2)
cls.driver.maximize_window()
@classmethod
def tearDownClass(cls):
cls.driver.quit()
main_tests_config.py-下一步-現在非常基本的配置
class MainTestConfig(StartInstance):
def __init__(self):
super().__init__()
self.language = settings.TEST_LANGUAGE
self.currency = settings.TEST_CURRENCY
header.py (這樣的文件很少)-下一層將代碼從config.py轉換為類變量,因為需要全局語言而從先前的類繼承
class HeaderPath(MainTestConfig):
def __init__(self):
super().__init__()
self.logo_path = settings.PAGE_PATHS["HEADER"]["LOGO"]
self.business_path = settings.PAGE_PATHS["HEADER"]["BUSINESS"]
class HeaderText(MainTestConfig):
def __init__(self):
super().__init__()
self.business_text = settings.PAGE_CONTENT[self.language]["HEADER"]["BUSINESS"]
self.cart_text = settings.PAGE_CONTENT[self.language]["HEADER"]["CART"]
header_tests.py-下一層,繼承變量(HeadetText,HeaderPath,Urls(類Urls它是具有頁面url變量的類)),語言(來自MainTestConfig)和selenium驅動程序(來自第一類StartInstance),類的示例構建
class HeaderStaticTest(HeaderText, HeaderPath, Urls):
def header_static(self):
self.logo_display()
self.method2()
# etc..
def logo_display(self):
self.driver.find_element_by_xpath(self.logo_path)
def self.method2(self):
pass
static_display.py-下一層,該類繼承具有上一類測試的所有類,並使用其方法運行所有測試,但不作為test_
class StaticDisplay(HeaderStaticTest, HorizontalStaticTest, VerticalStaticTest):
def static_display(self):
self.header_static()
self.horizontal_static()
self.vertical_static()
test_about_us.py-下一層,一個普通的單元測試用例,它僅繼承上一個,但是一般而言,它繼承了我編寫的所有先前類,現在我可以測試頁面上的所有“靜態視圖”,當我單擊按鈕時它們都不會改變
class AboutUs(StaticDisplay):
def test_horizontal_menu_click(self):
about_us_element = self.driver.find_element_by_id(self.hor_about_path)
about_us_element.click()
self.assertIn(
self.about_url,
self.driver.current_url
)
def test_check_static_after_horizontal(self):
self.static_display()
(最終) main_cases.py-出現此錯誤,僅當我添加具有自己的init的類時才會引發...不知道如何修復...請幫助
def suite():
loader = unittest.TestLoader()
about_us = loader.loadTestsFromTestCase(AboutUs)
return unittest.TestSuite([about_us])
if __name__ == '__main__':
runner = unittest.TextTestRunner()
runner.run(suite())
正如我說的那樣,新類中的這個新def __ init __和super().__ init __()在某處有問題……我在哪里弄錯?
當我開始這個測試用例時,我得到一個錯誤:
TypeError:__ init __()接受1個位置參數,但上面給出了2個完整的錯誤消息,可能是需要的
有人能幫助我嗎?
TestCase
實例采用可選的關鍵字參數methodName
; 我猜測unittest
模塊會在某個時候將其顯式傳遞給幕后。 通常,當我對類進行子類化時,我不會自己使用這種模式。 這應該可以解決您的問題:
class SubClass(SupClass):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
尤其是當您沒有將任何參數傳遞給__init__
方法時,以這種方式傳遞參數是避免收到錯誤的好方法。 如果確實要將自定義內容傳遞給__init__
方法,則可以執行以下操作:
class SubClass(SupClass):
def __init__(self, myarg, *args, **kwargs):
super().__init__(*args, **kwargs)
# do something with your custom argument
好的,我發現了問題...除了您編寫的解決方案也不錯以外,我還用了它。
我的問題出在這里:
suite = loader.loadTestsFromTestCase(Tests)
runner.run(suite())
我應該更改為:
something = Tests
suite = loader.loadTestsFromTestCase(something)
runner.run(suite())
但是另一件事是,我必須完全重建它才能正常工作開始時:從上一類的super繼承__ __ __________是愚蠢的,因為以前我沒有訪問該類的權限...所以我無法訪問我的變量。 所以我改變了:
class SubClass(SupClass):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
與:
class SubClass(SupClass):
def __init__(self, *args, **kwargs):
super(SubClass, self).setUpClass(*args, **kwargs)
然后我知道從unittest.TestCase __ __ __繼承是不可能的。 想像發生了什么...
我開始測試用例的新方法:
something = Tests
它正在創建一個新的錯誤...說我必須使用Tests(),但是當我使用這種形式時,我又遇到了以前的錯誤,所以兩種方法都不好。 所以我剛剛創建了帶有變量的類,但是沒有__ init __並且沒有super()
class Something(StartInstance):
a = thing1
b = thing2
c = thing3
我寫這封信是因為也許將來有人會嘗試將__ init __與unittest一起使用...這不起作用...或者我只是沒有找到解決方案,但我是新手:P
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.