Ниже приводится мой каталог для автоматизации, который содержит три файла. Я пытаюсь запустить unittest файл test_page.py, импортировав Base.py. Base.py содержит настройки браузера и сбрасывает его, он принимает аргументы пользователя (браузер, имя пользователя и пароль) и регистрируется на сайте. Но когда я запускаю test_page.py, я получаю некоторые ошибки. Проблема в том, что мне нужно получить экземпляр браузера из Base.py, который я не могу. Я попытался присвоить браузеру() браузеру переменной, но открывает новый экземпляр. Мне нужно использовать тот же экземпляр браузера, который использует 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)
Вы вызываете 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
. Test 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()
а затем вызовите ваш unit тест с помощью простого python test_page.py
(никаких аргументов не требуется).
Когда вы запускаете prod, вы можете вызвать Base.py
с аргументами, например Base.py chrome username password
. Обычно люди не проверяют свою логику argparse слишком тщательно, если вообще: поскольку именно квантовая физика не передает аргументы существующим классам/функциям.
Обратите внимание, что ваш первоначальный тест создает несколько объектов браузера вместо того, чтобы использовать один и тот же. Вы, вероятно, этого не хотите.
Browser
, независимо от того, как вы передаете аргументы в ваш основной скрипт. Это позволит вам эффективно тестировать классBrowser
изолированно, не беспокоясь о «основном» методе и о том, как вы извлекаете аргументы из командной строки. Этот тип тестируемости также обеспечит лучшую локальность вашей программы (т.е. вы можете рассуждать о решениях локально, а не глобально)