Ошибка атрибута модульного теста при импорте модуля и его использовании - PullRequest
0 голосов
/ 22 сентября 2018

Ниже приведен мой каталог для автоматизации, который содержит три файла, я пытаюсь запустить файл unittest test_page.py, импортировав Base.py.Base.py содержит настройки браузера и демонтажа, он принимает пользовательские аргументы (браузер, имя пользователя и пароль) и входит на сайт.Но когда я запускаю test_page.py, я получаю некоторые ошибки.Проблема в том, что мне нужно получить экземпляр браузера из Base.py, который я не могу.Я попытался присвоить Browser (). Browser переменной, но это открывает новый экземпляр.Мне нужно использовать тот же экземпляр браузера, что и Base.py.

    Automation
       __init__.py
         Base.py
         test_page.py

Base.py

        import sys
        import argparse
        from selenium import webdriver
        import datetime

        parser = argparse.ArgumentParser()
        parser.add_argument('browser', default='chrome', help='Types of browser:chrome, firefox, ie')
        parser.add_argument('username', help='This is the  username')
        parser.add_argument('password', help='This is the  password')
        args = parser.parse_args()

        setup_parameters = sys.argv[1:]


        class Browser(object):

            url = 'https:someurl'
            start_time = datetime.datetime.today()


            def __init__(self):
                self.username = setup_parameters[1]
                self.password = setup_parameters[2]
                if setup_parameters[0] == 'chrome':
                    self.browser = webdriver.Chrome('C:\Python37\chromedriver.exe')
                    print("Running tests on Chrome browser on %s" % self.start_time)


                elif setup_parameters[0] == 'ie':
                    self.browser = webdriver.Ie()
                    print("Running tests on Internet Explorer browser on %s" % self.start_time)


                elif setup_parameters[0] == 'firefox':
                    self.browser = webdriver.Firefox()
                    print("Running tests on Firefox browser on %s" % self.start_time)


                elif setup_parameters[0] == 'None':
                    print('No browser type specified.... continuing with the default browser')
                    self.browser = webdriver.Chrome()

            def login(self):
                # Method used to log in to the site
                self.browser.get(self.url)
                self.browser.implicitly_wait(10)
                self.browser.maximize_window()
                self.browser.find_element_by_id("Username").send_keys(self.username)
                self.browser.find_element_by_id("Password").send_keys(self.password)
                self.browser.find_element_by_id("btnLogin").click()

            def close(self):
                # Closing the browser window and terminating the test
                self.browser.close()
                print("Test(s) ended on {} at {}".format(setup_parameters[0], datetime.datetime.today()))


        if __name__ == '__main__':
            Browser().login()
            Browser().close()

test_page.py

    from unittest import TestSuite
    from unittest import TestCase
    from selenium import webdriver
    import time
    import sys
    import Base
    from Base import Browser

    class TestHomePage(unittest.TestCase):

        def setUp(self):
            self.driver = Browser().browser
            self.login = Browser().login()

        def test_links(self):
            self.driver.find_elements_by_link_text('click this link').click()

        def tearDown(self):
            self.close = Browser().close()


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

    When I run test_page.py, I get the following error

    C:\Users\Projects\PortalAutomation>python test_page.py chrome username password

    EEE
    ======================================================================
    ERROR: chrome (unittest.loader._FailedTest)
    ----------------------------------------------------------------------
    AttributeError: module '__main__' has no attribute 'chrome'

    ======================================================================
    ERROR: 1EADMIN (unittest.loader._FailedTest)
    ----------------------------------------------------------------------
    AttributeError: module '__main__' has no attribute 'username'

    ======================================================================
    ERROR: password1 (unittest.loader._FailedTest)
    ----------------------------------------------------------------------
    AttributeError: module '__main__' has no attribute 'password'

    ----------------------------------------------------------------------
    Ran 3 tests in 0.000s

    FAILED (errors=3)

1 Ответ

0 голосов
/ 22 сентября 2018

Вы звоните argparse в вашем файле Base.py.Не делай этого.Переместите эти строки в другой файл или оберните их в if __name__ == __main__:

if __name__ == __main__
    parser = argparse.ArgumentParser()
    parser.add_argument('browser', default='chrome', help='Types of browser:chrome, firefox, ie')
    parser.add_argument('username', help='This is the  username')
    parser.add_argument('password', help='This is the  password')
    args = parser.parse_args()

Если вы не поместите эти строки в другой файл или внутри if __name__ == "__main__", этот разделкода будет запускаться при импорте , а не при вызове test_page.py из командной строки.

Вы также не хотите использовать argparse в сочетании с unittest.Протестируйте Base.py, используя unittest, и настройте аргументы, которые вам могут понадобиться для класса в setUp.Я рекомендую вам передать username и password в конструктор вашего Browser объекта, чтобы вы могли легко написать тест, который использует постоянное имя пользователя / pw.Вы можете сделать это следующим образом:

class Browser(object):

    url = 'https:someurl'
    start_time = datetime.datetime.today()

    def __init__(self, driver, username, password):
        self.driver = driver
        self.username = username
        self.password = password
        if self.driver == 'chrome':
        ...

, затем вы можете написать такой тест:

def setUp(self):
    browser_obj = Browser('chrome', 'some_username', 'some_password')
    self.driver = browser_obj.browser
    self.login = browser_obj.login()

def test_links(self):
    self.driver.find_elements_by_link_text('click this link').click()

def tearDown(self):
    browser_obj.close()

, а затем вызвать свой модульный тест с помощью простого python test_page.py (аргументы не требуются).

Когда вы запускаете в prod, вы можете вызвать Base.py с аргументами, например Base.py chrome username password.Обычно люди не слишком тщательно проверяют свою логику argparse, если вообще не передают аргументы существующим классам / функциям.

Обратите внимание, что ваш первоначальный тест создает несколько объектов браузера вместо использованиятот самый.Вы, вероятно, не хотите этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...