RIDE使用教程

一、Robot Framework简介

1)Robot Framework

Robot Framework是一款用Python编写的功能自动化测试框架,支持关键字驱动且可扩展性好。它主要用于需要进行多次验收的系统测试,或者验收测试驱动开发,尤其对于一些常年需要维护的系统来说,价值更大。

2)RIDE

RIDE是一款专门用来编辑Robot Framework用例的软件,用Python编写并且开源。当我们针对一个系统编写好一套脚本后,每当我们对系统做一些更改的时候,便可以把已经写好的脚本拿出来稍作修改,通过执行这些脚本就可以检测系统的功能是否依旧完好。系统需要一个不断完善的过程,而RIDE用例也将随着系统的变更做着相应的修改。

3)特点:

a.测试用例使用文本文件保存;b.测试用例支持变量的使用,也可使用if语句和for循环,测试人员可根据自身情况创建自己需要的测试库;c.测试执行报告和日志是html格式的,容易阅读;d.支持关键字驱动、数据驱动和行为驱动等等

RIDE使用教程

(1)启动ride

启动ride方法:

  1. 通过界面图标
image.png
  1. dos命令行:进入dos窗口,输入ride.py,按回车即可

推荐第二种打开方式,这样可以方便看到里面的报错日志


image.png

进入RIDE界面


image.png

(2)菜单栏

1.File

image.png

1>New Project:新建工程

2>Open Test Suite:打开测试套件

3>Open Directory:打开目录

4>Save:保存(保存当前鼠标所定位到的案例)

5>Save All:保存全部

6>展示最近打开的工程,最多展示4个,可以直接切换工程

7>Exit:退出

2.Edit

image.png

1>Add Tag to selected:对选中的案例增加Tag标签,可批量增加

2>Clear Selected:清除选中的案例

3>Undo:撤销 ctrl+z

4>Redo:重做 ctrl+y

5>Cut:剪切 ctrl+x

6>Copy:复制 ctrl+c

7>Paste:粘贴 ctrl+v

8>Insert:插入

9>Delete:删除

10>Comment:注释当前行,可批量操作

11>Uncomment:取消当前行注释,可批量操作

12>Insert Cells:插入单元格

13>Delete Cells:删除单元格

14>Inset Rows:插入行

15>Delete Rows:删除行

3.Tools

image.png

1>Run Test with Debug:以debug形式运行测试案例

2>Run Tests:运行测试案例

3>Stop Test Run:停止案例运行

4>Search Tests:搜索测试案例(可以通过名称或Tag标签搜索案例)

5>Search Keywords:搜索关键字(查找测试库的关键字以及参数和例子)

6>Search Unused Keywords:搜索未使用的关键字

7>Content Assistance:内容助手(用来做脚本补全)

8>Preview:预览(预览测试套件的文件内容,可以选择格式来查看或打印)

9>Manage Plugins:管理插件

10>View All Tags:查看所有Tag

11>Import Library Spec XML:导入测试库描述文件XML(对于不能直接安装的测试库,可以用命令生成XML文档,然后导入,一般不会使用)

12>View RIDE Log:查看RIDE日志

13>Create RIDE Desktop Shortcut:创建RIDE快捷方式(这个可以直接生成快捷方式,比上一篇的更方便,推荐这个,不用改图标哦)

14>Preferences:参数配置

①Saving:可以设置默认的文件格式、文本格式分隔符、行分隔符、单元格之前4个空格分隔

②Importing

Auto imports:设置自动导入哪些Library库

Pythonpath:用于搜索Library库

Library xml directories:用于搜索Library xml目录

③Gird Editor:用于设置写案例的表格里的字体大小和颜色

④Text Editor:用于设置写案例的文本编辑模式里的字体大小和颜色

⑤Excludes:排除(在文本框输入需要排除的路径,一行一个,保存后重新启动生效,RIDE不会去识别该目录下的文件)

4.Navigate导航

1>Go Back:后退

2>Go Forward:前进

5.Macros宏命令

管理运行配置:可以增加或移除操作,增加之后可直接在该选项下点击运行

6.Help

1>Shortcut keys:快捷键列表

2>User Guide:用户指南

3>Report a Problem:报告问题

4>Release notes:更新日志

5>About:关于

三、工程文件区

最简单的工程文件区组成:

image.png

工程右键可做操作

1>New Suite:新建测试套件

2>New Directory:新建目录测试套件

3>New Resource:新建资源

4>New User Keyword:新建用户关键字

5>New Scalar:新建变量

6>New List Variable:新建列表型变量

7>New Dictionary Variable:新建词典变量

8>Change Format:修改格式(可以修改工程的格式)

9>Select All Tests:选择全部测试案例

10>Deselect All Tests:取消选择全部测试案例

11>Select Only Failed Tests:只选择失败的测试案例

12>Select Only Passed Tests:只选择成功的测试案例

13>Expand all:展开全部目录

14>Collapse all:折叠全部目录

工作区

1.Edit页面

1>测试套件和资源的编辑页面

两者基本一致

image.png

①Source:显示当前套件的路径

②Settings:单击显示

目录型工程和目录型测试套件的Settings设置项

①>Documentation:说明文档,写对当前工程的说明,加粗:XXXX,斜体:XXXX

②>Suite Setup:测试套件初始化

③>Suite Teardown:测试套件结束

④>Test Setup:测试案例初始化

⑤>Test Teardown:测试案例结束

⑥>Force Tags:强制标记,给当前测试套件下的每个测试案例都加上Tag,在测试案例上不能删除,只能在设置的地方删除

③Library:加载测试库

④Resource:加载资源

⑤Variables:加载变量文件

⑥Import Failed Help:导入失败的帮助

⑦Add Scalar:定义变量

⑧Add List:定义列表型变量

⑨Add Dict:定义词典

⑩Add Metadata:定义元数据,定义之后Report和Log显示定义好的内容

2>测试案例的编辑页面

(3.1)创建新工程

点击File→选择New project;

在弹出框中填写项目名称→“type”选择Directory,

“Format”选择ROBOT;

选择好地址;

点击“OK”。

如下图:

image.png

(3.2)创建测试套件(suite)

测试套件可以理解为是模块(文件夹)的意思

创建方法:

  1. 右键点击First Test,在弹出的右键菜单项中选择New Suite,然后输入测试套名字

  2. 快捷键:ctrl+shift+f

image.png

(3.3)创建测试用例

创建单独的自动化脚本用例

创建方法:

  1. 右键点击test_suite,在弹出的右键菜单中选择New Test Case,输入用例名,保存即可

  2. 快捷键:ctrl+shift+t

image.png

创建好后层级区别

最外层是项目,一个项目里面可以多有个测试套件(模块),一个套件里可以有多个用例。

如果看到名称前方有个*,代表修改后未保存,记得保存

image.png

保存

image.png

快捷键:

ctrl+s(局部保存,只保存鼠标点击的部分)

ctrl+shift+s(保存整个工程)

保存之后*号消失

(3.4)Edit介绍

image.png

(3):定义元数据

Add Metadata:定义元数据。我们用不着。作用是在 report和 log 里显示定义好的内容,格式和 document 一样

(3.5)导入库

Selenium 是非常流行的开源 web 自动化测试工具,对于大多使用 Robot Framework 框架的人都会使用 Selenium2Library 库来进行 web 自动化测试。所以,我们来学习 Selenium2Library 库。
Selenium 介绍
Selenium 自动化测试工具,它主要是用于 Web 应用程序的自动化测试。
Selenium 的特点:
 开源,免费
 多浏览器支持:FireFox、Chrome、IE
 多平台支持:linux 、windows、MAC
 多语言支持:Python、java、Ruby、php、C#、JavaScript
 对 web 页面有良好的支持
 简单(API 简单)、灵活(用开发语言驱动)
 支持分布式测试用例执行
Selenium 是支持多种开发语言的,对于不同的语言来说都有其对应的库。
对 Robot Framework 框 架 的 Selenium 库 有 两 个 :
SeleniumLibrary 和 Selenium2Library 。
SeleniumLibrary 是基于 Selenium1.0 开发的,Selenium2Library 是基于 Selenium2.0 开发的。
如果没有历史遗留问题,我们直接使用 Selenium2Library。里面也包含了SeleniumLibrary里所有的关键字
点击 Edit 标签页右侧的“Library”按钮,来添加库。
在添加库之前,首先库已经在 Python 下进行了安装。
如,添加“Screenshot”库。
如果添加的库不存在或库名错误,将会红色显示,黑库名正常表示正常。
如果你是在“测试套件”中添加的库,那么这个库中所提供的关键字可以被当前测试套件下的用例使用。
如果你是在“测试项目”中添加的库,当前项目下的测试用例不能使用库中的关键字,需要在用例相应的“测试套件”中再次添加库。
按 F5 就可以查看库中所提供的关键字。

image.png

导入成功

image.png

3.6)导入资源

点击 Edit 标签页右侧的“Resource”按钮来添加资源。

这个资源一般为项目相关的文件。

比如,项目的自定义资源文件。

image.png

注意:python 3有个小bug从Resource里导入会导致RIDE崩溃。

可以在Text Edit里写Resource 通用元素层.txt


image.png

(3.7)定义变量

点击 Edit 标签页右侧的“Add Scalar”按钮来创建变量。这里创建的变量可以被整个测试套件中的用例所使用。

也可以认为是一个“公共变量”(环境变量)

Name 用于定义变量名,这里给它叫:${abc} Value 用于给变量赋值。这里赋值是一段话:“欢迎大家“

下面就可以在测试用例中来使用这个变量

image.png
image.png

(3.8)Text Edit 标签

我们在 Edit 标签页完成的工作,都可以在 Text Edit 标签页上完成。

它们之间是对应关系,Edit 可视化的提供的按钮输入框,对于用户来说更容易知道我要怎么做;

而在 Text Edit 中只是一个空当当的文本,我们跟本不知道如何下手。

好在我们已经在 Edit 中做了很多事情。切换到 Text Edit 将会看到这些信息的展示

image.png

可以理解位text edit是编写脚本的另外一种方式

测试用例的本来面目也是这个样子的,只是在 RIDE 中对它进行的“美化”。

其实在这个在 Text Edit 下或第三方编辑器下编写 Robot Framework 测试的效率要远远高于 Edit 标签中的“填表格”式编写。 大家前期可以就在表格里填写脚本,后期熟练后可以在其他地方进行尝试。

可以在两种标签页之间切换来提高用例的开发效率

(3.9)Run

image.png

(3.10)报告和日志

当用例运行结束,Robot Framework 生成三个文件:output.xml、log.html 和 report.html。output.xml 记录的测试结果是 xml 文件,这个文件不够直观。不建议看。相比较而言 log.html 和 report.html 报告要直观得多,因为是 html 格式的嘛。

查看 log.html 文件,点击 Run 标签而上的“Log”按钮,通过默认浏览器打开。在 log.html 文件中可以查看用例执行的每一步,适合跟踪定义问题。

查看 report.html,点击 Run 标签而上的“Report”按钮,通过默认浏览器打开。report.html 用于最终结果的展示,适合了解测试用例的执行情况:测试了哪些模块,用例数、失败率等

image.png
image.png

(3.11)测试用例的 Settings

点击测试用例上的“Settings>>”按钮,会看到下面的选项,并且这些选项是可以隐藏的

点击测试套件上的“Settings>>”按钮,也能看到类似的选项

image.png

(3.12)右键翻译

项目右键:

image.png

套件右键

image.png

用例右键:

image.png

(4.1)写自动化脚本

首先选中要执行的测试用例,勾选

执行方法:

  1. 点击工作区中的Run,然后点击Start按钮
image.png
  1. 快捷键:F8

3)选择脚本后,点击

输入框状态:

白色:代表可输入区域

浅灰色:代表有默认值, ----可以不用输入,也可以输入

深灰色:代表无需输入

红色:代表警告报错 ----写错或者未输入

字体状态:

蓝色:代表输入的关键字正确

粗体黑色:代表输入的关键字错误

普通黑色:无实际意义,代表输入正常

绿色:代表输入的是一个变量

紫色:代表该未找到该变量

红色:代表警告报错 ----写错或者未输入

image.png

(4.2)执行页面

image.png

(4.3)快捷键:

自动补全关键字1——》ctrl+shift+空格
自动补全关键字2——》ctrl+alt+空格
搜索关键字——》F5
执行用例——》F8
保存整个工程——》ctrl+shit+s
局部保存,保存鼠标点击的部分——》ctrl+s
重命名——》F2
显示关键字信息——》 ctrl+鼠标悬浮(鼠标悬浮于关键字上)
创建新工程——》ctrl+n
创建新测试套——》ctrl+shift+f
创建新用例——》ctrl+shift+t
创建新关键字——》ctrl+shift+k
向上移动用例——》ctrl+↑
向下移动用例——》ctrl+↓
删除行——》ctrl+d
删除单元格——》ctrl+shift+d
插入单元格——》ctrl+shift+i
插入行——》ctrl+i
屏蔽代码——》ctrl+#
取消屏蔽——》ctrl+$
查看log——》ctrl+L
查看report——》ctrl+r
注意:如果快捷键不能使用,先看看是否有其他软件已占用相应的快捷键

(4.4)定位元素

对于 Web 自动化测试来说,就是操作页面上的各种元素,在操作元素之间需要先找到元素,换句话说就是定位元素。Selenium2Library 提供了非常丰富的定位器

定位:找到要想去操作的元素的坐标或者位置

虽然有很多种定位方式,并不是要求我们每一种都要学会。

在这里我只介绍 几种常见的定位方式:

id、name、xpath 和 css,class,link。

介绍 id 和 name,是因为这两种定位方式非常简单且实用,

介绍 xpath 和 css,是因为这两种定位方式足够强大,可以满足几乎所有定位需求。

介绍class,link,是因为这种方式很方便,可以减少我们寻找定位的时间.

通常浏览器可以通过 F12 快捷键打开自带的前端工具查 看页面元素。例如:chrome,fixfox,ie

image.png

选取页面坐标

image.png

id 和name 定位

假如把一个元素看作一个人的话,id 和 name 可以看作一个人的身份证号和姓名。当然,这些属性值是否唯一要看前端开发工程师如何设计了。

一般情况下,同一个页面里的id是唯一的,name并非是唯一的。

根据上面的例子,百度输入框可以取 id 或 name 进行定位。

(前提是 id 和 name 的值在当页面上唯一)

image.png

id:

image.png

name:

image.png

xpath定位:

XPath 是一种在 XML 文档中定位元素的语言。因为 HTML 可以看做 XML 的一种实现,所以 selenium用户可是使用这种强大语言在 web 应用中定位元素

xpath又被称为万能定位,因为他的用途非常广,可以定位90%的元素

xpath 就是通过这种层级关系和标签属性来找到元素。

先了解一下xpath 的绝对路径

xpath = /html/body/div[2]/div[2]/div[5]/div[1]/div/form/span[1]/input

我们可以从最外层开始找,html 下面的 body 下面的 div 下面的第 2个 div 下面的....input 标签。通过一级一级的锁定就找到了想要的元素。

xptah的绝对路径有没有快点的寻找方式,往下看,一秒钟学会!并找到!

image.png
image.png

Xpath语法介绍:

1.开头写什么:

(1)单斜杠:/

(2)双斜杠://

(3)开头写单斜杠以及中间写的双斜杠: 单斜杠的话只会找一层, 双斜杠的话会全部找。开头的斜杠可以理解为整个页面。咱们自己写xapth时,开头一般都是些双个斜杠。

2.标签名[@属性名=”属性值”]

(1)标签名可以为一个星号*, 什么意思? 就是指标签名不固定,只要标签的属性名与属性值是写的就行。

3.如果找的标签有多个。

(1)//div[@id="wrapper"]/div[1]

(2)找到一个div后,再他的字标签,如果字标签有多个,可以根据这样的固定写法来找第几个: 标签名[整数] 取第几个,从1开始。

4和5这两种扩展的, 不常用

4.标签名[contains(@属性名, “xxx”)] xxx: 你可以随意些内容

这个标签的属性书名只要包含xxx就能找到。 这种方法一般是为了解决属性值每次刷新页面时发生改变的情况。

<a id=”baidu_123”></a>

找这个标签:

方法一: //a[@id=”baidu_123”]

方法二://a[contains(@id, “baidu”)]

5.标签名[text()=”xxx”]

(1)双边标签里左边和右边中间的文字, 是xxx的就找到。

CSS定位:

image.png
image.png
image.png
image.png

(5.1)常用关键字

在学习一门编程语言的时候,大多教材都是从打印“hello world”开始。我们可以像编程语言一样来学习 Robot Framework。

虽然通过 RIDE 提供“填表”一样的写测试用例的方式。但它却有着像编程语言一样的强大的关键字,以及可以开发关键字的扩展能力

查看所有关键字:F5

image.png

1.输出打印log:

log 关键字就是编程语言里的“print”一样,可以打印任何你想打印的内容。

在 test case 中填写以下内容:

image.png

通过运行结果中看到,

“INFO:”的“hello world” 就是通过 log 关键字打印的信息

image.png

2.设置变量 set variable

格式 左边变量名${x} , set variable 右边值

例:把hello world 赋值给a

image.png

在text Edit 编辑页面:

image.png

输出结果:

image.png

3.获取时间:get time

image.png

Text Edit:界面

image.png

执行结果:

image.png

4.强制等待、休眠:sleep:

sleep +整数(单位是:s)

image.png

5.if判断语句

通过“run keyword if”关键字可以编写 if 分支语句。

首先定义一个变量 a 等于 xxxx 。

If 判断 a 大于等于 90 ,满足条件 log 输出 “优秀 ”;

不满足上面的条件,接着 else if 判断 a 大于等于 60 ,满足条件 log 输出 “及格”;

不满足上面的条件,接着 else if 判断 a 大于等于 30 ,满足条件 log 输出 “差劲”;

上面的条件都不满足,else log 输出“非常差”。

注:注意 sele if 和 else 前面的三个点点点(...),加...是为了让行不合并,因为理论上是需要在一行里面写

image.png

6.for循环

在 Robot Framework 中编写循环通过“:for”
通过“:FOR”定义 for 循环;in range 用于指定循环的范围

image.png
image.png

7. 调用:Evaluate

它可以使用 Python 语言中所提供的方法

比如随即数random

image.png

另外,evalueate还可以直接调用本地的python脚本

(5.2)Selenium2Library关键字

1.Open Browser + URL + 浏览器名

2.览器最大化Maximize Browser Window

Maximize Browser Window 关键字使当前打开的浏览器全屏

后面无需跟参数

3.关闭浏览器 close browser

image.png

4.输入文本

input text 输入文本

input password 输入密码

image.png

5.点击

click button 点击按钮

Click button 关键字用于点击页面上的按钮。

Click button + 按钮元素的位置

click element 点击元素

Click Element 关键字用于点击页面上的元素,单击任何可以点击按钮、文字/图片、链接、复选框、单选框、甚至是下拉框等。

Click element后面有一个必填参数:

Click element 元素的位置

页面上所有的东西都可以称为元素, 这个也可以当作万能关键字

image.png

6.选择窗口

跳转新窗口,当浏览器打开了新的窗口页面时,

可以选择使用该关键字跳转到新的窗口,防止后续定位不到

select window + new 切换新窗口

select window + main 回到主窗口

image.png

7.等待

7.1强制等待

为了保证脚本的稳定性,多使用等待.

sleep +整数

image.png

7.2隐式等待 Wait Until Page Contains Element

等待某个元素出现

语法如下:

Wait Until Page Contains Element + 元素位置 + 等待时间 报错提示(可以不写)

image.png

8.定位下拉框

select from list by index 在通过索引值定位所选项即可

select from list by value 通过下拉框选项中的value值来定位

image.png

9.获取文本 get text / get title (获取标题)

获得某个位置的文本信息

语法如下:

变量名 get text 获取文本的位置

设置一个变量来存储某个位置的文本

image.png

10.断言 should contain

should contain + 实际值 + 预期值

一般配合get text 一起使用

语法如下:

Should Contain 变量值(实际值) 预期值

如果断言成功,就会执行成功,如果断言失败,就会报错。

[图片上传失败...(image-1253bc-1597575627835)]

断言失败:

image.png

11.鼠标悬停 mouse over

悬停,处在悬停状态下,是可以进行选择其他浮层的

语法如下: Mouse Over 悬停元素位置

小技巧:悬停状态下如果无法使用选择器进行选择元素,可以用快捷键,ctrl+shift+c

image.png

12.定位嵌套页面

定位嵌套页面

语法如下:Select Frame 嵌套元素位置

备注:有些时候,我们会出现碰见嵌套页面无法定位的情况。这时候,我们就需要先找到嵌套页面的id, 先定位到嵌套页面,再进行正常定位

什么样的属于嵌套页面?

一个页面,进行了跳转,

但是却没有打开新的窗口或者刷新,

只有部分画面跳转到了新的页面,

这种就属于嵌套页面。

通俗来讲,一个html里面如果有两个<html>标签,就属于嵌套。

我们可以用iframe标签来最终判断它是不是一个嵌套页面

image.png

13.滑动

selenium不提供滑动定位,可以通过JS进行定位

Execute Javascript + window.scrollTo(0,800)

Execute+Javascript+window.scrollto(0,documen.body.scrollHeight)

6.分层设计

谈到 Robot Framework 分层的思想,就不得不提“关键字驱动”。

回到分层的思想上,程序设计的讲究设计模式,设计模式其实就是根据需求使用抽象与封装,其实就是分层思想。把一个实现过程分成不同多层。提高的灵活性,从而达到可扩展性和可维护性。再回到自动化的话题上,我们可以把操作步骤封装一个一个的方法(关键字),通过调用关键字来实现测试用例。

其实对于每一条测试用例来说,只是搜索的内容不同,

脚本步骤是完全一样的。这样做无疑增加的脚本的冗余,而且不便于维护。假如,百度输入框的定位方式变了,我不得不打开每一条用例进行修改。

我们可以过创建关键字的方式,从而实现分层的思想来解决这个问题。

自动化测试用例时会分为元素层,页面层,用例层。

元素层:把单步(每一步)操作封装成关键字。

先导入 Selenium2Library库

image.png

页面层:把单个页面的所有操作封装成关键字。

先导入元素层的关键字:且元素层导入的库也可以使用


image.png

用例层:所要编写成脚本的每个测试用例中涉及的所有页面操作

先导入页面层的关键字

image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342