pveltrop / pyrunner
Python/Selenium 测试运行器
This package is auto-updated.
Last update: 2021-07-08 19:42:05 UTC
README
关于 PyRunner
Pyrunner 是一个 Python 包,它可以运行 Laravel 应用程序的浏览器测试。Pyrunner 当前具有以下功能:
- 以开发模式交互式开发浏览器测试
- 记录每个步骤并截图
- 自动重试失败测试,次数不限
- 易于在 CICD 中使用,比 Laravel Dusk 更不容易崩溃
使用方法
安装 Python: https://pythonlang.cn/downloads/release/python-381/
安装 Pip: https://pip.pypa.org.cn/en/stable/installing/
转到您项目的根目录。
安装此包
composer require pveltrop/pyrunner:dev-master#(commit)
然后在 Laravel 项目中安装 PyRunner
php artisan pyrunner:install
准备您的(测试)数据库
php artisan migrate:fresh --seed (--database=mysql_testing)
在新的终端中启动 PyRunner
php artisan pyrunner:start (--dev) (--debug) (--shell) (--screenshots)
在您的活动终端中启动 PyRunner
python vendor/pveltrop/pyrunner/test_app.py (--dev) (--debug) (--shell) (--screenshots)
参数
开发 (--dev)
php artisan pyrunner:start --dev
启动应用程序并插入断点。这意味着您将获得一个交互式终端,因此您可以在其中测试浏览器命令或单独运行测试。
请注意
开发模式将在启动时插入断点,因此您可以在 _tests.py 文件中运行任何您想要的内容。
ipdb>
因此,如果您想在 _tests.py 中运行 fake 函数,请运行 fake().name()(例如)
ipdb> fake.email()
'siennaschiffer@van.com'
如果您想运行所有测试,并在任何地方失败时插入断点(您的测试代码将每次重新加载)
ipdb> RunTests()
如果您想重新运行单个测试,首先直接输入
ipdb> reload(tests)
这将重新加载您的 _tests.py 文件。然后
ipdb> tests.nameoftest()
调试 (--debug)
php artisan pyrunner:start --debug
此选项将在测试命令执行期间启用更具体的输出。这可能有助于确定 PyRunner 哪里存在问题。
截图 (--screenshots)
php artisan pyrunner:start --screenshots
此选项将启用截图。每当您定义一个新的步骤(pr.step())时,都会生成截图。
ENV
php artisan pyrunner:env
此选项将生成 .env.example 和 .env.testing 文件。更改您想要或不需要在版本控制中更改的值。
为 Laravel 配置
请确保您的 APP_URL 设置正确,与您本地使用的地址相同。
- 如果您在执行 php artisan pyrunner:install 时跳过了此步骤,请创建一个 .env.testing 文件,用于本地和 GitLab 测试。
php artisan pyrunner:env
如果此环境在本地上不工作,在 GitLab 上也不会工作。
- 重要:设置 TELESCOPE_ENABLED=false,否则当前迁移将无法工作
可选:如果您想通过 Slack 或 Pushbullet 收到测试结果
- 在 GitLab 上,转到设置 -> CI/CD -> 变量
- 定义一个 SLACK 变量,这是您想要使用的 webhook 的 URL
- 定义一个包含您Pushbullet账户API密钥的PUSHBULLET变量
- 对于pushbullet,在yml文件中传递一个GitLab变量,参数为:--pbchannel=channelName
如果需要自行托管GitLab runner,则是可选的
- 在电脑上安装GitLab runner,并将其链接到CI/CD中的项目仓库
- 在此电脑上安装docker,并拉取您之前构建的镜像
docker pull registry.gitlab.com/(group)/(repository)
编写测试
- 在项目根目录的_tests.py中定义测试函数,具有以下结构
# -----------------------------------------------------------
# Tests
# -----------------------------------------------------------
def users_can_login():
pr.start('Users Can Login') # Prints start of test
pr.step('Logout first') # Prints current step being executed
pr.browser.get('https:///_testing/pylogout') # Redirecting browser
pr.step('Enter email')
pr.type_xpath('//*[@id="email"]', pyUserEmail) # Typing in a field
pr.step('Enter password')
pr.type_xpath('//*[@id="password"]', pyUserPassword)
pr.step('Login')
pr.click('//*[@id="kt_login_signin_submit"]','#kt_login_signin_submit','kt_login_signin_submit') # Click function has 3 parameters. The order is: Xpath selector, CSS selector, ID selector. Send atleast one.
pr.end('Users Can Login') # Prints end of test
# -----------------------------------------------------------
# End of tests
# -----------------------------------------------------------
- 使用以下结构定义重构函数
# -----------------------------------------------------------
# Refactoring/scanning
# -----------------------------------------------------------
def scan_for_dd():
pr.start('Check if all dd() is removed from code')
pr.step('Scan files with RegEx')
pr.scan_regex(r"dd\([\',\"].*[\',\"]\)")
pr.end('Check if all dd() is removed from code')
# -----------------------------------------------------------
# End of refactoring
# -----------------------------------------------------------
测试命令
pr.click(xpath,css,id)
参数是HTML元素的选择器。在Chrome/Firefox中右键点击(所有三个都是可选的,但使用越多,点击成功的可能性越大。)
pr.switch_tab(index)
切换浏览器到提供的索引
选择
pr.select_value_name(name, value)
通过值选择HTML元素中的选项
pr.select_index_name(name, index)
通过索引选择HTML元素中的选项
pr.select_value_id(id, value)
通过值选择HTML元素中的选项
pr.select_index_id(id, index)
通过值选择HTML元素中的选项
pr.find_text(text)
在当前页面上查找文本
pr.find_id(id)
尝试通过ID找到可见元素
pr.find_class(class)
尝试通过Class找到可见元素
pr.find_css(css)
尝试通过CSS选择器找到可见元素
pr.find_name(name)
尝试通过Name找到可见元素
pr.find_xpath(xpath)
尝试通过Xpath找到可见元素
输入
pr.type_xpath(xpath)
尝试在通过xpath选择的元素中输入
pr.type_name(name)
尝试在通过name选择的元素中输入
pr.type_id(id)
尝试在通过id选择的元素中输入
pr.type_css(css)
尝试在通过css选择的元素中输入
pr.change_text_xpath(xpath)
尝试清除并通过xpath选择的元素输入文本
pr.change_text_name(name)
尝试清除并通过name选择的元素输入文本
pr.change_text_id(id)
尝试清除并通过id选择的元素输入文本
pr.change_text_css(css)
尝试清除并通过css选择的元素输入文本
Docker镜像
准备Docker镜像
- 为您的项目构建一个Docker镜像
- Navigate to the Docker folder in this repo
- Copy and paste the following files from your project to this folder, to speed up CI/CD:
composer.json
composer.lock
package.json
package-lock.json
- docker login registry.gitlab.com
- docker build -t registry.gitlab.com/(group)/(repository) .
- docker push registry.gitlab.com/(group)/(repository)
- 更新.gitlab-ci.yml中使用的Docker镜像