Introduction to functional testing with Selenium in Django

本文将介绍如何使用Selenium自动化测试Django Web应用,包括Selenium的基本概念、安装、简单示例和Django应用的测试案例。

https://agiliq.com/blog/2014/09/using-postman/


In this tutorial we will learn what selenium is and how it can be used in writing functional tests for our Django projects.

What is Selenium?

Selenium is a Web Browser automation tool, which basically means you can use it to surf web programmatically on real web browsers. But mostly selenium is used for testing web applications. It has packages for most programming languages. For python, we can try selenium by installing its package:

pip install selenium

For a quick demo, we will open Django Documentation website, perform some search and check the first result. Save and run the following script:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Firefox()
driver.maximize_window()
driver.get("https://docs.djangoproject.com/")
search_box = driver.find_element_by_name("q")
search_box.send_keys("testing")
search_box.send_keys(Keys.RETURN)
assert "Search" in driver.title
# Locate first result in page using css selectors.
result = driver.find_element_by_css_selector("div#search-results a")
result.click()
assert "testing" in driver.title.lower()
driver.quit()

Most of the code is self explanatory. It checks for the search box on the page, enter the search term and hit return key. Then it clicks on the first result and do an assert. Keys class is used for keyboard simulation and can also be used to enter special keys(we used RETURN key in example to submit form).

Selenium provide many methods to locate an element on a page:

  • find_element_by_id
  • find_element_by_name
  • find_element_by_tag_name
  • find_element_by_xpath
  • find_element_by_link_text
  • find_element_by_partial_link_text
  • find_element_by_class_name
  • find_element_by_css_selector

If multiple matches are found for a query then it returns the first match(note how we used css selector to find first result in above example). You can also find multiple elements with a given logic by similar methods. For example to locate all the links on the page you can do:

all_links = driver.find_elements_by_tag_name("a") # note the 's' in find_elements

Each element is an object of WebElement class and have many methods associated with it. Most commonly used are:

  • click - perform a mouse click on element
  • text - gets the text of the element
  • location - Returns the location of the element in the renderable canvas
  • is_displayed - Whether the element would be visible to a user
  • get_attribute(name) - Gets the attribute value.

There are several more. You can read about them at the Selenium Python docs.

Testing Django Web application

We will setup a minimal Django project with just admin activated:

pip install Django==1.6.6 selenium
django-admin.py startproject myproject
cd myproject
python manage.py syncdb --noinput

Note:

Django 1.6 onwards, admin is activated in urls.py. If you are using django<1.6, you should add the admin urls.

Now we will write a test to create a user in Django admin. Add a file test.py with following code:

from django.test import LiveServerTestCase
from django.contrib.auth.models import User

from selenium import webdriver

class AdminTestCase(LiveServerTestCase):
    def setUp(self):
        # setUp is where you instantiate the selenium webdriver and loads the browser.
        User.objects.create_superuser(
            username='admin',
            password='admin',
            email='admin@example.com'
        )

        self.selenium = webdriver.Firefox()
        self.selenium.maximize_window()
        super(AdminTestCase, self).setUp()

    def tearDown(self):
        # Call tearDown to close the web browser
        self.selenium.quit()
        super(AdminTestCase, self).tearDown()

    def test_create_user(self):
        """
        Django admin create user test
        This test will create a user in django admin and assert that
        page is redirected to the new user change form.
        """
        # Open the django admin page.
        # DjangoLiveServerTestCase provides a live server url attribute
        # to access the base url in tests
        self.selenium.get(
            '%s%s' % (self.live_server_url,  "/admin/")
        )

        # Fill login information of admin
        username = self.selenium.find_element_by_id("id_username")
        username.send_keys("admin")
        password = self.selenium.find_element_by_id("id_password")
        password.send_keys("admin")

        # Locate Login button and click it
        self.selenium.find_element_by_xpath('//input[@value="Log in"]').click()
        self.selenium.get(
            '%s%s' % (self.live_server_url, "/admin/auth/user/add/")
        )

        # Fill the create user form with username and password
        self.selenium.find_element_by_id("id_username").send_keys("test")
        self.selenium.find_element_by_id("id_password1").send_keys("test")
        self.selenium.find_element_by_id("id_password2").send_keys("test")

        # Forms can be submitted directly by calling its method submit
        self.selenium.find_element_by_id("user_form").submit()
        self.assertIn("Change user", self.selenium.title)

Django LiveServerTestCase is extended from TransactionTestCase class. It launches a Django server(on port 8081) in the background on setup and shuts it down on teardown. Note in the code above we are instantiating the selenium webdriver in the setUp method and call quit on it in tearDown. We can get the server url from live_server_url attribute provided by TestCase.

Now just run the test command:

python manage.py test

You will see a firefox browser opens and run the test. This is a very simple example but you can use selenium to check every major functionality of your website.

We will cover some advanced functionality like testing javascript heavy site and running tests on travis, Sauce, BrowserStack in our next post. Meanwhile read more about selenium at the Python selenium docs here(unofficial but good for beginners) and here(official). Happy Testing


根据原作 https://pan.quark.cn/s/0ed355622f0f 的源码改编 野火IM解决方案 野火IM是专业级即时通讯和实时音视频整体解决方案,由北京野火无限网络科技有限公司维护和支持。 主要特性有:私有部署安全可靠,性能强大,功能齐全,全平台支持,开源率高,部署运维简单,二次开发友好,方便与第三方系统对接或者嵌入现有系统中。 详细情况请参考在线文档。 主要包括一下项目: 野火IM Vue Electron Demo,演示如何将野火IM的能力集成到Vue Electron项目。 前置说明 本项目所使用的是需要付费的,价格请参考费用详情 支持试用,具体请看试用说明 本项目默认只能连接到官方服务,购买或申请试用之后,替换,即可连到自行部署的服务 分支说明 :基于开发,是未来的开发重心 :基于开发,进入维护模式,不再开发新功能,鉴于已经终止支持且不再维护,建议客户升级到版本 环境依赖 mac系统 最新版本的Xcode nodejs v18.19.0 npm v10.2.3 python 2.7.x git npm install -g node-gyp@8.3.0 windows系统 nodejs v18.19.0 python 2.7.x git npm 6.14.15 npm install --global --vs2019 --production windows-build-tools 本步安装windows开发环境的安装内容较多,如果网络情况不好可能需要等较长时间,选择早上网络较好时安装是个好的选择 或参考手动安装 windows-build-tools进行安装 npm install -g node-gyp@8.3.0 linux系统 nodej...
### 结合使用SeleniumDjango进行测试 为了有效结合SeleniumDjango用于Web应用的自动化测试,可以创建一个基于Django项目的测试套件。这不仅有助于验证前端交互逻辑,还能确保整个应用程序的功能正常运作。 #### 创建Django项目并配置Selenium环境 首先,在命令行环境中初始化一个新的Django项目: ```bash django-admin startproject testplatform ``` 安装必要的依赖库,包括`selenium`包和其他可能需要的支持软件如ChromeDriver[^3]。 #### 编写功能测试案例 在Django中编写涉及浏览器操作的功能测试时,通常会扩展自`LiveServerTestCase`类。此类启动了一个临时运行的应用服务器实例供Selenium驱动的真实浏览器访问。下面是一个简单的例子展示如何实现这一点: ```python from django.test import LiveServerTestCase from selenium import webdriver from selenium.webdriver.common.keys import Keys class AdminTest(LiveServerTestCase): def setUp(self): self.browser = webdriver.Chrome() def tearDown(self): self.browser.quit() def test_can_create_new_poll_via_admin_site(self): # 测试管理员登录页面加载成功 self.browser.get(self.live_server_url + '/admin/') body = self.browser.find_element_by_tag_name('body') assert 'Log in' in body.text, "Admin login page did not load correctly" # 输入用户名密码提交表单... ``` 这段代码展示了基本结构——设置阶段打开浏览器;清理阶段关闭它;实际测试函数则模拟用户行为并与网页元素互动以完成特定的任务验证[^4]。 通过这种方式,能够全面覆盖从前端到后端的各种场景,从而提高整体系统的健壮性和用户体验质量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值