为什么selenium-webdriver(LiveServerTestCase)仍然指向错误的数据库?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么selenium-webdriver(LiveServerTestCase)仍然指向错误的数据库?相关的知识,希望对你有一定的参考价值。

我正在使用Selenium为Django应用程序运行一些集成测试(对于开发数据库使用postgres

我通过创建Model对象来设置测试。然后,测试将通过浏览器(selenium-webdriver)或直接通过数据库查询与对象进行交互。

使用webdriver的测试无法访问Model对象。数据库查询即可。

我得出的结论是webdriver没有指向正确的数据库。

我曾尝试使用LiveServerTestCase来明确为其提供要使用的端口和URL(localhost:8001),并使用live_server_url使其自行决定。都没有用。

这里是正在测试的表单-这是从对象列表中进行的简单选择。

forms.py


class FooForm(form.Form):
    foo = forms.ModelChoice.Field(
                required=False,
                label='select',
                queryset=Foo.objects.all(),
                widget=forms.Select(),
                )

这是数据库设置。

settings.py

DATABASES = 
        'default':
                'ENGINE': 'django.db.backends.postgresql_psycopg2',
                'NAME': 'app',
                'USER': 'user',
                'PASSWORD': 'password',
                'HOST': 'localhost',
                'PORT': '',
                
              

这里是测试。

test.py

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.select import Select
from django.test import LiveServerTestCase
from app.models import Foo

class BasicTestCase(LiveServerTestCase):
    def setUp(self):
        foo = Foo.objects.create(name='test_foo')
        self.selenium = webdriver.Firefox()
        super(BasicTestCase, self).setUp()

    def tearDown(self):
        self.selenium.quit()
        super(BasicTestCase, self).tearDown()

    def test_can_interact_via_db_query(self):
        self.assertEqual(Foo.objects.get(id=1).name, 'test_foo')

    def test_can_interact_via_webdriver_query(self):
        self.selenium.get('%s%s' %(self.live_server_url, '/page/'))
        elem = Select(self.selenium.find_element_by_id('id_foo'))
        foo_name = elem.select_by_index(0)
        self.assertEqual(foo_name, 'test_foo')

我希望这两项测试都能通过。

我可以看到浏览器正在打开并且正在与页面进行交互。

[test_can_interact_via_db_query通过。

[test_can_interact_via_webdriver_query失败,出现断言错误None != test_foo

答案

我从根本上误解了Select对象在这里发生的事情。我只是在选择项目,而不是询问它。不涉及数据库问题。

这里是测试的粗略工作版本

def test_can_interact_via_webdriver_query(self):
        self.selenium.get('%s%s' %(self.live_server_url, '/page/'))
        elem = Select(self.selenium.find_element_by_id('id_foo'))
        things = [o.text for o in elem.options]
        found = False
        for thing in things:
            if thing == 'test_foo':
                found = True

        self.assertTrue(found)

以上是关于为什么selenium-webdriver(LiveServerTestCase)仍然指向错误的数据库?的主要内容,如果未能解决你的问题,请参考以下文章

Selenium-Webdriver:找到元素后获取属性

使用 selenium-webdriver/firefox (NodeJS) 设置 userAgent

如何修复 selenium-webdriver 错误 - $ 未定义?

Selenium-Webdriver (Java) 无法始终执行“悬停和单击”功能

如何在 selenium-webdriver 中为 phantomjs 驱动程序设置一个用户代理?

selenium-webdriver自动化测试工具