Selenium - visibility_of_element_located:__ init __()只需2个参数(给定3个)

时间:2014-05-14 17:53:45

标签: python selenium selenium-webdriver pytest

我在使用Selenium Python Bindings的测试代码中收到此错误:

>           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__()方法的所有类中,我将setUp和tearDown方法定义为pytest跟随。任何想法为什么要采取3 args?

1 个答案:

答案 0 :(得分:21)

你应该问的问题是"为什么它采取3 args",但" 什么正在采取3 args&# 34 ;.您的回溯是指代码中非常具体的一行,它存在问题所在。

根据此处的Selenium Python文档,应使用元组调用selenium.webdriver.support.expected_conditions.visibility_of_element_located;它不是一个函数,而是一个实际的类,其初始值设定项只需要1个超出隐式self的参数:

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 ) ))

这意味着代替3个参数selfBy.CSS_SELECTORTWITTER_CAMPAIGNSvisibility_of_element_located.__init__将使用预期的2个参数调用:隐式self和定位器:(type, expression)元组。