Python: «__init__() принимает 2 позиционных аргумента, но 3 были переданы» с Webdriver, когда информация о локаторе элементов извлекается из отдельного файла

Я новичок в Python и Selenium и пытаюсь запустить автоматическое тестирование нашего веб-сайта. Я настраиваю тесты с использованием объектной модели страницы, чтобы изменения в локаторах нужно было обновлять только в одном месте. В рамках этого я настраиваю функцию, которая будет ждать, пока наша кнопка подписки станет доступной. Однако, когда я вызываю эту функцию, я получаю следующую ошибку:

Traceback (most recent call last):
File "click_subscribe_button_test.py", line 51, in test_subscribe_click
main_page.wait_subscribe_button_clickable()
File "page.py", line 64, in wait_subscribe_button_clickable
wait.until(EC.element_to_be_clickable((*MainPageLocators.subscribe_button)))
TypeError: __init__() takes 2 positional arguments but 3 were given

Я прочитал ряд связанных сообщений здесь и на других сайтах, и хотя они помогли мне приблизиться к решению проблемы, я все еще сталкиваюсь с указанной выше ошибкой. Соответствующий код приведен ниже, он из двух отдельных файлов, поскольку локаторы находятся в другом файле, чем объекты страницы.

page.py

def wait_subscribe_button_clickable(self):
    subscribeElement =  self.driver.find_element(*MainPageLocators.subscribe_button)
    wait = WebDriverWait(self.driver,20)
    wait.until(EC.element_to_be_clickable((*MainPageLocators.subscribe_button)))

locators.py

class MainPageLocators (object):
    subscribe_button = (By.CSS_SELECTOR, 'li.last.leaf.subscribe')

Проблема, похоже, в том, как я вытаскиваю локаторы из отдельного файла, так как если я изменю

wait.until(EC.element_to_be_clickable((*MainPageLocators.subscribe_button)))

to

wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'li.last.leaf.subscribe')))

Код работает как задумано.

Возможно, я чего-то не понимаю в том, как функция *MainPageLocators.subscribe_button извлекает локаторы, но я не смог отследить, что не так.

Любая помощь или руководство будет принята с благодарностью.


person wappowers    schedule 13.06.2016    source источник


Ответы (1)


Просто вообще не распаковывайте локатор, передайте его как есть, как кортеж:

wait.until(EC.element_to_be_clickable(MainPageLocators.subscribe_button))
person alecxe    schedule 13.06.2016
comment
Спасибо! Это отлично сработало. Также указывает мне на следующую область, о которой нужно узнать. Я ценю помощь. - person wappowers; 13.06.2016