Selenium 浏览器测试
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测试了。
使用浏览器
在我们开始构建测试用例时,我们需要指定所要使用的浏览器。目前有两个可选项:chrome
和firefox
。
你可用在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())
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。