资讯专栏INFORMATION COLUMN

Web 自动化测试框架 sweetest 介绍

lijy91 / 2456人阅读

摘要:介绍是一款自动化测试框架,或者说是解决方案,名字取含义。打开操作,一般要在测试数据中指定新窗口名称,如新窗口百度搜索窗口。测试数据列为要输入的内容。

介绍

sweetest 是一款 Web 自动化测试框架,或者说是解决方案,名字取 Selenium, Web UI, Excel, Element, Test 含义。
特点:

简单快速,轻松上手

无需编码能力

在 Excel 中以文本编写测试用例

维护成本低

支持千、万级别的用例规模

拥抱变化,支持敏捷

背景

目前,Web 自动化测试基本上是以 Selenium 为接口来编写测试代码,但效果往往不是很好,普遍遇到如下问题:

用例设计人员的编码能力很弱,测试代码编写和维护成本高,效果差;

测试代码量大,测试意图不直观,无法支撑千、万级别的用例规模;

Web 页面元素的定位非常繁琐,且页面结构经常变动,导致用例失效。

我们知道,传统的测试用例一般是在 Excel 中用文本编写的,如果自动化测试用例也这么写,是不是就可以解决问题1和2?
对于问题3,我想是时候对开发提出一些要求了,同时我们的元素定位也要优化,让页面自由的去变化,而我们的定位只做最小适用。

实现思路

Selenium 为底层接口;

在 Excel 中用文本编写测试用例;

元素定位表格化,且优先使用“板块通用定位法”;

要求开发提供必要的、统一的元素属性;

框架负责解析测试用例,执行用例,记录日志,输出测试结果。

方案

开发语言:Python

底层接口:Selenium

用例工具:Excel

测试用例如下图:

安装 环境要求

系统要求:Windows

Python 版本:3.6+

Selenium

浏览器:Chrome

Chrome 驱动: chromedriver

安装 sweetest

pip install sweetest

快速体验

打开 cmd 命令窗口,切换到某个目录,如:D:Autotest

sweetest
cd sweetest_sample
python start.py

OK,如果一切顺利的话,sweetest 已经跑起来了

目录结构

目录 说明
element 页面元素表目录
Baidu-Elements.xlsx 页面元素表,名称格式:project_name + "-Elements.xlsx"
junit junit格式测试结果目录
log 自动化测试运行日志目录
report Excel 格式测试结果目录
snapshot 错误截图目录
testcase 测试用例目录
Baidu-TestCase.xlsx 测试用例,名称格式:project_name + "-TestCase.xlsx"
start.py 启动脚本,test = Autotest(project_name, sheet_name)

备注:以上3处的 project_name 必须一致

页面元素表

页面元素表的作用主要是把元素定位独立出来,一是方便维护定位信息,二是测试用例中用元素名称书写,可读性更高。

目录 注释
page element 所在的页面,在所有页面都可用的 element 放在“通用”下面,如 title
frame element 所在的 frame id,如果是顶层 frame,可为空。
name element 名称,在不同的 page 下面可以同名
by Selenium 定义方式
value Selenium 定义的值
备注 注释作用
元素定位

id, link_text, partial_link_text, xpath, class_name

如:

page name by value
百度搜索页面 搜索框 id kw

则自动化运行时会以 find_element_by_id("kw") 来定位

带变量的定位方式

如示例中:

page name by value
百度搜索页面 搜索结果# xpath //*[@id="#"]/h3/a

写用例时,需要在 搜索结果# 后面带上变量,如: 搜索结果#1

操作 页面 元素
点击 百度搜索页面 搜索结果#1

则自动化运行时会以 find_element_by_xpath("//*[@id="1"]/h3/a") 来定位

已定义好的常用变量定位方式:

id#

link#

*link#

xpath#

class#

name#

url#

如:url#www.baidu.com

当然,如果#后面的变量不够直观的话,不建议太多使用这几个变量方式。

页面标题

页面的 title

页面URL

页面的 url

一般来讲,导航栏在所有页面都存在,应该把导航栏放在“通用”下面,做成变量定位方式,如示例中的:

page name by value
通用 搜索页导航栏# xpath //*[@class="s_tab"]//a[text()="#"]

用例中的写法:

操作 页面 元素
点击 通用 搜索页导航栏#新闻

测试用例

下拉菜单配置

操作、页面、元素这些列其实都是选项列表,利用 Excel 的下拉菜单功能,能够让书写用例更方便,且不易笔误。
下图是测试用例文件中的 ElementsMap 页面:

我们可以通过 Excel 的菜单栏“公式-名称管理器”来配置这些菜单,同时在用例页面通过“数据-数据有效性”配置好“操作”的下拉菜单,以及“页面-元素”的二级联动下拉菜单。

用例字段

必填字段:

用例编号

步骤编号

操作

页面

元素

前置条件:

BASE: 整个测试套件的基础,必须通过才会执行下一步,如:登录;如果有的话应该为第一个测试用例。

SETUP:每个测试用例执行前需要执行的用例,只有 SETUP 执行成功才会执行该用例,如:返回首页。

MAIN:一组用例的第一用例,和 SUB 一起使用,一个 MAIN 后面可以带多个连续的 SUB 用例。此用例需要先执行 SETUP 用例。

SUB:和 MAIN 一起使用,当前一个用例(MAIN or SUB)执行结果为通过时才会执行,否则测试结果置为 Blocked;且执行此用例前不会执行 SETUP 用例。

SNIPPET:用例片段,运行到此用例时不会立即执行,需要在其他用例中使用“执行”关键字调用此“用例片段”,才会执行;配合“执行”关键字的变量赋值功能,可以实现用例复用。

注意事项:

一般必须有 SETUP 用例。当执行 SETUP 失败,会尝试执行一次 BASE->SETUP 作为 SETUP 的执行结果。

BASE 用例可以有 0 到多个,但作为 SETUP 中 BASE->SETUP 的 BASE 只有最后一个 BASE 用例。

SETUP 用例只能有 1 条,如果写了多条,只有最后一条起作用。

操作(关键字)及对应的测试数据

打开

get 方法,打开一个链接。

打开操作,一般要在测试数据中指定新窗口名称,如:新窗口=百度搜索窗口。

检查

取页面元素的值、属性和预期结果对比。

测试数据中如果没有写“k=v”的方式,则默认是取元素的 text。

检查 text:

操作 页面 元素 测试数据
检查 百度搜索页面 搜索按钮 百度一下

等价于

操作 页面 元素 测试数据
检查 百度搜索页面 搜索按钮 text=百度一下

检查属性:

操作 页面 元素 测试数据
检查 百度搜索页面 搜索框 name=wd

“页面标题”和“页面URL”直接在测试数据中写预期结果即可。

操作 页面 元素 测试数据
检查 百度搜索页面 页面标题 百度一下,你就知道

注意:测试数据中,由于逗号(,or ,)是多个“k=v”的分隔符,所以如果 v 中有逗号,要用反斜杠()转义;但等号(=)无需转义。

输入

在输入框中输入文本。

测试数据列为要输入的内容。

点击

点击按钮或者链接等(一切可点击操作的)元素。此关键字支持在同一个页面上顺序点击多个元素,在元素列以竖杠(|)分割即可,如:

操作 页面 元素
点击 百度搜索页面 搜索按钮|搜索结果#1

移动到

有些页面元素,当鼠标移动到上面时,会弹出下拉菜单等。此操作同关键字“点击”类似。

执行

即执行测试用例片段,支持在测试数据中给变量赋值,如我们有用例片段 SNIPPET_001,则测试用例 BAIDU_002 中,步骤1如下:

操作 页面 元素 测试数据
执行 用例片段 SNIPPET_001 keywords=搜狗

把变量 keyswords 赋值为“搜狗”,此步骤会执行用例片段 SNIPPET_001,其搜索的关键字为“搜狗”。

检查

把检查结果反向,此关键字暂时未完整实现。

测试数据:

测试数据支持模糊匹配,如下:

操作 页面 元素 测试数据
检查 通用 页面标题 *知乎

则,页面标题中含有“知乎”即为通过。注意星号(*)要写在开头。

输出数据:

在运行时,把元素的值或属性赋值给变量,此变量可以在之后的步骤中使用"<>"引用变量名。

操作 页面 元素 测试数据 输出数据
点击 百度搜索页面 搜索结果#1 title=text
检查 通用 页面标题 </td> </tr> </tbody> </table> <b>步骤编号:</b> <p>除了控制语句符号外,步骤编号必须为数字,建议在 Excel 中设置为文本格式。</p> <p>控制语句:</p> <p> <p>if then else</p> <table> <thead><tr> <th>步骤编号</th> <th>操作</th> <th>页面</th> <th>元素</th> <th>测试数据</th> </tr></thead> <tbody> <tr> <td>^3</td> <td>检查</td> <td>通用</td> <td>页面标题</td> <td>*知乎</td> </tr> <tr> <td>>4</td> <td>点击</td> <td>通用</td> <td colspan="2">link#登录</td> </tr> <tr> <td><5</td> <td>点击</td> <td>通用</td> <td colspan="2">link#注册机构号</td> </tr> </tbody> </table> <p>^ 表示 if 语句</p> <p>> 表示 then 语句</p> <p>< 表示 else 语句</p> <p>if(^) 语句为真时,执行 then(>) 语句,为否时执行 else(<) 语句。无论后面有没有 then 或者 else 语句,不影响后续步骤执行。</p> <p>then 语句 或者 else 语句,当不被执行时,测试结果为 "-",不影响测试用例结果和后续步骤执行。当执行时,和正常步骤一样,成功则继续,失败则该用例失败。</p> </p> <b>进阶</b> <b>元素管理</b> <p>测试用例中元素是以 page + name 为唯一标识,来页面元素表中查找定位信息的。因此,不同 page 下的元素 name 可以相同,但不能和“通用”下的相同。</p> <p>测试用例中,如果 page 不为“通用”,当 <page> + name 查找不到,会继续以 “通用” + name 为标识符来查找。</p> <p>“通用”是方便我们写页面元素表的,写用例时我们建议还是用 <page> 来代替“通用”,甚至有时候我们必须这么做。</p> <b>窗口管理(页面,frame)</b> <p>在浏览器中,有可能会打开多个标签页,我们叫它为窗口。当你新打开一个标签页时,你可以在测试数据中给它起个名字,格式为:新窗口=<window_name>, 如:</p> <table> <thead><tr> <th>操作</th> <th>页面</th> <th>元素</th> <th>测试数据</th> </tr></thead> <tbody> <tr> <td>打开</td> <td>通用</td> <td>百度搜索链接</td> <td>新窗口=百度搜索窗口</td> </tr> <tr> <td>检查</td> <td>百度搜索页面</td> <td>页面标题</td> <td>百度一下,你就知道</td> </tr> </tbody> </table> <p>当你给新的标签页起了窗口名字,它之后步骤的页面("通用"除外)就会绑定到这个窗口。如上面第 2 步,“百度搜索页面”会绑定到“百度搜索窗口”。那么之后的步骤或用例中,即使打开了多个标签页,只要页面是“百度搜索页面”,就会切换到“百度搜索窗口”这个标签页上操作。</p> <p>注意:“通用”是不绑定到任何窗口的,也不做窗口切换,它直接在“当前窗口”操作。</p> <p>“当前窗口”规则为:</p> <p>执行到某个步骤时,“当前窗口”是浏览器焦点所在的窗口,也就是上个步骤执行操作的窗口。</p> <p>如果此步骤的页面已绑定到其他窗口,则“当前窗口”会切换过去。</p> <p>如果此步骤的页面尚未捆定任何窗口,则会捆定到“当前窗口”。</p> <p>上个步骤如果是新打开的窗口,则“当前窗口”是新打开的窗口。</p> <p>注意:</p> <p>如果打开了 2 个或以上窗口,没有起名字的窗口,在执行到切换窗口的步骤时,会自动被关掉。</p> <p>起了名字的窗口不会被关掉。</p> <p>但如果起了同样的名字,则原先的那个窗口会被关掉,绑定在其上面的页面也会被注销。</p> <b>测试执行</b> <p><b>python start.py</b></p> <b>测试报告</b> <p>见 report 目录</p> <pre> <p>QQ交流群:158755338 (验证码:python)</p> <p>项目地址:https://github.com/tonglei100...</p> </pre> </div> <div class="mt-64 tags-seach" > <div class="tags-info"> <a style="width:120px;" title="GPU云服务器" href="https://www.ucloud.cn/site/product/gpu.html">GPU云服务器</a> <a style="width:120px;" title="云服务器" href="https://www.ucloud.cn/site/active/kuaijiesale.html?ytag=seo">云服务器</a> <a style="width:120px;" title="python自动化测试框架" href="https://www.ucloud.cn/yun/tag/pythonzidonghuaceshikuangjia/">python自动化测试框架</a> <a style="width:120px;" title="android自动化测试框架" href="https://www.ucloud.cn/yun/tag/androidzidonghuaceshikuangjia/">android自动化测试框架</a> <a style="width:120px;" title="web前端自动化测试" href="https://www.ucloud.cn/yun/tag/webqianduanzidonghuaceshi/">web前端自动化测试</a> <a style="width:120px;" title="web 自动化测试工具" href="https://www.ucloud.cn/yun/tag/web zidonghuaceshigongju/">web 自动化测试工具</a> </div> </div> <div class="entry-copyright mb-30"> <p class="mb-15"> 文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。</p> <p>转载请注明本文地址:https://www.ucloud.cn/yun/40944.html</p> </div> <ul class="pre-next-page"> <li class="ellipsis"><a class="hpf" href="https://www.ucloud.cn/yun/40943.html">上一篇:python判断变量类型时,判断一个变量的类型时为什么不使用type(),而是用isinstance</a></li> <li class="ellipsis"><a class="hpf" href="https://www.ucloud.cn/yun/40945.html">下一篇:django rest framework个人学习笔记(六)————Tutorial4.认证于授权</a></li> </ul> </div> <div class="about_topicone-mid"> <h3 class="top-com-title mb-0"><span data-id="0">相关文章</span></h3> <ul class="com_white-left-mid atricle-list-box"> <li> <div class="atricle-list-right"> <h2 class="ellipsis2"><a class="hpf" href="https://www.ucloud.cn/yun/70409.html"><b>[直播视频] 《Java 微服务实践 - Spring Boot 系列》限时折扣</b></a></h2> <p class="ellipsis2 good">摘要:作为微服务的基础设施之一,背靠强大的生态社区,支撑技术体系。微服务实践为系列讲座,专题直播节,时长高达小时,包括目前最流行技术,深入源码分析,授人以渔的方式,帮助初学者深入浅出地掌握,为高阶从业人员抛砖引玉。 简介 目前业界最流行的微服务架构正在或者已被各种规模的互联网公司广泛接受和认可,业已成为互联网开发人员必备技术。无论是互联网、云计算还是大数据,Java平台已成为全栈的生态体系,...</p> <div class="com_white-left-info"> <div class="com_white-left-infol"> <a href="https://www.ucloud.cn/yun/u-912.html"><img src="https://www.ucloud.cn/yun/data/avatar/000/00/09/small_000000912.jpg" alt=""><span class="layui-hide64">Enlightenment</span></a> <time datetime="">2019-08-16 10:45</time> <span><i class="fa fa-commenting"></i>评论0</span> <span><i class="fa fa-star"></i>收藏0</span> </div> </div> </div> </li> <li> <div class="atricle-list-right"> <h2 class="ellipsis2"><a class="hpf" href="https://www.ucloud.cn/yun/121350.html"><b><em>自<em>动化</em></em><em>测试</em>系列(三)|UI<em>测试</em></b></a></h2> <p class="ellipsis2 good">摘要:在上次的自动化测试系列二自动化测试系列二中为大家大体介绍了测试的概念及在猪齿鱼中的实践展开,本文主要围绕测试进行概念介绍及中的实践展开。手动测试要求测试人员在每个元素上手动执行每个测试。主要是用于回归测试和同一软件的新版本测试。 UI 测试是一种测试类型,也称为用户界面测试,通过该测试,我们...</p> <div class="com_white-left-info"> <div class="com_white-left-infol"> <a href="https://www.ucloud.cn/yun/u-109.html"><img src="https://www.ucloud.cn/yun/data/avatar/000/00/01/small_000000109.jpg" alt=""><span class="layui-hide64">pingan8787</span></a> <time datetime="">2021-09-28 09:35</time> <span><i class="fa fa-commenting"></i>评论0</span> <span><i class="fa fa-star"></i>收藏0</span> </div> </div> </div> </li> <li> <div class="atricle-list-right"> <h2 class="ellipsis2"><a class="hpf" href="https://www.ucloud.cn/yun/87412.html"><b>前端每周清单半年盘点之 JavaScript 篇</b></a></h2> <p class="ellipsis2 good">摘要:前端每周清单专注前端领域内容,以对外文资料的搜集为主,帮助开发者了解一周前端热点分为新闻热点开发教程工程实践深度阅读开源项目巅峰人生等栏目。背后的故事本文是对于年之间世界发生的大事件的详细介绍,阐述了从提出到角力到流产的前世今生。 前端每周清单专注前端领域内容,以对外文资料的搜集为主,帮助开发者了解一周前端热点;分为新闻热点、开发教程、工程实践、深度阅读、开源项目、巅峰人生等栏目。欢迎...</p> <div class="com_white-left-info"> <div class="com_white-left-infol"> <a href="https://www.ucloud.cn/yun/u-1530.html"><img src="https://www.ucloud.cn/yun/data/avatar/000/00/15/small_000001530.jpg" alt=""><span class="layui-hide64">Vixb</span></a> <time datetime="">2019-08-21 12:04</time> <span><i class="fa fa-commenting"></i>评论0</span> <span><i class="fa fa-star"></i>收藏0</span> </div> </div> </div> </li> <li> <div class="atricle-list-right"> <h2 class="ellipsis2"><a class="hpf" href="https://www.ucloud.cn/yun/8812.html"><b>有赞 <em>WEB</em>-UI <em>自<em>动化</em></em>实践</b></a></h2> <p class="ellipsis2 good">摘要:概述是由有赞开发的自动化工具,并以此实现了端和端的核心业务的自动化。旨在简化开源工具提供的接口,方便自动化测试用例的设计。元素定位自动化用例其实可以分成两部分,定位元素调用接口操作该元素。一台用于跑自动化用例的服务器。 概述 Bee 是由有赞 QA 开发的 UI 自动化工具,并以此实现了 web 端和 wap 端的核心业务的自动化。旨在简化开源工具提供的接口,方便 UI 自动化测试用例...</p> <div class="com_white-left-info"> <div class="com_white-left-infol"> <a href="https://www.ucloud.cn/yun/u-1392.html"><img src="https://www.ucloud.cn/yun/data/avatar/000/00/13/small_000001392.jpg" alt=""><span class="layui-hide64">h9911</span></a> <time datetime="">2019-05-29 17:04</time> <span><i class="fa fa-commenting"></i>评论0</span> <span><i class="fa fa-star"></i>收藏0</span> </div> </div> </div> </li> </ul> </div> <div class="topicone-box-wangeditor"> <h3 class="top-com-title mb-64"><span>发表评论</span></h3> <div class="xcp-publish-main flex_box_zd"> <div class="unlogin-pinglun-box"> <a href="javascript:login()" class="grad">登陆后可评论</a> </div> </div> </div> <div class="site-box-content"> <div class="site-content-title"> <h3 class="top-com-title mb-64"><span>0条评论</span></h3> </div> <div class="pages"></ul></div> </div> </div> <div class="layui-col-md4 layui-col-lg3 com_white-right site-wrap-right"> <div class=""> <div class="com_layuiright-box user-msgbox"> <a href="https://www.ucloud.cn/yun/u-1350.html"><img src="https://www.ucloud.cn/yun/data/avatar/000/00/13/small_000001350.jpg" alt=""></a> <h3><a href="https://www.ucloud.cn/yun/u-1350.html" rel="nofollow">lijy91</a></h3> <h6>男<span>|</span>高级讲师</h6> <div class="flex_box_zd user-msgbox-atten"> <a href="javascript:attentto_user(1350)" id="attenttouser_1350" class="grad follow-btn notfollow attention">我要关注</a> <a href="javascript:login()" title="发私信" >我要私信</a> </div> <div class="user-msgbox-list flex_box_zd"> <h3 class="hpf">TA的文章</h3> <a href="https://www.ucloud.cn/yun/ut-1350.html" class="box_hxjz">阅读更多</a> </div> <ul class="user-msgbox-ul"> <li><h3 class="ellipsis"><a href="https://www.ucloud.cn/yun/122935.html">Dmit,全新日本Pro VPS 8折,100M大带宽,CN2 GIA/10099(9929)/CM</a></h3> <p>阅读 3060<span>·</span>2021-11-10 11:36</p></li> <li><h3 class="ellipsis"><a href="https://www.ucloud.cn/yun/122432.html">实战!《长津湖》为什么这么火爆?我用 Python 来分析猫眼影评</a></h3> <p>阅读 3224<span>·</span>2021-10-13 09:40</p></li> <li><h3 class="ellipsis"><a href="https://www.ucloud.cn/yun/121081.html">Arduino开发-TFT_eSPI库学习</a></h3> <p>阅读 5803<span>·</span>2021-09-26 09:46</p></li> <li><h3 class="ellipsis"><a href="https://www.ucloud.cn/yun/117294.html">天天都在使用CSS,那么CSS的原理是什么呢?</a></h3> <p>阅读 636<span>·</span>2019-08-30 15:55</p></li> <li><h3 class="ellipsis"><a href="https://www.ucloud.cn/yun/116679.html">Codepen 每日精选(2018-4-10)</a></h3> <p>阅读 1386<span>·</span>2019-08-30 15:53</p></li> <li><h3 class="ellipsis"><a href="https://www.ucloud.cn/yun/112793.html">CSS网格布局基础</a></h3> <p>阅读 1538<span>·</span>2019-08-29 13:55</p></li> <li><h3 class="ellipsis"><a href="https://www.ucloud.cn/yun/112136.html">纯CSS的星级评价效果</a></h3> <p>阅读 2962<span>·</span>2019-08-29 12:46</p></li> <li><h3 class="ellipsis"><a href="https://www.ucloud.cn/yun/111993.html">CSS题目及答案整理</a></h3> <p>阅读 3171<span>·</span>2019-08-29 12:34</p></li> </ul> </div> <!-- 文章详情右侧广告--> <div class="com_layuiright-box"> <h6 class="top-com-title"><span>最新活动</span></h6> <div class="com_adbox"> <div class="layui-carousel" id="right-item"> <div carousel-item> <div> <a href="https://www.ucloud.cn/site/active/kuaijiesale.html?ytag=seo" rel="nofollow"> <img src="https://www.ucloud.cn/yun/data/attach/240625/2rTjEHmi.png" alt="云服务器"> </a> </div> <div> <a href="https://www.ucloud.cn/site/product/gpu.html" rel="nofollow"> <img src="https://www.ucloud.cn/yun/data/attach/240807/7NjZjdrd.png" alt="GPU云服务器"> </a> </div> </div> </div> </div> <!-- banner结束 --> <div class="adhtml"> </div> <script> $(function(){ $.ajax({ type: "GET", url:"https://www.ucloud.cn/yun/ad/getad/1.html", cache: false, success: function(text){ $(".adhtml").html(text); } }); }) </script> </div> </div> </div> </div> </div> </section> <!-- wap拉出按钮 --> <div class="site-tree-mobile layui-hide"> <i class="layui-icon layui-icon-spread-left"></i> </div> <!-- wap遮罩层 --> <div class="site-mobile-shade"></div> <!--付费阅读 --> <div id="payread"> <div class="layui-form-item">阅读需要支付1元查看</div> <div class="layui-form-item"><button class="btn-right">支付并查看</button></div> </div> <script> var prei=0; $(".site-seo-depict pre").each(function(){ var html=$(this).html().replace("<code>","").replace("</code>","").replace('<code class="javascript hljs" codemark="1">',''); $(this).attr('data-clipboard-text',html).attr("id","pre"+prei); $(this).html("").append("<code>"+html+"</code>"); prei++; }) $(".site-seo-depict img").each(function(){ if($(this).attr("src").indexOf('data:image/svg+xml')!= -1){ $(this).remove(); } }) $("LINK[href*='style-49037e4d27.css']").remove(); $("LINK[href*='markdown_views-d7a94ec6ab.css']").remove(); layui.use(['jquery', 'layer','code'], function(){ $("pre").attr("class","layui-code"); $("pre").attr("lay-title",""); $("pre").attr("lay-skin",""); layui.code(); $(".layui-code-h3 a").attr("class","copycode").html("复制代码 ").attr("onclick","copycode(this)"); }); function copycode(target){ var id=$(target).parent().parent().attr("id"); var clipboard = new ClipboardJS("#"+id); clipboard.on('success', function(e) { e.clearSelection(); alert("复制成功") }); clipboard.on('error', function(e) { alert("复制失败") }); } //$(".site-seo-depict").html($(".site-seo-depict").html().slice(0, -5)); </script> <link rel="stylesheet" type="text/css" href="https://www.ucloud.cn/yun/static/js/neweditor/code/styles/tomorrow-night-eighties.css"> <script src="https://www.ucloud.cn/yun/static/js/neweditor/code/highlight.pack.js" type="text/javascript"></script> <script src="https://www.ucloud.cn/yun/static/js/clipboard.js"></script> <script>hljs.initHighlightingOnLoad();</script> <script> function setcode(){ var _html=''; document.querySelectorAll('pre code').forEach((block) => { var _tmptext=$.trim($(block).text()); if(_tmptext!=''){ _html=_html+_tmptext; console.log(_html); } }); } </script> <script> function payread(){ layer.open({ type: 1, title:"付费阅读", shadeClose: true, content: $('#payread') }); } // 举报 function jupao_tip(){ layer.open({ type: 1, title:false, shadeClose: true, content: $('#jubao') }); } $(".getcommentlist").click(function(){ var _id=$(this).attr("dataid"); var _tid=$(this).attr("datatid"); $("#articlecommentlist"+_id).toggleClass("hide"); var flag=$("#articlecommentlist"+_id).attr("dataflag"); if(flag==1){ flag=0; }else{ flag=1; //加载评论 loadarticlecommentlist(_id,_tid); } $("#articlecommentlist"+_id).attr("dataflag",flag); }) $(".add-comment-btn").click(function(){ var _id=$(this).attr("dataid"); $(".formcomment"+_id).toggleClass("hide"); }) $(".btn-sendartcomment").click(function(){ var _aid=$(this).attr("dataid"); var _tid=$(this).attr("datatid"); var _content=$.trim($(".commenttext"+_aid).val()); if(_content==''){ alert("评论内容不能为空"); return false; } var touid=$("#btnsendcomment"+_aid).attr("touid"); if(touid==null){ touid=0; } addarticlecomment(_tid,_aid,_content,touid); }) $(".button_agree").click(function(){ var supportobj = $(this); var tid = $(this).attr("id"); $.ajax({ type: "GET", url:"https://www.ucloud.cn/yun/index.php?topic/ajaxhassupport/" + tid, cache: false, success: function(hassupport){ if (hassupport != '1'){ $.ajax({ type: "GET", cache:false, url: "https://www.ucloud.cn/yun/index.php?topic/ajaxaddsupport/" + tid, success: function(comments) { supportobj.find("span").html(comments+"人赞"); } }); }else{ alert("您已经赞过"); } } }); }); function attenquestion(_tid,_rs){ $.ajax({ //提交数据的类型 POST GET type:"POST", //提交的网址 url:"https://www.ucloud.cn/yun/favorite/topicadd.html", //提交的数据 data:{tid:_tid,rs:_rs}, //返回数据的格式 datatype: "json",//"xml", "html", "script", "json", "jsonp", "text". //在请求之前调用的函数 beforeSend:function(){}, //成功返回之后调用的函数 success:function(data){ var data=eval("("+data+")"); console.log(data) if(data.code==2000){ layer.msg(data.msg,function(){ if(data.rs==1){ //取消收藏 $(".layui-layer-tips").attr("data-tips","收藏文章"); $(".layui-layer-tips").html('<i class="fa fa-heart-o"></i>'); } if(data.rs==0){ //收藏成功 $(".layui-layer-tips").attr("data-tips","已收藏文章"); $(".layui-layer-tips").html('<i class="fa fa-heart"></i>') } }) }else{ layer.msg(data.msg) } } , //调用执行后调用的函数 complete: function(XMLHttpRequest, textStatus){ postadopt=true; }, //调用出错执行的函数 error: function(){ //请求出错处理 postadopt=false; } }); } </script> <footer> <div class="layui-container"> <div class="flex_box_zd"> <div class="left-footer"> <h6><a href="https://www.ucloud.cn/"><img src="https://www.ucloud.cn/yun/static/theme/ukd//images/logo.png" alt="UCloud (优刻得科技股份有限公司)"></a></h6> <p>UCloud (优刻得科技股份有限公司)是中立、安全的云计算服务平台,坚持中立,不涉足客户业务领域。公司自主研发IaaS、PaaS、大数据流通平台、AI服务平台等一系列云计算产品,并深入了解互联网、传统企业在不同场景下的业务需求,提供公有云、混合云、私有云、专有云在内的综合性行业解决方案。</p> </div> <div class="right-footer layui-hidemd"> <ul class="flex_box_zd"> <li> <h6>UCloud与云服务</h6> <p><a href="https://www.ucloud.cn/site/about/intro/">公司介绍</a></p> <p><a href="https://zhaopin.ucloud.cn/" >加入我们</a></p> <p><a href="https://www.ucloud.cn/site/ucan/onlineclass/">UCan线上公开课</a></p> <p><a href="https://www.ucloud.cn/site/solutions.html" >行业解决方案</a></p> <p><a href="https://www.ucloud.cn/site/pro-notice/">产品动态</a></p> </li> <li> <h6>友情链接</h6> <p><a href="https://www.compshare.cn/?ytag=seo">GPU算力平台</a></p> <p><a href="https://www.ucloudstack.com/?ytag=seo">UCloud私有云</a></p> <p><a href="https://www.surfercloud.com/">SurferCloud</a></p> <p><a href="https://www.uwin-link.com/">工厂仿真软件</a></p> <p><a href="https://pinex.it/">Pinex</a></p> <p><a href="https://www.picpik.ai/zh">AI绘画</a></p> </li> <li> <h6>社区栏目</h6> <p><a href="https://www.ucloud.cn/yun/column/index.html">专栏文章</a></p> <p><a href="https://www.ucloud.cn/yun/udata/">专题地图</a></p> </li> <li> <h6>常见问题</h6> <p><a href="https://www.ucloud.cn/site/ucsafe/notice.html" >安全中心</a></p> <p><a href="https://www.ucloud.cn/site/about/news/recent/" >新闻动态</a></p> <p><a href="https://www.ucloud.cn/site/about/news/report/">媒体动态</a></p> <p><a href="https://www.ucloud.cn/site/cases.html">客户案例</a></p> <p><a href="https://www.ucloud.cn/site/notice/">公告</a></p> </li> <li> <span><img src="https://static.ucloud.cn/7a4b6983f4b94bcb97380adc5d073865.png" alt="优刻得"></span> <p>扫扫了解更多</p></div> </div> <div class="copyright">Copyright © 2012-2023 UCloud 优刻得科技股份有限公司<i>|</i><a rel="nofollow" href="http://beian.miit.gov.cn/">沪公网安备 31011002000058号</a><i>|</i><a rel="nofollow" href="http://beian.miit.gov.cn/"></a> 沪ICP备12020087号-3</a><i>|</i> <script type="text/javascript" src="https://gyfk12.kuaishang.cn/bs/ks.j?cI=197688&fI=125915" charset="utf-8"></script> <script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?290c2650b305fc9fff0dbdcafe48b59d"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script> <!-- Global site tag (gtag.js) - Google Analytics --> <script async src="https://www.googletagmanager.com/gtag/js?id=G-DZSMXQ3P9N"></script> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-DZSMXQ3P9N'); </script> <script> (function(){ var el = document.createElement("script"); el.src = "https://lf1-cdn-tos.bytegoofy.com/goofy/ttzz/push.js?99f50ea166557aed914eb4a66a7a70a4709cbb98a54ecb576877d99556fb4bfc3d72cd14f8a76432df3935ab77ec54f830517b3cb210f7fd334f50ccb772134a"; el.id = "ttzz"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(el, s); })(window) </script></div> </div> </footer> </body> <script src="https://www.ucloud.cn/yun/static/theme/ukd/js/common.js"></script> <<script type="text/javascript"> $(".site-seo-depict *,.site-content-answer-body *,.site-body-depict *").css("max-width","100%"); </script> </html>