Selenium - visibility_of_element_located: __init__() 需要2个参数(给了3个)

10 投票
1 回答
21137 浏览
提问于 2025-04-18 06:34

我在使用Selenium的Python绑定进行测试时遇到了这个错误:

>           twitter_campaigns = wait.until(EC.visibility_of_element_located(By.CSS_SELECTOR, TWITTER_CAMPAIGNS))
E           TypeError: __init__() takes exactly 2 arguments (3 given)

这是我执行的代码:

class TestTwitter(TestLogin, TestBuying):

    def setup(self, timeout=10):
        self.driver = webdriver.Firefox()
        self.driver.get(BASEURL)
        self.driver.implicitly_wait(timeout)

    def test_campaigns_loaded(self, timeout=10):
        self.signin_action()
        self.view_twitter_dashboard()
        self.select_brand()
        wait = WebDriverWait(self.driver, timeout)
        twitter_campaigns = wait.until(EC.visibility_of_element_located(By.CSS_SELECTOR, TWITTER_CAMPAIGNS))
        assert True == twitter_campaigns

    def teardown(self):
        self.driver.close()

所以我在想,为什么我会遇到上面的错误?在我所有的类里,我没有定义__init__()方法,而是按照pytest的要求定义了setUp和tearDown方法。有人知道为什么会需要三个参数吗?

1 个回答

29

你应该问的问题不是“为什么要传3个参数”,而是“是什么东西要传3个参数”。你的错误信息指向了代码中的一行,问题就出在那一行。

根据Selenium Python的文档,selenium.webdriver.support.expected_conditions.visibility_of_element_located应该用一个元组来调用;它不是一个函数,而是一个类,它的初始化器除了隐含的self之外,只需要1个参数:

class visibility_of_element_located(object):
   # ...
   def __init__(self, locator):
       # ...

所以,你需要用两个嵌套的括号来调用visibility_of_element_located

wait.until(EC.visibility_of_element_located( ( By.CSS_SELECTOR, TWITTER_CAMPAIGNS ) ))

这意味着,visibility_of_element_located.__init__只会接收预期的两个参数:隐含的self和定位器:一个(类型, 表达式)的元组,而不是3个参数selfBy.CSS_SELECTORTWITTER_CAMPAIGNS

撰写回答