Selenium - visibility_of_element_located: __init__() takes exactly 2 arguments (3 given)
I am getting this error in my test code that uses 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)
And this is what Im executing:
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()
So I'm wondering Why Im getting the above errors, on all the classes I haven't defined an __init__()
method instead I defined a setUp and tearDown methods as pytest follow. Any ideas why is taking 3 args?
The question you should be asking is not "why is it taking 3 args", but "what is taking 3 args". Your traceback refers to a very specific line in code, and it is there where the problem lies.
According to the Selenium Python docs here, the selenium.webdriver.support.expected_conditions.visibility_of_element_located
should be called with a tuple; it is not a function, but actually a class, whose initializer expects just 1 argument beyond the implicit self
:
class visibility_of_element_located(object):
# ...
def __init__(self, locator):
# ...
Thus, you need to call the visibility_of_element_located
with two nested parentheses:
wait.until(EC.visibility_of_element_located( ( By.CSS_SELECTOR, TWITTER_CAMPAIGNS ) ))
Which means that instead of 3 arguments self
, By.CSS_SELECTOR
and TWITTER_CAMPAIGNS
, the visibility_of_element_located.__init__
will be invoked with just expected 2 arguments: the implicit self
and the locator: a (type, expression)
tuple.