如何将 django 测试的数据库与 Selenium 一起使用?
How to use the django test's database with Selenium?
我正在使用 Django TestCase class 测试我的 Django 应用程序。对于单元测试和集成测试,我没有遇到数据库 django create then destroy for the tests 的问题。但现在我想用硒做一些功能测试。问题是硒似乎无法访问数据库。这是我测试的测试代码:
class HostTest(LiveServerTestCase, TestCase):
def setUp(self):
self.driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
# Setting up temporary test database
# Setting up products
self.product1 = Product.objects.create(
id=1,
name="apple",
url="apple_url",
nutriscore="A",
img_url="apple_img_url",
kcal=101,
fat=201,
protein=301,
sugar=401,
)
def tearDown(self):
self.driver.close()
def test_new_user_reserach_and_add_favorite(self):
driver = self.driver
driver.get(self.live_server_url)
self.assertIn("Accueil", driver.title)
search_bar = driver.find_element_by_name("product_searched")
search_bar.send_keys("apple")
search_bar.send_keys(Keys.ENTER)
self.assertIn("Recherche", driver.title)
product = driver.find_element_by_class_name('product-presentation')
为此我在最后一行有一个错误,错误很长但它基本上告诉我硒找不到元素。我尝试在测试中打印 product1 并且它有效。这就是为什么我很确定问题出在 Selenium 上。
这是我的观点的代码:
def product_research(request):
no_repetition_result = []
vectors = SearchVector('name', weight='A') + SearchVector('category__name', weight='B')
query = SearchQuery(f'{request.GET.get("product_searched")}')
research_result = Product.objects.annotate(rank=SearchRank(vectors, query)).order_by('-rank')
for product in research_result:
if product not in no_repetition_result:
no_repetition_result.append(product)
context = {
"results": no_repetition_result,
}
request.session['research_parameter'] = request.GET.get("product_searched")
return render(request, 'main_site/product_research.html', context)
并且 html 代码用于使产品出现在我的网页上:
<div class="row">
{% for product in results %}
<div class="col-12 col-sm-6 col-lg-4"
<div class="row justify-content-center mb-5">
<a class="col product-presentation text-center" href="{% url 'main_site:product' product.id %}">
<img class="substitution-product-img" src="{{ product.img_url }}">
</a>
</div>
</div>
{% endfor %}
</div>
注意:我在测试时查看selenium打开页面的代码,没有看到任何产品。
勾选这个answer
这与您面临的问题相同,并且有清晰的解释。
我正在使用 Django TestCase class 测试我的 Django 应用程序。对于单元测试和集成测试,我没有遇到数据库 django create then destroy for the tests 的问题。但现在我想用硒做一些功能测试。问题是硒似乎无法访问数据库。这是我测试的测试代码:
class HostTest(LiveServerTestCase, TestCase):
def setUp(self):
self.driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
# Setting up temporary test database
# Setting up products
self.product1 = Product.objects.create(
id=1,
name="apple",
url="apple_url",
nutriscore="A",
img_url="apple_img_url",
kcal=101,
fat=201,
protein=301,
sugar=401,
)
def tearDown(self):
self.driver.close()
def test_new_user_reserach_and_add_favorite(self):
driver = self.driver
driver.get(self.live_server_url)
self.assertIn("Accueil", driver.title)
search_bar = driver.find_element_by_name("product_searched")
search_bar.send_keys("apple")
search_bar.send_keys(Keys.ENTER)
self.assertIn("Recherche", driver.title)
product = driver.find_element_by_class_name('product-presentation')
为此我在最后一行有一个错误,错误很长但它基本上告诉我硒找不到元素。我尝试在测试中打印 product1 并且它有效。这就是为什么我很确定问题出在 Selenium 上。
这是我的观点的代码:
def product_research(request):
no_repetition_result = []
vectors = SearchVector('name', weight='A') + SearchVector('category__name', weight='B')
query = SearchQuery(f'{request.GET.get("product_searched")}')
research_result = Product.objects.annotate(rank=SearchRank(vectors, query)).order_by('-rank')
for product in research_result:
if product not in no_repetition_result:
no_repetition_result.append(product)
context = {
"results": no_repetition_result,
}
request.session['research_parameter'] = request.GET.get("product_searched")
return render(request, 'main_site/product_research.html', context)
并且 html 代码用于使产品出现在我的网页上:
<div class="row">
{% for product in results %}
<div class="col-12 col-sm-6 col-lg-4"
<div class="row justify-content-center mb-5">
<a class="col product-presentation text-center" href="{% url 'main_site:product' product.id %}">
<img class="substitution-product-img" src="{{ product.img_url }}">
</a>
</div>
</div>
{% endfor %}
</div>
注意:我在测试时查看selenium打开页面的代码,没有看到任何产品。
勾选这个answer
这与您面临的问题相同,并且有清晰的解释。