Я новичок в программировании. Я делаю веб-приложение в python с базой данных mongodb, используя mongoengine. Обработка выполняется в функциях маршрута. Я получаю данные из файлов html через переменные form..data, проверяю данные и сохраняю их в базе данных. Как я могу сделать модульные тесты для проверки этих функций. Есть ли способ установить переменные в тестовой функции, чтобы дать значения для переменных form..data и запустить функции маршрута?
Это файл html, который поддерживается FlaskForm
<form method="POST" action="">
{{ form.hidden_tag() }}
<div class="content-section">
<fieldset class="form-group">
<legend class="border-bottom mb-4">Add new Product</legend>
<div class="row">
<div class='col-md-4'>
<div class="form-group">
{{ form.newproduct.label(class="form-control-label") }}
{{ form.newproduct(class="form-control form-control-lg") }}
</div>
</div>
<div class='col-md-2'>
<div class="form-group">
{{ form.pricepsmall.label(class="form-control-label") }}
{{ form.pricepsmall(class="form-control form-control-lg") }}
</div>
</div>
<div class='col-md-2'>
<div class="form-group">
{{ form.pricepmedium.label(class="form-control-label") }}
{{ form.pricepmedium(class="form-control form-control-lg") }}
</div>
</div>
<div class='col-md-2'>
<div class="form-group">
{{ form.priceplarge.label(class="form-control-label") }}
{{ form.priceplarge(class="form-control form-control-lg") }}
</div>
</div>
</div>
</fieldset>
<div class="form-group">
{{ form.submit(class="btn btn-outline-info") }}
</div>
</div>
</form>
Я провел модульный тест с использованием селена, который выглядит следующим образом:
class TestProductStore(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Chrome()
self.driver.implicitly_wait(60)
def tearDown(self):
self.driver.quit()
def test_form_addproduct(self):
self.driver.get('http://127.0.0.1:5000/addproduct')
newproduct_input = self.driver.find_element_by_name('form.newproduct')
pricepsmall_input = self.driver.find_element_by_name('form.pricepsmall')
pricepmedium_input = self.driver.find_element_by_name('form.pricepmedium')
priceplarge_input = self.driver.find_element_by_name('form.priceplarge')
# Populate inputs with dummy text
newproduct_input.send_keys('Rich Blend Teabag Carton')
pricepsmall_input.send_keys(15.0)
pricepmedium_input.sendkeys(18.0)
priceplarge_input.sendkeys(21.0)
# Find submit button and submit form by sending an "Enter" keypress
submit_button = self.driver.find_element_by_css_selector('.btn-outline-info')+
submit_button.send_keys(Keys.ENTER)
admin_url = self.driver.current_url
self.assertEqual(admin_url, 'http://localhost:5000/addproduct')
theproduct = Products.objects.get(product_desc='Rich Blend Teabag Carton')
self.assertEqual(theproduct.product_desc, 'Rich Blend Teabag Carton')
Я получаю сообщение об ошибке: selenium.common.exceptions.NoSuchElementException: Сообщение: нет такого элемента: невозможно найти элемент: {"method": "css selector", "selector": "[name =" form .newproduct "]"}
Я также пробовал тестировать без применения префиксов "form", например,
newproduct_input = self.driver.find_element_by_name('newproduct')
Также пытался найти по xpath
newproduct_input = self.driver.find_element_by_xpath('//*[@id="newproduct"]')
Но та же ошибка.
Любой синтаксис для обнаружения элементов формы будет очень полезен. Спасибо.