Невозможно вызвать метод в другом классе

#python #selenium

#python #селен

Вопрос:

Вот объектный файл страницы: login.py

 from pages.base import BasePage
from config import secrets
from selenium.webdriver.common.keys import Keys

class LoginPage(BasePage):

    def __init__(self):
        self.webdriver = BasePage.webdriver
        port = raw_input("Enter port number: ")
        self.url = "http://localhost:"   port

    @property
    def retrieve_username_field(self):
        self.webdriver.find_element_by_name("username")

    @property
    def retrieve_password_field(self):
        self.webdriver.find_element_by_name("password")

    def login(self, username=None, password=None):
        username = username or secrets.username
        password = password or secrets.password
        self.retrieve_username_field.send_keys(username)
        self.retrieve_password_field.send_keys(password)
        self.retrieve_password_field.send_keys(Keys.RETURN)
  

Вот файл базовой страницы: base.py

 from selenium import webdriver

class BasePage(object):
    webdriver = webdriver.Firefox()

    def go(self):
        self.webdriver.get(self.url)
  

Вот тестовый файл: test_login.py

 import unittest

from pages.login import LoginPage

login_page = LoginPage()

def setUpModule():
    login_page.go()

def tearUpModule():
    login_page.logout()


class TestLogin(unittest.TestCase):

    def test_login_succeeds_with_valid_credentials(self):
        login_page.login()
        xpath = "//th[text() = 'Spool Name']"
        self.assertIsNotNone(login_page.webdriver.find_element_by_xpath(xpath))



if __name__ == "__main__":
    unittest.main()
  

Проблема в том, что я получаю эту ошибку: http://puu.sh/9JgRd/e61f5acec3.png и я не уверен, почему я не могу вызвать метод login . У меня есть ссылка на объект LoginPage, но сбой происходит именно здесь.

Ответ №1:

Ваша проблема не в том, что вы не можете вызвать login() , а в том, что self.retrieve_username_field он возвращает None и, следовательно, не имеет send_keys метода. Это именно то, о чем говорит ошибка, которую вы получаете.

Комментарии:

1. Хорошо, но что тогда не так с кодом? Я вставил операторы печати, и webdriver.current_url возвращает правильный URL. print self.webdriver возвращает объект, а не None. И метод правильный, потому что он выдает ошибку несуществующего метода. Кроме того, имя поля ввода является правильным. Я добавил неявное ожидание, но оно не работает, оно немедленно возвращает эту ошибку, даже если неявное ожидание предшествует вызову свойства.

2. Omg … забыл возврат: D