15 Web 自動(dòng)化測試 --Selenium Grid + Maven + TestNG + Jenkins 完成Selenium 分布式并發(fā)測試

如果你會(huì)docker 那么我更推薦你看看:
http://www.reibang.com/p/29c7240e9f48

Selenium Grid 是什么淆衷?

Selenium Grid 是一個(gè)可以方便的讓你腳本運(yùn)行在不同的平臺(tái)以及不同的瀏覽器上的一個(gè)框架渗柿。Selenium Grid 分1和2兩個(gè)版本,其中Selenium Grid 2的發(fā)布還晚于Selenium 2.0薪铜,也就是說Selenium Grid 2 并不是和Selenium 2.0 一起發(fā)布的班巩,但是Selenium Grid 2基本上支持Selenium 2.0的所有功能蔓罚。

Selenium Grid 基本結(jié)構(gòu)

grid結(jié)構(gòu)圖.png

  如上圖竿奏,Selenium Grid 由一個(gè)Hub節(jié)點(diǎn)和若干個(gè)Node節(jié)點(diǎn)組成。 其中Hub節(jié)點(diǎn)主要用于管理各個(gè)Node節(jié)點(diǎn)的注冊及其狀態(tài)眶根,并接收Selenium Scripts腳本,然后轉(zhuǎn)發(fā)給各個(gè)Node節(jié)點(diǎn)去執(zhí)行蜀铲,所以Hub本身節(jié)點(diǎn)是不執(zhí)行腳本的,Hub是做腳本分發(fā)属百,真正執(zhí)行腳本都是放于Node節(jié)點(diǎn)上记劝。既然Hub 會(huì)分發(fā)腳本,那么免去了一個(gè)一個(gè)Node機(jī)器上去拷貝你腳本的麻煩啦族扰。

何時(shí)需要 Selenium Grid

在了解了什么是 Selenium Grid 和其基本結(jié)構(gòu)后厌丑,那么我們開始關(guān)心我們何時(shí)需要它呢?下面列出兩點(diǎn):

1. 當(dāng)你的腳本需要在不同的系統(tǒng)和瀏覽器運(yùn)行時(shí)渔呵,也就是測試需要考慮各種瀏覽器兼容性時(shí)怒竿。
2. 當(dāng)你想縮短你的測試執(zhí)行時(shí)間時(shí)。

當(dāng)你開始考慮上面兩個(gè)問題時(shí)厘肮,那么可以考慮使用Selenium Grid .

怎么使用

注意:Selenium Grid 是用java開發(fā)的框架愧口,所以你想運(yùn)行這個(gè)框架睦番,你需要有java環(huán)境类茂。Java環(huán)境的搭建可以參考http://www.reibang.com/p/74a5ea7fd369 耍属。

下載jar包

下載地址:http://selenium-release.storage.googleapis.com/index.html ,選取最新版本巩检,例如寫這個(gè)文章時(shí)最新版本是2.53厚骗,那么進(jìn)入2.53文件夾下載 selenium-server-standalone-2.53.0.jar 文件便可。

啟動(dòng)Hub 節(jié)點(diǎn):

在控制臺(tái)(終端)輸入:java -jar selenium-server-standalone-2.53.0.jar -role hub
出現(xiàn)類似如下圖信息便表示Hub啟動(dòng)成功:


hub啟動(dòng)成功.png

這時(shí)你可以瀏覽器打開 http://localhost:4444/grid/console 兢哭,可以看到Hub管理頁面领舰。

Paste_Image.png

點(diǎn)擊 view config,可以查看到當(dāng)前hub節(jié)點(diǎn)的一些配置默認(rèn)配置信息迟螺,例如:
port : 4444 這個(gè)是hub 默認(rèn)的端口號冲秽;

**throwOnCapabilityNotPresent : true ** 默認(rèn)為 true,表示當(dāng)前hub只有在有node存在時(shí)矩父,才會(huì)接受測試請求锉桑。為false 則反之;

capabilityMatcher : org.openqa.grid.internal.utils.DefaultCapabilityMatcher 這是一個(gè)實(shí)現(xiàn)了CapabilityMatcher接口的類窍株,默認(rèn)指向org.openqa.grid.internal.utils.DefaultCapabilityMatcher該類用于實(shí)現(xiàn)grid在分布測試任務(wù)到對應(yīng)node時(shí)所使用的匹配規(guī)則民轴,如果想要更精確的測試分配規(guī)則,那么就注冊一個(gè)自己定義的匹配類球订;

**prioritizer : null ** 這是一個(gè)實(shí)現(xiàn)了Prioritizer接口的類后裸。設(shè)置grid執(zhí)行test任務(wù)的優(yōu)先邏輯;默認(rèn)為null冒滩,那個(gè)腳本先到那個(gè)先執(zhí)行微驶;

newSessionWaitTimeout : -1 默認(rèn)-1,即沒有超時(shí)旦部;指定一個(gè)新的測試session等待執(zhí)行的間隔時(shí)間祈搜。即一個(gè)代理節(jié)點(diǎn)上前后2個(gè)測試中間的延時(shí)時(shí)間,單位為毫秒士八;

**browserTimeout : 0 ** 瀏覽器無響應(yīng)的超時(shí)時(shí)間容燕,默認(rèn)為0表示沒有超時(shí)時(shí)間

修改 hub 的配置

想要修改 hub 的配置有兩種方法。

通過命令修改

例如假設(shè)我的 4444端口被別的程序占用了婚度,我想修改默認(rèn)的端口為4445蘸秘,則如下:
java -jar selenium-server-standalone-2.53.0.jar -role hub -port 4445

通過Json文件修改配置:

  1. 新建個(gè)json格式的文件,內(nèi)容如下(這里僅僅修改了maxSession的配置蝗茁,默認(rèn)是5)醋虏,并放于跟Grid jar包同一目錄:
    { "host": null, "port": 4444, "newSessionWaitTimeout": -1, "servlets" : [], "prioritizer": null, "capabilityMatcher": "org.openqa.grid.internal.utils.DefaultCapabilityMatcher", "throwOnCapabilityNotPresent": true, "nodePolling": 5000, "cleanUpCycle": 5000, "timeout": 300000, "browserTimeout": 0, "maxSession": 10 }
  2. 執(zhí)行命令:java -jar selenium-server-standalone-2.53.0.jar -role hub -hubConfig hub.json

這時(shí)再到 Grid Console 頁面查看,maxSession 參數(shù)已經(jīng)修改成 10.

node 節(jié)點(diǎn)Selenium 環(huán)境要求

在添加node節(jié)點(diǎn)前哮翘,我們先關(guān)注下颈嚼,node 節(jié)點(diǎn)對環(huán)境要求:

1. node 節(jié)點(diǎn)必須要有 java 環(huán)境
2. node 節(jié)點(diǎn)跟hub 節(jié)點(diǎn)機(jī)器間可以互相 ping 通。(不通時(shí)關(guān)閉防火墻和安全軟件再試試)
3. node 節(jié)點(diǎn)負(fù)責(zé)執(zhí)行Selenium 腳本饭寺,所以必須有Selenium 環(huán)境(腳本語言對應(yīng)的環(huán)境如java, 各個(gè)瀏覽器及其對應(yīng)的driver)

添加 node 節(jié)點(diǎn)

如果你是跟hub同一臺(tái)機(jī)器中添加可以直接在控制臺(tái)(終端)輸入如下命令:
java -jar selenium-server-standalone-2.53.0.jar -role node

如果你想在別的機(jī)器上添加node節(jié)點(diǎn)則控制臺(tái)(終端)輸入如下命令:
java -jar selenium-server-standalone-2.53.0.jar -role node -hub http://192.168.1.110:4444/grid/register

添加完節(jié)點(diǎn)后阻课,可以在 Grid Console 頁面上查看到已經(jīng)注冊進(jìn)來的node節(jié)點(diǎn)信息和配置叫挟。如下圖:

Paste_Image.png

補(bǔ)充:使用 -role node 注冊表示這個(gè)node節(jié)點(diǎn)既可以支持Selenium Remote Control 也支持Webdriver
java -jar selenium-server-standalone-2.53.0.jar -role rc //注冊的節(jié)點(diǎn)僅支持Selenium Remote Control
java -jar selenium-server-standalone-2.53.0.jar -role wd //注冊的節(jié)點(diǎn)僅支持WebDriver

修改 node 配置

同樣node的配置有兩種方式

通過命令修改

java -jar selenium-server-standalone-2.53.0.jar -role rc -port 6666

通過json文件修改(3.X版本請參考文章末尾配置)

例如新建一個(gè)node.json文件,如下內(nèi)存限煞,并放于Grid 同級目錄下
{ "capabilities": [ { "browserName": "chrome", "maxInstances": 5, "platform": "WINDOWS", "version":"51" }, { "browserName": "firefox", "maxInstances": 6, "platform": "WINDOWS", "version":"46.0.1" }, { "browserName": "internet explorer", "maxInstances": 2, "platform": "WINDOWS", "webdriver.ie.driver": "IEDriverServer.exe" } ], "configuration": { "proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy", "maxSession": 5, "port": 5555, "register": true, "registerCycle": 5000, "hub": "http://192.168.84.209:4444" } }
重要參數(shù)說明:
**"browserName": “chrome" **這個(gè)很重要抹恳,表示你注冊的瀏覽器

"maxInstances": 5 這個(gè)參數(shù)表示最多啟動(dòng)該瀏覽器的個(gè)數(shù)

"webdriver.ie.driver": “IEDriverServer.exe” 每個(gè)瀏覽器driver放置的位置,建議放跟Grid 同級目錄下

執(zhí)行命令:
java -jar selenium-server-standalone-2.53.0.jar -role node -nodeConfig node.json -hub http://192.168.84.209:4444/grid/register
最后查看Grid Console 頁面署驻,顯示如下node節(jié)點(diǎn)信息:

Paste_Image.png

到此為止奋献,我們已經(jīng)配置好Hub 和需要的多個(gè)Node 節(jié)點(diǎn),下去我們需要開始編寫測試代碼

測試代碼:

在編寫代碼之前我們先簡單了解下兩個(gè)工具M(jìn)aven 和 TestNG旺上。

Maven:是一個(gè)項(xiàng)目管理工具瓶蚂,可以用于項(xiàng)目構(gòu)建打包等,還可以用于項(xiàng)目依賴包管理宣吱。
TestNG: 是一個(gè)強(qiáng)大的測試框架扬跋,設(shè)計(jì)靈感來源于junit,但優(yōu)于junit凌节,它提供了很強(qiáng)大的注解钦听,便于我們對case的各種操作。

新建 Maven 工程

我們可以通過IDEA來新建一個(gè)Maven 工程倍奢,新建過程可以參考http://www.reibang.com/p/6ca7bbcdf2dd 朴上, 并在pom.xml 文件添加selenium 和 TestNG的依賴包如下:

 <!-- http://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>2.53.0</version>
        </dependency>

        <!-- http://mvnrepository.com/artifact/org.testng/testng -->
        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>6.9.10</version>
        </dependency>

編寫腳本

例如我想在遠(yuǎn)程的node 節(jié)點(diǎn)(192.168.84.19:5555)機(jī)器上啟動(dòng)Chrome/IE/firefox瀏覽器,并打開百度頁面卒煞,這里我們需要借助DesiredCapabilities類來指定采用哪個(gè)瀏覽器痪宰,用RemoteWebDriver 來實(shí)現(xiàn)遠(yuǎn)程運(yùn)行,具體代碼如下:

    //    啟動(dòng)192.168.84.209:5555 node節(jié)點(diǎn)的Chrome
    @Test
    public void testChrome() throws MalformedURLException, InterruptedException {
        DesiredCapabilities chromeDC = DesiredCapabilities.chrome();
        WebDriver driver = new RemoteWebDriver(new URL("http://192.168.84.209:5555/wd/hub"), chromeDC);
        driver.get("http://www.baidu.com");
        Thread.sleep(5000);
        driver.quit();
    }

    //    啟動(dòng)192.168.84.19:5555 node節(jié)點(diǎn)的firefox
    @Test
    public void testFF() throws MalformedURLException, InterruptedException {
        DesiredCapabilities firefoxDC = DesiredCapabilities.firefox();
        WebDriver driver = new RemoteWebDriver(new URL("http://192.168.84.19:5555/wd/hub"), firefoxDC);
        driver.get("http://www.baidu.com");
        Thread.sleep(5000);
        driver.quit();
    }

    //    啟動(dòng)192.168.84.19:5555 node節(jié)點(diǎn)的IE
    @Test
    public void testIE() throws MalformedURLException, InterruptedException {
        DesiredCapabilities ieDC = DesiredCapabilities.internetExplorer();
        WebDriver driver = new RemoteWebDriver(new URL("http://192.168.84.19:5555/wd/hub"), ieDC);
        driver.get("http://www.baidu.com");
        Thread.sleep(5000);
        driver.quit();
    }

補(bǔ)充 DesiredCapabilities類畔裕,除了可以指定瀏覽器的名稱還可以指定平臺(tái)和瀏覽器版本以及瀏覽器支持的其他功能

從上面的腳本我們已經(jīng)大概知道如果去指定某個(gè)腳本在某個(gè)系統(tǒng)和瀏覽器中運(yùn)行衣撬,但是平時(shí)我們的case基本上希望的是所有的case可以在期望的平臺(tái)和瀏覽器中快速運(yùn)行,這里其實(shí)有兩個(gè)需求扮饶,一個(gè)是所有的腳本能都在指定瀏覽器中運(yùn)行 另一個(gè)就是盡可能快速運(yùn)行具练。

先來解決第一個(gè)需求:假設(shè)現(xiàn)在我有個(gè)測試腳本實(shí)現(xiàn)了 ”打開百度界面,并輸入頁面title“甜无,我希望他可以在A機(jī)器(192.168.84.209)上的chrome 瀏覽器 和 firefox瀏覽器運(yùn)行扛点,在B(192.168.84.19)機(jī)器上的IE瀏覽器運(yùn)行。那么我們代碼可以如下設(shè)計(jì)思路:

1. 通過TestNG 提供的@DataProvider 實(shí)現(xiàn)數(shù)據(jù)驅(qū)動(dòng)(也可以通過.xml做數(shù)據(jù)來源去實(shí)現(xiàn))
2. 通過不同參數(shù)岂丘,把腳本分配到不同的node上的運(yùn)行

具體實(shí)現(xiàn)代碼如下:

    // 通過TestNG 提供的注解陵究,實(shí)現(xiàn)數(shù)據(jù)驅(qū)動(dòng)
    @DataProvider(name = "data")
    public Object[][] data() {
        return new Object[][]{{"http://192.168.84.209:5555", "chrome"},
                {"http://192.168.84.209:5555", “firefox"},
                {"http://192.168.84.19:5555", "ie"}};
    }

    /**
     * @param nodeURL node 節(jié)點(diǎn)的地址
     * @param browser node 節(jié)點(diǎn)的瀏覽器
     * @throws MalformedURLException
     */
    @Test(dataProvider = "data") // 獲取對應(yīng)的數(shù)據(jù)源
    public void openBaiduPageTest(String nodeURL, String browser) throws MalformedURLException {
        DesiredCapabilities desiredCapabilities;
//        判斷要打開的瀏覽器

        if (browser .equals("chrome")) {
            desiredCapabilities = DesiredCapabilities.chrome();
        } else if (browser .equals( "ie")) {
            desiredCapabilities = DesiredCapabilities.internetExplorer();
        } else {
            desiredCapabilities = DesiredCapabilities.firefox();
        }

//        拼接處要執(zhí)行腳本的node 節(jié)點(diǎn)地址
        String url = nodeURL + "/wd/hub";
        WebDriver driver = new RemoteWebDriver(new URL(url), desiredCapabilities);
//        打開百度
        driver.get("http://www.baidu.com");
        System.out.println(browser + driver.getTitle());
//        關(guān)閉瀏覽器
        driver.quit();
    }

需求1解決了,我們再來考慮下需求2:如何盡可能快速運(yùn)行奥帘,畢竟現(xiàn)在大多研發(fā)團(tuán)隊(duì)都是走敏捷铜邮,如果等你腳本執(zhí)行幾小時(shí)或者更長時(shí)間,那簡直要命。解決思路可以通過并行執(zhí)行case腳本來解決松蒜。TestNG不僅僅能提供數(shù)據(jù)驅(qū)動(dòng)的方式返咱,也提供了多種并發(fā)方式,這樣就很好解決了我們case并行執(zhí)行的要求牍鞠,具體解決如下:
在項(xiàng)目中新建個(gè).xml 文件,如下

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Default Suite" parallel="methods" thread-count=“3">
  <test name="Selenium_Grid_Demo">
    <classes>
      <class name="com.grid.demo.GridDemo"/>
    </classes>
  </test> <!-- Selenium_Grid_Demo -->
</suite> <!-- Default Suite -->

其中 <suite name="Default Suite" parallel="methods" thread-count="1”> 中的 thread-count 參數(shù)值就是并發(fā)的進(jìn)程數(shù)评姨,parallel 的參數(shù)表示通過哪種方式進(jìn)行并發(fā)可以是 methods , classes , test 难述。 xml里面更多的配置有興趣的可以百度了解。

例如我的測試GridDemo 類里面有3個(gè)case了吐句,我也新建了如上的.xml文件胁后,那么我運(yùn)行該xml文件會(huì)看到這三個(gè)case同時(shí)執(zhí)行

運(yùn)行結(jié)果.png

通過Jenkins 執(zhí)行腳本

Jenkins 是個(gè)CI(持續(xù)集成)工具,功能非常強(qiáng)大嗦枢,插件也非常多攀芯,下面簡單介紹如何把已經(jīng)編寫好的腳本放到Jenkins執(zhí)行。

1. 搭建Jenkins 環(huán)境 (百度很多文虏,不詳細(xì)說明)
2. 修改本地Maven 項(xiàng)目的pom.xml 文件侣诺,添加如下插件:
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.17</version>
                <configuration>
                    <suiteXmlFiles>
                        <!--要執(zhí)行的testng的.xml文件路徑-->
                        <suiteXmlFile>testng.xml</suiteXmlFile>
                    </suiteXmlFiles>
                </configuration>
            </plugin>
        </plugins>
    </build>
1. 打開Jenkins平臺(tái),新建一個(gè)Maven氧秘,便可以

Selenium Grid 的GUI管理工具

最后推薦兩個(gè)Grid的GUI 管理工具:

1. Jenkins 的Selenium Plugin 插件年鸳,可以在Jenkins插件中找到
Paste_Image.png

安裝完成后會(huì)在導(dǎo)航中添加Grid的入口。


Paste_Image.png
2. VisGrid 

下載地址:http://www.codoid.com/products/view/2/30

VisGrid.png

補(bǔ)充 (17.07.27更新)

最近因?yàn)榻邮忠粋€(gè)項(xiàng)目丸相,又需要重新搭建Grid 搔确,而此時(shí)的Webdriver已經(jīng)是3.x版本了,同時(shí)我們看到的Grid的selenium-server-standalone jar包也升級到了3.X 版本灭忠,雖然基本用法保持一樣膳算,但是在配置Node的json文件時(shí),有點(diǎn)小變動(dòng)弛作,所以如果你是用3.X版本的Grid那么請參考: https://github.com/SeleniumHQ/selenium/blob/master/java/server/src/org/openqa/grid/common/defaults/DefaultNodeWebDriver.json 中的配置涕蜂,同時(shí)想看Grid的官方幫助請參考: https://github.com/SeleniumHQ/selenium/wiki/Grid2
最后我隨手貼出官方給出的默認(rèn)Node Json配置文件:

{
  "capabilities":
  [
    {
      "browserName": "firefox",
      "maxInstances": 5,
      "seleniumProtocol": "WebDriver"
    },
    {
      "browserName": "chrome",
      "maxInstances": 5,
      "seleniumProtocol": "WebDriver"
    },
    {
      "browserName": "internet explorer",
      "maxInstances": 1,
      "seleniumProtocol": "WebDriver"
    }
  ],
  "proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
  "maxSession": 5,
  "port": 5555,
  "register": true,
  "registerCycle": 5000,
  "hub": "http://localhost:4444",
  "nodeStatusCheckTimeout": 5000,
  "nodePolling": 5000,
  "role": "node",
  "unregisterIfStillDownAfter": 60000,
  "downPollingLimit": 2,
  "debug": false,
  "servlets" : [],
  "withoutServlets": [],
  "custom": {}
}

(2018.07.03更新)補(bǔ)充2:
最近偶然查看Selnium 發(fā)布的修改log中看到映琳,在Selenium v3.7.0 版本后DesiredCapabilities被遷移到MutableCapabilities或最好使用ImmutableCapabilities 宇葱。

https://github.com/SeleniumHQ/selenium/blob/master/java/CHANGELOG

* Migrated from using `DesiredCapabilities` to either
  `MutableCapabilities` or (preferably) `ImmutableCapabilities`.
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市刊头,隨后出現(xiàn)的幾起案子黍瞧,更是在濱河造成了極大的恐慌,老刑警劉巖原杂,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件印颤,死亡現(xiàn)場離奇詭異,居然都是意外死亡穿肄,警方通過查閱死者的電腦和手機(jī)年局,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門际看,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人矢否,你說我怎么就攤上這事仲闽。” “怎么了僵朗?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵赖欣,是天一觀的道長。 經(jīng)常有香客問我验庙,道長顶吮,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任粪薛,我火速辦了婚禮悴了,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘违寿。我一直安慰自己湃交,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布藤巢。 她就那樣靜靜地躺著巡揍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪菌瘪。 梳的紋絲不亂的頭發(fā)上腮敌,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天,我揣著相機(jī)與錄音俏扩,去河邊找鬼糜工。 笑死,一個(gè)胖子當(dāng)著我的面吹牛录淡,可吹牛的內(nèi)容都是我干的捌木。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼嫉戚,長吁一口氣:“原來是場噩夢啊……” “哼刨裆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起彬檀,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤帆啃,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后窍帝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體努潘,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了疯坤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片报慕。...
    茶點(diǎn)故事閱讀 38,039評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖压怠,靈堂內(nèi)的尸體忽然破棺而出眠冈,到底是詐尸還是另有隱情,我是刑警寧澤菌瘫,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布蜗顽,位于F島的核電站,受9級特大地震影響突梦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜羽利,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一宫患、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧这弧,春花似錦娃闲、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蛋辈,卻和暖如春属拾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背冷溶。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工渐白, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人逞频。 一個(gè)月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓纯衍,卻偏偏與公主長得像,于是被迫代替她去往敵國和親苗胀。 傳聞我的和親對象是個(gè)殘疾皇子襟诸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容