如何与Selenium一起进行多浏览器测试Django以减少代码?

问题描述 投票:0回答:1

我在 Django 中安装了 pytest-djangoselenium,如下所示。

pip install pytest-django && pip install selenium

然后,我在test.py文件夹中创建了

pytest.ini
__init__.py
tests
(空文件),如下所示:

django-project
 |-core
 |  └-settings.py
 |-my_app1
 |-my_app2
 |-pytest.ini
 └-tests
    |-__init__.py
    └-test.py

然后,我将下面的代码设置为

pytest.ini

# "pytest.ini"

[pytest]
DJANGO_SETTINGS_MODULE = core.settings
testpaths = tests

最后,我可以使用多个浏览器 Google Chrome、Microsoft Edge 和 Firefox 分别测试 Django(Admin),但不能与 Selenium 一起测试,如下所示,因此代码很多:

# "tests/test.py"

import pytest
from selenium import webdriver
from django.test import LiveServerTestCase

""" Google Chrome Test Begin """

@pytest.fixture(scope="class")
def chrome_driver_init(request):
    chrome_driver = webdriver.Chrome()
    request.cls.driver = chrome_driver
    yield
    chrome_driver.close()

@pytest.mark.usefixtures("chrome_driver_init")
class Test_URL_Chrome(LiveServerTestCase):
    def test_open_url(self):
        self.driver.get(("%s%s" % (self.live_server_url, "/admin/")))
        assert "Log in | Django site admin" in self.driver.title

""" Google Chrome Test End """

""" Microsoft Edge Test Begin """

@pytest.fixture(scope="class")
def edge_driver_init(request):
    edge_driver = webdriver.Edge()
    request.cls.driver = edge_driver
    yield
    edge_driver.close()

@pytest.mark.usefixtures("edge_driver_init")
class Test_URL_Edge(LiveServerTestCase):
    def test_open_url(self):
        self.driver.get(("%s%s" % (self.live_server_url, "/admin/")))
        assert "Log in | Django site admin" in self.driver.title

""" Microsoft Edge Test End """

""" Firefox Test Begin """

@pytest.fixture(scope="class")
def firefox_driver_init(request):
    firefox_driver = webdriver.Firefox()
    request.cls.driver = firefox_driver
    yield
    firefox_driver.close()

@pytest.mark.usefixtures("firefox_driver_init")
class Test_URL_Firefox(LiveServerTestCase):
    def test_open_url(self):
        self.driver.get(("%s%s" % (self.live_server_url, "/admin/")))
        assert "Log in | Django site admin" in self.driver.title

""" Firefox Test End """

那么,如何与 Selenium 一起使用多个浏览器测试 Django 以减少代码量?

python django selenium-webdriver browser pytest-django
1个回答
0
投票

您可以使用 Google Chrome、Microsoft Edge 和 Firefox 等多种浏览器与 Selenium 一起测试 Django (Admin),以减少代码,如下所示。 *我的回答解释了如何使用多个无头浏览器Google Chrome、Microsoft Edge和Firefox以及Selenium来测试Django(管理员)以减少代码,如下所示:

# "tests/test.py"

import pytest
from selenium import webdriver

@pytest.fixture(params=["chrome", "edge", "firefox"], scope="class")
def browser_driver_init(request):
    if request.param == "chrome":
        web_driver = webdriver.Chrome()
    if request.param == "edge":
        web_driver = webdriver.Edge()
    if request.param == "firefox":
        web_driver = webdriver.Firefox()
    request.cls.driver = web_driver
    yield
    web_driver.close()

@pytest.mark.usefixtures("browser_driver_init")
class Test_URL_Browser:
    def test_open_url(self, live_server):
        self.driver.get(("%s%s" % (live_server.url, "/admin/")))
        assert "Log in | Django site admin" in self.driver.title

并且,您还可以使用conftest.py,如下所示:

django-project
 |-core
 |  └-settings.py
 |-my_app1
 |-my_app2
 |-pytest.ini
 └-tests
    |-__init__.py
    |-conftest.py # Here
    └-test.py
# "tests/conftest.py"

import pytest
from selenium import webdriver

@pytest.fixture(params=["chrome", "edge", "firefox"], scope="class")
def browser_driver_init(request):
    if request.param == "chrome":
        web_driver = webdriver.Chrome()
    if request.param == "edge":
        web_driver = webdriver.Edge(options=options)
    if request.param == "firefox":
        web_driver = webdriver.Firefox()
    request.cls.driver = web_driver
    yield
    web_driver.close()
# "tests/test.py"

import pytest

@pytest.mark.usefixtures("browser_driver_init")
class Test_URL_Browser:
    def test_open_url(self, live_server):
        self.driver.get(("%s%s" % (live_server.url, "/admin/")))
        assert "Log in | Django site admin" in self.driver.title
© www.soinside.com 2019 - 2024. All rights reserved.