• 1
  • 1
分享
  • Cypress 小试牛刀-页面元素交互(二)
  • 刘则 2020-08-12 10:47:04 字数 3724 阅读 2574 收藏 1

大家都知道 UI 自动化最重要的就是页面元素的定位和操作

但是现在我们会发现元素越来越难定位了,前端可能会使用流行的 VUE 框架,页面控件元素经常没有 id、name 等属性,对我们定位产生了一定的困扰,需要我们灵活运用查找方式,去解决遇到的问题。


1.下面列举一些 Cypress 提供的定位方式

首先,它提供了 3 种专有的定位器,data-*属性,即使 CSS 或 js 改变也不会影响测试,看上去很美哈

data-cy、data-test、data-testid。(个人认为这种方式极少用到,想让前端给你加上这种属性会很难。。)

```
//例如为button添加一个data-*属性
<button id="main" class="btn" data-cy="submit">ddd</button>
<button class="btn" data-test="submit">ddd</button>
<button class="btn" data-testid="submit">ddd</button>
//定位操作这个元素
cy.get("[data-cy=submit]").click()
```


还有 id 选择器、class 选择器、attributes 属性选择器、:nth-child(n)选择器、Cypress.$ 定位器

```
//用id定位
cy.get("#id的值")
//用class定位
cy.get(".class的值")
//用attributes 属性定位
cy.get("button[id='main']")
//查找父元素的第几个子元素
cy.get(":nth-child(1)")
cy.get(':nth-child(3) > .nav-menu-item-content')
```


Cypress 的 默认定位策略优先级

data-cy > data-test > data-testid > id > class > tag > attributes > nth-child

当然我们可以人为修改顺序,例如

```javascript
Cypress.SelectorPlayground.defaults({
  selectorPriority: ['class','id','attributes']
})
```


2.查找元素的方法

常用基本方法有 .get()、.find()、.contains()

```
//在DOM树中查找对应元素
cy.get(':nth-child(3) > .nav-menu-item-content').click()
//用来搜索对应包含文本的DOM元素,支持正则表达式
cy.contains('商品生成').click()
//其中.find()不能直接使用cy.find()
//find用来在被定位的元素的后代元素中,搜索并构造一个新的对象
cy.get('.ivu-select-dropdown.ivu-cascader-transfer').find('.ivu-cascader-menu-item').eq(0).click()
```


列举一部分辅助方法

.children()获取定位定位元素的子元素,无参数代表获取所有子元素,有参数则获取指定的子元素

```
cy.get(':nth-child(3) > .nav-menu-item-content').children()
cy.get(':nth-child(3) > .nav-menu-item-content').children('#id')
```


.parents()获取定位元素的所有父元素。

.parent()获取定位元素的父元素

```
cy.get(':nth-child(3) > .nav-menu-item-content').parents()
cy.get(':nth-child(3) > .nav-menu-item-content').parent()
```


.first()获取子元素集的第一个子元素

.last()获取子元素集的最后一个子元素

.next()获取定位元素的下一个同级元素

.nextAll()获取定位元素的所有下一个同级元素

.nextUntil()获取定位元素的所有下一个同级元素,直到找到 Until 里的元素

.prev()获取定位元素的上一个同级元素

.prevAll()获取定位元素的所有上一个同级元素

.prevUntil()获取定位元素的所有上一个同级元素,直到找到 Until 里的元素

.siblings()获取所有同级元素

.eq()按索引查找定位元素的子元素

```
//索引从0开始,eq(0)表示
cy.get('.ivu-select-dropdown.ivu-cascader-transfer').find('.ivu-cascader-menu-item').eq(0).click()
```


3.操作元素方法


.click()点击元素,可以带参数

```
cy.contains('商品生成').click()
//强制点击元素
cy.contains('商品生成').click({force: true})
//点击元素右上角
cy.contains('商品生成').click({'topRight'})
//点击元素左上角
cy.contains('商品生成').click({'topLeft'})
//点击元素正上方
cy.contains('商品生成').click({'top'})
//点击元素右侧
cy.contains('商品生成').click({'right'})
//点击元素中间
cy.contains('商品生成').click({'center'})
//点击元素左侧
cy.contains('商品生成').click({'left'})
//点击元素右下角
cy.contains('商品生成').click({'bottomRight'})
//点击元素左下角
cy.contains('商品生成').click({'bottomLeft'})
//点击元素正下
cy.contains('商品生成').click({'bottom'})
```


.dblclick()双击元素

.rightclick()右击元素

.type()在输入框输入文本

.clear()清除输入的文本值或已有文本

```
cy.get('input[type=text]').clear()
cy.get('input[type=text]').type('123456')
```


如果我们需要操作单选框或复选框,使用 .check(),取消勾选用 .uncheck()

```
<input type="radio" class="ivu-radio-input" name="ivuRadioGroup_1591061954307_27" value="accept">
//选中一个
cy.get('input[type="radio"]').check()
//如果有属性value,则可以通过value的值选中/取消,一个或多个
cy.get('input[type="radio"]').check('accept')
cy.get('input[type="radio"]').check(['accept','另一个值'])
cy.get('input[type="radio"]').uncheck('accept')
cy.get('input[type="radio"]').uncheck(['accept','另一个值'])
```


如果我们要操作 select

```
<select multiple>
  <option value="456">apples</option>
  <option value="457">oranges</option>
  <option value="458">bananas</option>
</select>
//拿文本和拿value的值效果一样
cy.get('select').select(['apples', 'bananas'])
cy.get('select').select(['456', '458'])
```


触发事件,更多可以去官网查询这里不再一一列举

```
//移动光标到目标元素上
cy.get('button').trigger('mouseover')
```


 4.导航相关方法


cy.go() 利用浏览器缓存访问上一页或下一页

```
//后退
cy.go('back')
//下一页、前进
cy.go('forward')
//通过数字控制1前进 -1后退
cy.go(-1) 
cy.go(1) 
```


cy.reload() 刷新页面

cy.reload(true) 强制刷新页面

cy.visit() 访问网址

```
cy.visit('https://www.fewords.cn/')
```


cy.url() 获取当前页面 URL

另 我们可以设置窗口大小 cypress.json 设置如下

图18.jpg



  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   春节档的相关热门话题仍在继续,只不过影迷已经从各影片内容方面的争论,拓展到了对周边衍生品的关注上。  舆论关注度最高的是科幻大片《流浪地球2》的周边产品。外骨骼装甲、行星发动机、门框机器人、机械合金旋挖钻机模型、机械小狗笨笨……关于春节档大片的周边产品,在社交媒体、电商平台上轮番被讨论。  其中,阿里鱼旗下的娱乐电商平台“造点新货”,以众筹形式推出的《流浪地球2》的官方周边衍生品热度最高:截至1月29日14点,该平台有关《流浪地球2》的周边众筹金额累计超过8000万元,并且仍在不断地增长,打破中国文娱类众筹纪录。图源淘宝App  这源于这届影迷对春节档影片的热情。今年属于疫情防控放开后第一...
            0 0 1016
            分享
          •   一名特斯拉前员工告诉英国广播公司(BBC),他认为特斯拉自动驾驶汽车的技术不够安全,不能在公共道路上使用。卢卡斯-克鲁普斯基(Lukasz Krupski)今年 5 月向德国报纸 Handelsblatt 泄露了一些数据,其中包括客户对特斯拉制动和自动驾驶软件的投诉。  他说,他曾试图在内部强调自己的担忧,但被置之不理。  特斯拉没有回应置评请求。  特斯拉首席执行官埃隆-马斯克(Elon Musk)一直在为特斯拉的自动驾驶技术摇旗呐喊。马斯克周六还在 X上发表推文说:"特斯拉拥有迄今为止世界上最好的人工智能。"  但是,在他首次接受英国采访时,克鲁普斯基先生告诉英国广...
            0 0 490
            分享
          • 什么是网络爬虫?相信刚接触爬虫这个词的人都有这样的疑问,网络爬虫可以做什么?它是基于什么样的原理,如果想要学习爬虫,需要掌握什么知识。本文将会对这些问题做一个解释和说明,希望可以帮助正在爬虫入门阶段的朋友。网络爬虫是捜索引擎抓取系统的重要组成部分,爬虫的主要目的是将互联网上的网页下载到本地形成一个互联网内容的镜像备份那么网络爬虫的基本结构和工作流程是什么样的呢?基本的工作流程如下:首先可以选择一部分精心挑选的种子url;将这些URL放入待抓取URL系列;从待抓取URL队列中取出待抓取在URL,解析DNS,并且得到主机的ip,并将URL对应的网页下载下来,存储进已下载网页库中。此外,将这些URL...
            12 12 1553
            分享
          • 随着软件开发过程复杂性的不断增加,客户希望得到新软件的期望周期也越来越短,所以软件测试方法需要不断的发展快速适应新的开发模式,敏捷测试的呼声越来越高,以下是CC先生对敏捷测试的一些思考。敏捷测试的定义在CC先生初次遇到敏捷的时候,认为敏捷只是有关于流程和工具,学习了一系列有关于敏捷的流程和自动化测试的工具,随着对敏捷理解的深入,越发能体会到敏捷不仅仅是关于流程和工具,它是关于人和文化的!受到这种认识的启发,CC先生开始深入了解敏捷的历史。事实证明,人和文化一直是敏捷的核心。敏捷测试也是如此,它不仅是流程和工具的更改,它更倾向于一种新的测试模式,高投入产出比的同时也提供高质量的产品。如果把这些年...
            0 1 1829
            分享
          • 项目背景项目:XX网站环境:Windows需求:并发登录的性能测试场景:1s增加2个线程,运行2000次(线程数20,Ramp-Up seconds 10,循环次数100)。分别看20、40、60并发下的表现监控:成功率、响应时间、标准差、CPU、mem、io等。资源监控需要在Windows下部署监控agent(serveragent)测试步骤1.Web Tours开启关联、注册账号在开始菜单找到并点击Start HP Web Tours Server(或者在本机安装loadRunner的路径下找到\HP\LoadRunner\WebToursStartServer.bat,双击运行)。在开始...
            10 10 1362
            分享
      • 51testing软件测试圈微信