Selenium 浏览器测试

未匹配的标注
本文档最新版为 4.0,旧版本可能放弃维护,推荐阅读最新版!

Selenium 测试

介绍

Selenium测试是使用浏览器进行测试。通常单元测试用来针对JSON数据或者页面头部进行测试。

有了Selenium测试,你就可以测试诸如用户单击按钮或者表单提交中需要JS处理的测试场景。

有了Selenium测试,你可以操作浏览器一步步指令进行操作来进行测试。

该包已经包含了selenium驱动依赖,所以无需安装其他外部组件。

开始

安装

首先我们需要安装包:

$ pip install masonite-selenium

创建测试用例

该包继承自已有的测试框架,你可以为当前的单元测试增加测试用例。

让我们在Masonite安装完后为它创建一个TestCase

$ craft test HomePage

它将生成类似如下文件:

from masonite.testing import TestCase

class TestHomePage(TestCase):

    """All tests by default will run inside of a database transaction."""
    transactions = True

    def setUp(self):
        """Anytime you override the setUp method you must call the setUp method
        on the parent class like below.
        """
        super().setUp()

    def setUpFactories(self):
        """This runs when the test class first starts up.
        This does not run before every test case. Use this method to
        set your database up.
        """
        pass

构建测试用例

为了使用selenium进行测试,我们需要导入类到TestCase当中。

from masonite.testing import TestCase
from masonite.testing.selenium import SeleniumTestCase

class TestHomePage(TestCase, SeleniumTestCase):

    """All tests by default will run inside of a database transaction."""
    transactions = True

    def setUp(self):
        """Anytime you override the setUp method you must call the setUp method
        on the parent class like below.
        """
        super().setUp()

好了,我们现在拥有可用方法来进行selenium测试了。

使用浏览器

在我们开始构建测试用例时,我们需要指定所要使用的浏览器。目前有两个可选项:chromefirefox

你可用在setUp()方法内使用userBrowser()来定义所使用的浏览器。

from masonite.testing import TestCase
from masonite.testing.selenium import SeleniumTestCase

class TestHomePage(TestCase, SeleniumTestCase):

    """All tests by default will run inside of a database transaction."""
    transactions = True

    def setUp(self):
        """Anytime you override the setUp method you must call the setUp method
        on the parent class like below.
        """
        super().setUp()
        self.useBrowser('chrome', version='74')
        # self.useBrowser('firefox')

使用chrome驱动话还是定义使用的版本。

Headless

你还可以配置使用浏览器headless状态。它将不会实际在桌面跑起浏览器GUI程序,而是在后台执行。这种方式并不影响实际测试效果,却能让你的测试运行更快。

self.useBrowser('chrome', version='74', headless=True)

构建测试

以下是一个对刚装好的应用对主页的测试用例:

def test_can_see_homepage(self):
    (self.visit('/')
        .assertSee('Masonite 2.2'))

我们可以通过如下命令执行测试:

$ python -m pytest

方法调用链

你可以将所有的方法使用链式调用,来模仿用户操作。例如:

def test_can_login_to_pypi(self):
    (self.visit('https://pypi.org/')
        .clickLink('Log in')
        .assertSee('Log in to PyPI')
        .text('#username', 'josephmancuso')
        .text('#password', 'secret')
        .submit().assertCantSee('Your projects'))

选择器

可以使用一些符号来辅助选择元素。

例如下面表单:

<form action="/submit">
    <input id="username" type="text" name="username">
    <input id="password" type="password" name="password">

    <button type="submit">Submit</button>
</form>

通过ID选择

使用#符号来选择ID:

(self.visit('/form')
    .text('#username', 'user')
    .text('#password', 'secret')
    .submit())

通过Name选择

你可以直接传递名字,默认会使用name属性定位:

(self.visit('/form')
    .text('username', 'user')
    .text('password', 'secret')
    .submit())

通过Class选择

使用.进行类选择:

(self.visit('/form')
    .text('.username', 'user')
    .text('.password', 'secret')
    .submit())

通过自定义属性选择

使用ID或者名字选择器在它们变更了就会引发问题。我们还可以使用自定义属性来选择。

例如表单代码修改为:

<form action="/submit">
    <input selenium="username" type="text" name="username">
    <input selenium="password" type="password" name="password">

    <button type="submit">Submit</button>
</form>

你可以通知Masonite你所使用的自定义属性:

from masonite.testing import TestCase
from masonite.testing.selenium import SeleniumTestCase

class TestHomePage(TestCase, SeleniumTestCase):

    """All tests by default will run inside of a database transaction."""
    transactions = True
    unique_attribute = 'selenium'

    def setUp(self):
        """Anytime you override the setUp method you must call the setUp method
        on the parent class like below.
        """
        super().setUp()
        self.useBrowser('chrome', version='74')
        # self.useBrowser('firefox')

然后你就可以使用@符号来定位自定义属性所对应值元素:

(self.visit('/form')
    .text('@username', 'user')
    .text('@password', 'secret')
    .submit())

可用方法

以下是你在测试中可以使用的方法

visit

跳转到指定URL

self.visit('/')

如果URL没有使用http开发,Masonite会前置APP_URL环境变量值。在Masonite应用中,可以通过修改.env文件来变更。

assertTitleIs

断言页面标题为指定的值

(self.visit('https://www.python.org/')
    .assertTitleIs('Welcome'))

assertTitleIsNot

相对于 assertTitleIs.

assertUrlIs

断言当前URL指定值

(self.visit('https://www.python.org/')
    .assertUrlIs('https://www.python.org/'))

assertSee

断言页面中包含的内容

(self.visit('https://www.python.org/')
    .assertSee('Python'))

assertCanSee

assertSee 别名

assertCantSee

相对 assertCanSee,断言内容没有在页面中出现

text

输入文本到文本框

(self.visit('https://www.python.org/')
    .text('#username', 'user123')
    .text('#password', 'pass123'))

selectBox

选择下拉框值:

(self.visit('https://www.python.org/')
    .selectBox('#fruit', 'apple'))

check

选中复选框

(self.visit('https://www.python.org/')
    .check('#checkbox'))

resize

修改窗口宽高

(self.visit('https://www.python.org/')
    .resize(800, 600)) # width, height

mazimize

最大化

(self.visit('https://www.python.org/')
    .maximize())

minimize

最小化

(self.visit('https://www.python.org/')
    .minimize())

refresh

刷新

(self.visit('https://www.python.org/')
    .refresh())

back

后退

(self.visit('https://www.python.org/')
    .back())

forward

前进

(self.visit('https://www.python.org/')
    .forward())

link

单击页面中的链接

(self.visit('https://www.python.org/')
    .link('#login'))

clickLink

link 别名

submit

在当前元素中提交其表单

(self.visit('https://www.python.org/')
    .text('#username', 'user123')
    .text('#password', 'pass123')
    .submit())

还可以指定选择器来提交表单

(self.visit('https://www.python.org/')
    .text('#username', 'user123')
    .text('#password', 'pass123')
    .submit('#another-form'))

click

单机一个元素

(self.visit('https://www.python.org/')
    .click('#button'))

close

关闭

(self.visit('https://www.python.org/')
    .close())

本文章首发在 LearnKu.com 网站上。

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://learnku.com/docs/masonite/2.3/us...

译文地址:https://learnku.com/docs/masonite/2.3/us...

上一篇 下一篇
贡献者:3
讨论数量: 0
发起讨论 只看当前版本


暂无话题~