使用 Cypress 登录 WordPress,无需使用 UI

2023-12-01

In the 有关登录的 Cypress 文档他们指出不应使用 UI 设置状态。

但看起来 WordPress 的 API 中没有提供登录功能。 由于黑客攻击是大多数 WordPress 站点上的一个问题,所以我不想添加它。

如何使用 Cypress 登录 WordPress,而不使用 UI?


更新2020-09-03

如果没有办法解决这个问题,那么我只是在寻找最好的方法来做到这一点。是为了在某处实现一些隐藏的 API 登录端点吗?或者是无视 Brian Mann 的建议而只是使用 UI?


更新2020-10-02

首要问题

我自己也潜入其中。我想,我也许可以设置登录时放置的cookie。这一定是最好的方法。所以我们的目标是做出这样的东西:

  1. 以点击方式登录(这是令人不悦的)。
  2. 提取步骤1成功后设置的cookie。
  3. 在用户必须登录的所有测试之前设置这些 cookie。

请注意,当您阅读有关 Cypress 的文章时,这可能接近于在很多地方提到的反模式。因此,如果您想与布莱恩·曼 (Brian Mann) 成为朋友,请不要这样做。但我的意思是...谁需要那个家伙!


2023-06 更新:更好的方法

有一个更好的方法,可以使用以下方法来实现:https://stackoverflow.com/a/76165542/1766219

所以你不依赖于测试的顺序。或者出现错误的失败(因为登录尚未发生)。


2020:原始答案

以下是具体操作方法。我花了HOURS,-但这对我有用并且经过了彻底的测试。我确实交换了下面的变量(显然)。

我创建了一堆命令,以便能够在测试之间快速登录/退出。


警告 - 添加到 .gitignore

记得添加adminUserLoginCookiesFromCypress.json to you .gitignore- 并且不要将其上传到您的服务器。如果落入坏人之手,那么某人将能够以您的用户身份登录(通过将 cookie 添加到他们自己的浏览器中)。


Env

该内容进入cypress.json在项目根目录中。

{
  "env": {
    "baseUrl": "https://s1.demo.opensourcecms.com/wordpress",
    "dashboardUrl": "https://s1.demo.opensourcecms.com/wordpress/wp-admin",
    "domain": "s1.demo.opensourcecms.com/wordpress",
    "users": {
      "admin": {
        "username": "opensourcecms",
        "email": "[email protected]",
        "pw": "opensourcecms"
      }
    }
  },
}

Commands

清除Cookies

由于某种原因,我不能(也不能)得到cy.clearCookies()上班。 如果我运行登录 WP 的测试,那么当测试第二次运行时,它仍然会被记录。就算我跑cy.clearCookies()第一件事(?!)

这个手册/特定的clearCookie-Command对我有用:

Cypress.Commands.add( "clearWordPressCookies", () => {
  cy.clearCookie( 'wordpress_a8b94154380982c3184a469b8aa525c6' );
  cy.clearCookie( 'wordpress_a8b94154380982c3184a469b8aa525c6' );
  cy.clearCookie( 'wordpress_logged_in_a8b94154380982c3184a469b8aa525c6' );
  cy.clearCookie( 'wordpress_test_cookie' );
});

请记住找到您站点的实际 cookie 名称并替换哈希值。cookie 名称中使用哈希值的原因是出于多站点目的


获取cookies

将 cookie 保存到文件中(在项目根目录中)。

Cypress.Commands.add( "getWordPressCookies", () => {
  cy.getCookies()
    .then( (cookies) => {
      cy.writeFile( 'adminUserLoginCookiesFromCypress.json', cookies );
    });
});

设置cookie

从保存的文件中设置 cookie(从获取 cookies 功能)。

Cypress.Commands.add( "setWordPressCookies", () => {

  cy.readFile( 'adminUserLoginCookiesFromCypress.json' )
    .then( (cookies) => {
      cookies.forEach( (cookie) => {
        // cy.log( JSON.stringify( cookie ) ); // See the cookie contents
        cy.setCookie( cookie.name, cookie.value, {
          domain: Cypress.env('domain'),
          path: cookie.path,
          secure: cookie.secure,
          httpOnly: cookie.httpOnly,
          expiry: cookie.expiry
        });
      });
    });
});

手动登录

这必须是第一次完成,以使 WordPress 生成 cookie。

Cypress.Commands.add( "manualWordPressLogin", () => {
  cy.clearWordPressCookies();
  cy.visit( Cypress.env('dashboardUrl') );
  cy.get('#user_login').wait(200).type( Cypress.env('users').admin.username , { force: true } );
  cy.get('#user_pass').wait(200).type( Cypress.env('users').admin.pw, { force: true } );
  cy.get('#wp-submit').click();
  cy.get('h1').contains( 'Dashboard' );
});

用法示例

context( 'Login, set and prep cookies' , function () {

  it( 'Ensure no one is logged in', function() {
    cy.clearWordPressCookies();
    cy.visit( Cypress.env('dashboardUrl') );
    cy.location('pathname').should('eq', '/wp-login.php' ); // Not logged in
  });


  it( 'Logs in a admin user', function(){
    cy.manualWordPressLogin();
    cy.getWordPressCookies();
    cy.visit( Cypress.env('dashboardUrl') );
    cy.location('pathname').should( 'match', /^\/wp-admin/ );
  });  
  

  it( 'logs out the user - and logs back in using setting wp-cookies', function(){
    cy.clearWordPressCookies();
    cy.visit( Cypress.env('dashboardUrl') );
    cy.location('pathname').should( 'match', /^\/wp-login\.php/ ); // Not logged in
    cy.setWordPressCookies();
    cy.visit( Cypress.env('dashboardUrl') );
    cy.location('pathname').should( 'match', /^\/wp-admin/ ); // Is logged in
  });

});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Cypress 登录 WordPress,无需使用 UI 的相关文章

  • 在占位符中添加 HTML

    我喜欢使用 HTML 占位符 因为它有助于向用户描述他们需要输入的内容类型 但是 有时您需要为用户提供更多信息 而不仅仅是简单的句子 基本上我希望能够在我的文本区域占位符中添加换行符 制表符等 我听说过使用特殊编码来做到这一点 并且已经使用
  • 量角器:向下滚动

    我的页面上有一个按钮 当用户向下滚动时可见 因此 量角器测试给了我一个错误 UnknownError 未知错误 元素在点 94 188 处不可单击 我尝试使用 browser executeScript window scrollTo 0
  • 在 `data:` URI 中转义 SVG 的正确方法?

    Chrome 最近已启动使用换行符阻止 URL 和 lt 人物 https www chromestatus com features 5735596811091968 我维护的应用程序严重依赖数据 URI 中的 SVG 图像 data i
  • 在 HTML TextArea 中设置(或读取)光标/插入符的值

    我正在尝试 但失败了 在 HTML 文本区域中实现拖放机制 使用 jQuery 或 Scriptaculous 我们都使用 拖放机制相对容易 因此我愿意接受使用这两者之一的答案 问题是 我似乎找不到读取或设置插入点的方法 我最终想要做的是确
  • 每 x 秒重复一次代码,但如果 [在此处插入检查] 则不重复

    这是后续这个问题 https stackoverflow com questions 13304471 javascript get code to run every minute 我在那里找到了如何使代码每 x 秒重复一次 是否有可能举
  • WooCommerce:用文本覆盖购物车价格

    我们有很多产品具有以下功能 No price 零价格 我们让它们可以通过内置挂钩购买 但购物车仍然将它们显示为具有0 price结账时 我们希望购物车和结帐摘要显示 特殊订单 或任何其他文本 但 WooCommerce 似乎使基于文本的价格
  • 为什么我在 ECMAScript / ActionScript 3 中看到不精确的浮点结果?

    大家好 让我们直接跳到代码示例 以展示 ECMAScript JavaScript AS3 如何无法正确执行简单的数学运算 AS3 对 Number 类使用 IEEE 754 双精度浮点数 据说与JavaScript 中使用的 trace
  • Protractor - 等待多个元素

    我正在尝试等待页面上的多个元素 我不知道可能有多少个 但至少会有一个 我知道使用以下命令等待单个元素 效果很好 var EC protractor ExpectedConditions browser wait EC presenceOf
  • Vue 多个组件位于一个包/文件中

    假设我想创建一个 UI 包 如何将多个组件放入一个 JS 文件中 通常我会将不同的组件放在不同的文件中 import ButtonText from ButtonText vue import ButtonIcon from ButtonI
  • jQuery 选择器在控制台中不起作用

    我一辈子都无法解决这个问题 我正在运行 js 容器状态 是页面上正在运行的 js 的控制台日志 它显示一个选择器 但如果我想在控制台中执行任何操作 它只会返回 null 我假设我在某个地方过度编写了 jQuery 函数 就好像我调用了 jQ
  • AngularJS Youtube 播放器嵌入非常大的播放列表

    我目前正在构建一个 AngularJS 应用程序 我知道它有点过时 但我对它很有信心 我的应用程序需要嵌入一个 YouTube 播放器 其中包含一个非常大的播放列表 大约 1500 个项目 但我无法对其进行编码 以便它实际上可以嵌入超过 2
  • 如何使用 JavaScript 禁用滚动条?

    当我仅在 Internet Explorer 7 中显示代表模式窗口的 div 时 我需要锁定浏览器滚动条 谷歌搜索我发现我可以使用document body style overflow hidden 但这不适用于 IE7 我也尝试过do
  • 变量值的 swap() 函数[重复]

    这个问题在这里已经有答案了 我无法达到下面这个交换函数的预期结果 我希望将值打印为 3 2 function swap x y var t x x y y t console log swap 2 3 任何线索将不胜感激 您的函数正在内部交
  • 每次页面重新加载时都会出现新的 Google 登录库提示

    在我的项目中 我使用常规弹出客户端 JS 身份验证 平台客户端 https developers google com identity sign in web sign in 我从旧版 Google Sign 迁移到新版 Google I
  • 将 MathJax 脚本添加到 Office 365 Sharepoint 中的页面

    我正在尝试将 Mathjax 库添加到 SharePoint 库 以便我们可以使用 LaTex 语法来添加方程 我在网上搜索时看到了多种方法 但似乎没有一种方法可以与最新版本的 MathJax 和 Office 365 版本的 ShareP
  • 验证单个单选按钮在可用的 javascript 验证脚本中不起作用

    我随机生成了单选按钮系列 例如
  • 使用带有箭头的 MaterializeCSS 轮播 - 如何使用普通 javascript 进行初始化

    我正在尝试使用 MaterializeCSS 创建带有箭头的轮播 我正在尝试使用这个代码笔 https codepen io Paco Cervantes pen ZLxKpj取得有限的成功 我想使用普通的 javascript 而不是 j
  • 查看元素的所有 dom 事件

    我有一个 jQuery UI 日期选择器 当您单击日期时 它会清除我的 URL 哈希值 并且不会更改文本框中的日期 我假设某个地方还有其他一些 JavaScript 实用程序 它也正在调用某种委托事件 抛出错误并终止 jquery 处理程序
  • 如何在jsp页面中包含javascript

    我是 J2EE 和 Web 开发的新手 这是我的问题 我想在网页中包含 angular js 这是有效的版本 但我也想要一些本地的 javascript 文件 并且希望我想在本地目录中导入 angularjs
  • AngularJS 应用程序:如何将 .js 文件包含到 index.html 中

    我是 angularJS 的新手 我设法使用 AngularJS 构建了一个phonegap应用程序 该应用程序正常并且运行良好 问题是 现在我对 angularJS 的工作原理有了更多的了解 至少我认为我已经了解了 我担心我的应用程序文件

随机推荐

  • Python __getattr__ 执行多次

    我一直在努力实施 getattr 函数如下例所示 PEP 562 模块 getattr and dir 我不明白为什么这段简单的代码 lib py def getattr name print name main py from lib i
  • 在 Firebase 客户端应用程序中实现可调用的云函数

    我最近发现了Firebase 可调用函数这允许我从客户端调用类似 HTTPS 触发器的函数 并且具有 auth 支持 我很难在现有的 Firebase Web 客户端应用程序中实现这一新功能 我正在运行一些云函数 其中有一些我想将其转换为
  • 连接计算日期之间值的表

    所以我有下面两个表 Table A Date num 01 16 15 10 02 20 15 12 03 20 15 13 Table B Date Value 01 02 15 100 01 03 15 101 01 17 15 102
  • C# SMO 和 SqlEnum 引用错误

    我正在做一个 C 项目VS2013正在使用smo目的 我安装了 Install Package Microsoft SqlServer Scripting Install Package Microsoft SqlServer SqlEnu
  • Azure服务总线:如何续订锁定?

    如何更新接收队列消息处理程序上的锁 在事件处理程序上 测试消息没有更新锁定属性 Message testMessage https learn microsoft com en us dotnet api microsoft service
  • R Shiny:保留旧输出

    在闪亮的应用程序中 有没有办法保留旧的反应输出并将其与新的反应输出一起显示在应用程序中 举个例子 假设我想显示线性模型的汇总表 我逐渐向其中添加更多变量 我目前有一个checkboxGroupInput我使用该面板选择要包含在模型中的解释变
  • 字节算术:如何减去字节变量? [复制]

    这个问题在这里已经有答案了 当我尝试执行以下操作时出现错误 byte a 23 a a 1 编译器给出这个错误 Test java 8 发现可能存在精度损失 需要 int 字节 a a 1 1 个错误 铸造并不能解决错误 为什么编译器不让我
  • jq 的意外循环

    我正在尝试将 bash 中的表从 json 打印到标准输出jq key name doc count 1000 values over time buckets key as string 2019 05 01 11 00 00 000 k
  • Python:获取和保存屏幕截图的最快方法

    我一直在努力想出一个脚本 让我每秒可以多次截取桌面屏幕截图 我用的是Win10 PIL from PIL import ImageGrab import time while True im ImageGrab grab fname dro
  • 使用 Gmail 从 Excel 发送电子邮件

    我正在尝试在保存工作簿后自动生成电子邮件 我不想在电子邮件中发送工作簿 只是向一组人员发送电子邮件通知 告知其中有一个新条目 因此他们实际上必须打开它并做出响应 如果我可以添加指向该条目位置的链接 可以使用的电子表格 此外 该工作簿是 共享
  • Flutter 从 Firebase Cloud Firestore 返回完整数组

    9 月 2 日最新编辑 即使有赏金 我对此也没有太大的兴趣 所以我会尝试问一个更简单 更具体的问题 因此 我根据下面 Doug 的建议重新组织了数据库 因为我无法在 firebase 中以任何方式引用数组 所以现在我有了一个数组的映射 而不
  • 有些手机需要 READ_CONTACTS 权限才能从联系人选择器中读取

    我有一个HTC ONE M7 GPE 4 2 2 和HTC EVO 3D 4 0 3 HTC Sense 3 6 HTC ONE不需要
  • 如何在不使用任何插件的情况下添加 2 个音调图标?

    我不想只为我的应用程序中的一个图标添加任何插件 但我需要两种色调 因为背景颜色会有所不同 我不知道什么时候会变暗 什么时候会变亮 我的意思是像这样的图标 https material io tools icons style twotone
  • 如何创建更加用户友好的 string.format 语法?

    我需要在程序中创建一个很长的字符串 并且一直在使用String Format 我面临的问题是当参数超过 8 10 个时跟踪所有数字 是否可以创建某种形式的重载来接受与此类似的语法 String Format You are age year
  • 路由器解析不会注入控制器

    我已尝试一切方法来让 ui router 解析将其值传递给给定的控制器 应用程序 Ctrl 我正在使用依赖注入 inject 这似乎导致了问题 我缺少什么 Routing stateProvider state app index url
  • 如何将命名向量作为行添加到数据框中,并根据列名称顺序重新排序?

    如何将命名向量添加到数据框中 并根据数据框的列名称重新排序向量的组件 我需要一次一行构建一个数据框 通过某种处理获得命名向量 它提供要插入的行的值 问题是命名向量的分量与数据框列的顺序不同 这使得rbind产生错误的结果 这是非常简化的示例
  • 如何在Windows服务器上安装Apple Push证书

    我需要安装从 Apple 开发门户下载的证书 以便在 Windows 服务器上测试推送通知 我在网上搜索了一个解决方案 但每个人对此都有不同的看法 有人有关于如何执行此操作的分步指南吗 我也一直在研究这个课题 以下链接可能对您有用 http
  • Laravel 4,在 JavaScript 中传递变量到路由

    How Can I pass the variable stock id return from Ajax response to the route to generate the url to edit a stock ajax url
  • 检测手机休眠时的手势[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我正在开发一个 SOS Android 应用程序 如果手机处于睡眠 待机模式 我想检测手势 例如屏幕上的几次触摸 并开始发送帮助请求 例如发送短信 我怎样才能检测到这个手势 有人
  • 使用 Cypress 登录 WordPress,无需使用 UI

    In the 有关登录的 Cypress 文档他们指出不应使用 UI 设置状态 但看起来 WordPress 的 API 中没有提供登录功能 由于黑客攻击是大多数 WordPress 站点上的一个问题 所以我不想添加它 如何使用 Cypre