使用 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 的相关文章

  • 如何从 JavaScript 中计算 HTML 表格的渲染高度?

    调整窗口大小时 我需要知道表格有多大 以便我可以动态地很好地适应中间的所有其他内容 表格高度仅取决于动态加载的内容 如何在 JavaScript 中计算表格的渲染高度 您可以使用element offsetHeight https deve
  • Javascript 与 Python 关于 Python 'map()' 函数的比较

    Python中有一个函数叫做map这可以让你去 map someFunction x y z 并继续应用该功能的列表 是否有与此功能等效的 JavaScript 我现在刚刚学习Python 虽然我被告知javascript是函数式语言 但我
  • AngularJS 使用 $apply 而不使用 $scope

    我开始使用 AngularJS 并且接受了用它来编写控制器的约定 而不是用 scope 所以我的控制器看起来像这样 myApp controller SomeController function this myModel id 1 nam
  • 如何使用 LinkedIn javascript sdk 检索包括所有字段的职位列表?

    我想要获取 LinkedIn 会员在其个人资料中输入的每个职位的 ID 头衔 摘要 开始日期 结束日期 当前状态和公司名称 我测试了一个查询休息控制台 https apigee com console linkedin我得到了想要的结果 查
  • Google 饼图未显示所有数据行

    我正在尝试绘制人口与国家名称的关系图 我发现 Google 可视化库仅渲染前几个 实际上数字似乎是随机的 具体取决于我使用的数据 有时添加 其他 条目 但它没有t 实际上具有其余条目的值 Example 1 With all countri
  • 通知用户消息仍在输入中

    我正在使用 Laravel 5 6 7 Socket IO 和 vue js 我没有使用 Pusher 和 redis 下面是我的代码 用于向与我一对一聊天的用户发送消息 var url http localhost 6001 apps M
  • 未捕获的类型错误:this.props.signinUser 不是一个函数(…)

    src actions index js import axios from axios const ROOT URL http localhost 3090 export function signinUser email passwor
  • 使用 NodeJS 让 Discord 机器人发送带有消息的图片

    我有几张照片 全部在 imgur 上 带有直接图像链接 格式 https i imgur com XXXXXX jpg https i imgur com XXXXXX jpg 以及用 NodeJS 制作的 Discord 机器人 我发送这
  • Three.js - 在代码中包含网格数据

    我有这个 Three js 代码 其中 JSON 加载器从文件 models mountain json 加载网格 var Three new function this scene new THREE Scene this camera
  • jQuery 的 css() 在应用于滚动事件时滞后

    我正在尝试实现一个简单的 固定标题 表 我知道这在理论上只能用 CSS 来完成 但是当涉及到 OSX Lion 及其消失的滚动条时 它效果不佳 所以我用 jQuery 来做 方法很简单 只有1 5行代码 inbox scroll funct
  • ngModel.$parsers 忽略 ng-model 值末尾的空格

    我有这样的指令 directive noWhitespace parse function parse return restrict A require ngModel link function scope element attrs
  • 提交前验证表单(比检查空字段更复杂)

    我有一个包含时间输入的表单 具体来说 开放时间和结束时间 当按下提交按钮时 它会转到一个 php 页面 其中这些输入将添加到数据库中 在允许提交表单之前我想检查一些事情 例如 我想确保开始时间早于 小于 结束时间 这是表格 Opens
  • jQuery Blur() 在 Chrome 上不起作用

    我在 MacOSX 上运行这个http jsfiddle net q84wv http jsfiddle net q84wv on Chrome最新版本 它不会工作 在 Firefox 上运行时它工作得很好 有什么线索吗 假设您想要aler
  • 光滑的轮播缓动示例

    我正在使用 Slick Carousel http kenwheeler github io slick http kenwheeler github io slick 但不知道如何合并不同的幻灯片切换 有人有例子可以分享吗 这是我目前拥有
  • JQuery DataTable 单元格从行单击

    我正在尝试在 jquery 数据表上实现一个函数 该函数返回单击行的第一列和第四列 我正在遵循这个示例 它允许我操作单击的行http datatables net examples api select single row html ht
  • 使用 onBlur 事件上的值更新 React 输入文本字段

    我有以下输入字段 在模糊时 该函数调用服务来更新服务器的输入值 完成后 它会更新输入字段 我怎样才能让它发挥作用 我可以理解为什么它不允许我更改字段 但我能做些什么才能使其工作 我无法使用defaultValue因为我会将这些字段更改为其他
  • 理论上防止 WebSocket 中第一个收到的消息丢失

    服务器端代码发送消息立即地连接打开后 它向客户端发送初始配置 问候语 以下代码是在客户端 var sock new WebSocket url sock addEventListener error processError sock ad
  • 使用 jQuery Tablesorter 操作后如何恢复当前页面?

    我正在使用 tablesorter 但无法找到有关插件 tablesorter 寻呼机的任何文档 问题是我有一个显示一些数据的表 并且在每一行中都有一个删除链接 该链接附加了要删除的元素的唯一标识符 显然 是否可以保存我正在删除的页面 然后
  • 使用 Lodash 将对象键转换为具有键值数量的数组[重复]

    这个问题在这里已经有答案了 我有一个产品对象 products bread 1 milk 2 cheese 2 chicken 1 我想要一个包含产品名称的数组 如下所示 products bread milk milk cheese ch
  • 获取淘汰赛中被点击元素的索引

    获取无序列表中单击元素的索引的最佳方法是什么 让我举个例子 假设我有以下 HTML 代码 ul li p p li ul 现在我有以下 javascript 代码来获取索引 self itemClicked function data it

随机推荐

  • 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