python+playwright 学习- 结合 gremlins.js 实现web 网页的mokey测试

在 Android  应用测试里面有个 mokey测试可以对app 做稳定性的测试,在app里面随机乱点发送一些事件,看app会不会异常。
这种做法,也称为 Monkey测试 或 Fuzz 测试,在移动应用程序开发中非常常见。

Gremlins.js 模拟随机用户操作:gremlins 单击窗口中的任意位置,在表格中输入随机数据,或者鼠标在页面上任意位置乱点,让 JavaScript 错误,或使程序失败。
如果gremlins不能破坏应用程序,恭喜!该应用程序足够健康,可以发布给真正实用的用户。

基本使用

一个小精灵部落(gremlins horde)是一支由一群专业的小精灵(gremlins)组成的军队,随时准备搞砸您的应用程序。释放小精灵(gremlins)开始压力测试:

  1. const horde = gremlins.createHorde();

  2. horde.unleash();

  3. // gremlins will act randomly, at 10 ms interval, 1000 times

gremlins.js提供了几种小精灵:一些在页面上的任何地方单击,其他人在表单输入中输入数据,其他人在每个可能的方向滚动窗口,等等。

您将在屏幕上和控制台日志中看到gremlins操作的痕迹(它们会留下红色痕迹):

  1. gremlin formFiller input 5 in <input type="number" name="age">

  2. gremlin formFiller input pzdoyzshh0k9@o8cpskdb73nmi.r7r in <input type="email" name="email">

  3. gremlin clicker click at 1219 301

  4. gremlin scroller scroll to 100 25

  5. ...

部分落还包含mogwais,它们是无害的gremlins(或者你可以说gremlins是有害的mogwais)。Mogwais只监视应用程序的活动并将其记录在案,如何刊上记载。wai每 500 秒监控每秒的率:

  1. mogwai fps 33.21

  2. mogwai fps 59.45

  3. mogwai fps 12.67

  4. ...

当 gremlins 破坏应用程序时,Mogwais 也会报告。例如,如果每秒帧数低于 10,fps mogwai 将记录错误:

  1. mogwai fps 12.67

  2. mogwai fps 23.56

  3. err > mogwai fps 7.54 < err

  4. mogwai fps 15.76

  5. ...

出现 10 个错误后,一个特殊的 mogwai 会停止测试。他叫做Gizmo,他阻止 gremlins 破坏应用程序。最终,一次 gremlins 发现就位,前 10已经知道必须做些什么才能使您的应用程序更多健壮。

如果 Gizmo 没有阻止,默认的部分落会在大约 1 分钟后停止。您可以增加 gremlins 活动的数量以使得攻击持续时间更长:

  1. const horde = gremlins.createHorde({

  2. strategies: [gremlins.strategies.allTogether({ nb: 10000 })],

  3. });

  4. horde.unleash();

  5. // gremlins will attack at 10 ms interval, 10,000 times

Gremlins 和 mogwais 一样,都是简单的 JavaScript 函数。如果gremlins.js不提供可以破坏您的应用程序的 gremlin,则开发它非常容易:

  1. // Create a new custom gremlin to blur an input randomly selected

  2. function customGremlin({ logger, randomizer, window }) {

  3. // Code executed once at initialization

  4. logger.log('Input blur gremlin initialized');

  5. // Return a function that will be executed at each attack

  6. return function attack() {

  7. var inputs = document.querySelectorAll('input');

  8. var element = randomizer.pick(element);

  9. element.blur();

  10. window.alert('attack done');

  11. };

  12. }

  13. // Add it to your horde

  14. const horde = gremlins.createHorde({

  15. species: [customGremlin],

  16. });

里面的一块gremlins.js都是可配置的;您会发现扩展和适合您的用例非常容易。

高级使用法

设置 Gremlins 和 Mogwais 以在测试中使用

默认情况下,所有 gremlins 和 mogwais 物种都会添加到部落中。

你也可以选择只添加你想要的小精灵物种,使用自定义配置对象:

  1. gremlins

  2. .createHorde({

  3. species: [

  4. gremlins.species.formFiller(),

  5. gremlins.species.clicker({

  6. clickTypes: ['click'],

  7. }),

  8. gremlins.species.toucher(),

  9. ],

  10. })

  11. .unleash();

如果你只是想在默认的外部添加自己的小精灵,请使用常量allSpecies:

  1. gremlins

  2. .createHorde({

  3. species: [...gremlins.allSpecies, customGremlin],

  4. })

  5. .unleash();

要只添加所需的 mogwais,请以相同的方式使用mogwai配置和常量。allMogwais()

gremlins.js之前提供了一些 gremlins 和 mogwais:

  • clickerGremlin点击文档可见区域的任意位置

  • toucherGremlin触摸文档可见区域的任何地点

  • formFillerGremlin通过输入数据、选择选项、单击复选框等来填写表格

  • scrollerGremlin滚动视图以显示文档的另外一部分

  • typerGremlin在按键盘上按键输入

  • alertMogwai防止停止调用 alert() 阻塞测试

  • fpsMogwai记录浏览器的每秒帧数 (FPS)

  • gizmoMogwai可以在他们走得太远的时候阻止他们

配置 Gremlins

提供的所有 gremlins 和 mogwaisgremlins.js都是可配置的,即您可以通过注册进入自定义配置来更改它们的工作方式。
例如,clicker gremlin 是一个将对象作为自定义配置的函数:

  1. const customClicker = gremlins.species.clicker({

  2. // which mouse event types will be triggered

  3. clickTypes: ['click'],

  4. // Click only if parent is has class test-class

  5. canClick: (element) => element.parentElement.className === 'test-class',

  6. // by default, the clicker gremlin shows its action by a red circle

  7. // overriding showAction() with an empty function makes the gremlin action invisible

  8. showAction: (x, y) => {},

  9. });

  10. gremlins.createHorde({

  11. species: [customClicker],

  12. });

每个特定的 gremlin 或 mogwai 都有自己的自定义方法,请查看源代码以获取详细信息。

播种随机生成器

如果您希望攻击可重现,则需要为随机生成器播种:

  1. // seed the randomizer

  2. horde.createHorde({

  3. randomizer: new gremlins.Chance(1234);

  4. });

在攻击之前或之后执行代码

在开始攻击之前,您可能想执行自定义代码。这对以下情况特别有用:

  • 启动分析器

  • 禁止使用某些功能以更好地针测试

  • 引导应用程序

幸运的是,unleashHorde是一个无极。因此,如果您想要在释放之前和之后执行代码,只需执行以下操作:

  1. const horde = gremlins.createHorde();

  2. console.profile('gremlins');

  3. horde.unleash().then(() => {

  4. console.profileEnd();

  5. });

制定策略

默认情况下,gremlins 会以随机顺序攻击,平均分配,间隔 10 秒的延迟。这种攻击策略称为分配策略。您可以使用策略算法自定义自定义行自定义:

  1. const distributionStrategy = gremlins.strategies.distribution({

  2. distribution: [0.3, 0.3, 0.3, 0.1], // the first three gremlins have more chances to be executed than the last

  3. delay: 50, // wait 50 ms between each action

  4. });

请注意,如果使用默认的 gremlins,则有五种类型的 gremlins。前面的例子会给最后一个 gremlin 一个 0 值。

您也可以使用另一种策略。策略只是一个需要一个参与数的怪数:一组gremlins。捡了另外两种策略(allTogetherandbySpecies),针对更替补座的进攻定义策略应该相 当容易。

停止攻击

部分落可以在紧急情况下使用horde.stop()Gizmo使用此方法来阻止在 10 次错误后对应用程序构建进行一步损毁的方法停下来停止进攻,如果停止点击继续,您也可以使用它。

自定义记录器

默认情况下,gremlins.js 在控制台中记录所有 gremlin 操作和 mogwai 观察结果。如果您更喜欢使用替代日志记录方法(例如,将存储 gremlins LocalStorage 移动10 秒在 Ajax 中发送一次),仅需要向该方法提供一个工具有 4 种方法(日志、信息、警告和错误)的记录器对象logger():

  1. const customLogger = {

  2. log: function (msg) {

  3. /* .. */

  4. },

  5. info: function (msg) {

  6. /* .. */

  7. },

  8. warn: function (msg) {

  9. /* .. */

  10. },

  11. error: function (msg) {

  12. /* .. */

  13. },

  14. };

  15. horde.createHorde({ logger: customLogger });

详细文档https://github.com/marmelab/gremlins.js

playwright 运行 gremlin.js

要使用playwright运行gremlin.js,您可以将其作为初始脚本加载。

  1. const { test } = require('@playwright/test');

  2. test('run gremlins.js', async ({ page }) => {

  3. await page.addInitScript({

  4. path: './node_modules/gremlins.js/dist/gremlins.min.js',

  5. });

  6. await page.goto('https://playwright.dev');

  7. await page.evaluate(() => gremlins.createHorde().unleash());

  8. });

python 对应的脚本, 需下载gremlins.min.js 放到本地代码目录

  1. from playwright.sync_api import sync_playwright

  2. with sync_playwright() as p:

  3. browser = p.chromium.launch(headless=False)

  4. context = browser.new_context(record_video_dir="videos/") # 创建上下文,浏览器实例1

  5. page = context.new_page() # 打开标签页

  6. # 初始化,加载js

  7. page.add_init_script(path='./gremlins.min.js')

  8. page.goto("http://47.108.155.10/login.html")

  9. page.wait_for_load_state("networkidle")

  10. # 执行脚本

  11. page.evaluate("gremlins.createHorde().unleash()")

  12. page.close()

运行后,你会看到页面上发生的随机事件

行动吧,在路上总比一直观望的要好,未来的你肯定会感 谢现在拼搏的自己!如果想学习提升找不到资料,没人答疑解惑时,请及时加入扣群: 320231853,里面有各种软件测试+开发资料和技术可以一起交流学习哦。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

  • 23
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python Playwright 是一个基于 Python 的自动化测试框架,它可以用于 Web 应用程序的自动化测试。下面是使用 Python Playwright 实现自动化测试框架的步骤: 1. 安装 Python Playwright:在命令行中输入以下命令进行安装: ```python pip install playwright ``` 2. 安装浏览器驱动程序:Python Playwright 支持多种浏览器,包括 Chrome、Firefox 和 Safari 等。在使用之前,需要先下载并安装浏览器相关的驱动程序。 3. 编写测试用例:使用 Python Playwright 编写测试用例非常简单,只需要调用相应的 API 就可以实现。下面是一个简单的测试用例,用于测试 Google 搜索功能: ```python import asyncio from playwright.async_api import Playwright, async_playwright async def run(playwright: Playwright) -> None: browser = await playwright.chromium.launch() page = await browser.new_page() await page.goto('https://google.com') await page.type('input[name="q"]', 'Playwright') await page.press('input[name="q"]', 'Enter') await page.wait_for_selector('#search') title = await page.title() assert 'Playwright' in title await browser.close() async def main() -> None: async with async_playwright() as playwright: await run(playwright) asyncio.run(main()) ``` 4. 运行测试用例:在命令行中进入测试用例所在的目录,输入以下命令运行测试用例: ```python python test.py ``` 以上就是使用 Python Playwright 实现自动化测试框架的基本步骤。当然,还可以根据具体需求,进一步完善测试框架,比如添加报告生成、结果统计和持续集成等功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值