分享我的第一次Selenium自動(dòng)化測(cè)試框架開發(fā)過程

由于公司的開發(fā)團(tuán)隊(duì)偏向于使用Java技術(shù)询张,而且公司倡導(dǎo)學(xué)習(xí)開源技術(shù)疮装,所以我選擇用Java語言來進(jìn)行Selenium WebDriver的自動(dòng)化框架開發(fā)。由于本人沒有Java開發(fā)經(jīng)驗(yàn),以前雖然學(xué)過QTP但從沒有接觸過Selenium盾鳞,正好通過這個(gè)機(jī)會(huì)能學(xué)習(xí)一下自動(dòng)化測(cè)試懒鉴,同時(shí)也學(xué)習(xí)一下基本的Java開發(fā)過程诡挂。

一、首先是搭建框架開發(fā)環(huán)境

按照網(wǎng)上的方法部署eclipse临谱,建立TestAction工程璃俗,并Import引用JDK和Selenium-2.44完整包

二、繼續(xù)引用和安裝相關(guān)jar包

1悉默、首先是要滿足數(shù)據(jù)驅(qū)動(dòng)(場(chǎng)景用例和動(dòng)作用例城豁、數(shù)據(jù)用例都需要放到excel表上),就需要引用jxl.rar包(實(shí)現(xiàn)調(diào)用和操作excel)抄课;

2唱星、需要實(shí)現(xiàn)自動(dòng)化框架(有測(cè)試套件、測(cè)試層)就需要通過eclipse安裝TestNg(網(wǎng)上有相關(guān)教程)跟磨;

三间聊、構(gòu)建框架的樣例代碼

1、實(shí)現(xiàn)能夠?qū)xcel用例數(shù)據(jù)的調(diào)用(通過jxl的引用)抵拘,創(chuàng)建ExcelData.java類文件(專門用于對(duì)excel的調(diào)用)哎榴,以下截取部分代碼樣例:

? ? /**

? ? * @param fileName? excel文件名

? ? * @param caseName? sheet名

? ? */

? ? public ExcelData(String fileName, String caseName) {

? ? ? ? super();

? ? ? ? this.fileName = fileName;

? ? ? ? this.caseName = caseName;

? ? }

? ? /**

? ? * 獲得excel表中的數(shù)據(jù)

? ? */

? ? public Object[][] getExcelData() throws BiffException, IOException {

? ? ? ? workbook = Workbook.getWorkbook(new File(getPath()));

? ? ? ? sheet = workbook.getSheet(caseName);

? ? ? ? rows = sheet.getRows();

? ? ? ? columns = sheet.getColumns();

? ? ? ? // 為了返回值是Object[][],定義一個(gè)多行單列的二維數(shù)組

? ? ? ? @SuppressWarnings("unchecked")

HashMap[][] arrmap = new HashMap[rows - 1][1];

? ? ? ? // 對(duì)數(shù)組中所有元素hashmap進(jìn)行初始化

? ? ? ? if (rows > 1) {

? ? ? ? ? ? for (int i = 0; i < rows - 1; i++) {

? ? ? ? ? ? ? ? arrmap[i][0] = new HashMap();

? ? ? ? ? ? }

? ? ? ? } else {

? ? ? ? ? ? System.out.println("excel中沒有數(shù)據(jù)");

? ? ? ? }

? ? ? ? // 獲得首行的列名,作為hashmap的key值

? ? ? ? for (int c = 0; c < columns; c++) {

? ? ? ? ? ? String cellvalue = sheet.getCell(c, 0).getContents();

? ? ? ? ? ? arrkey.add(cellvalue);

? ? ? ? }

? ? ? ? // 遍歷所有的單元格的值添加到hashmap中

? ? ? ? for (int r = 1; r < rows; r++) {

? ? ? ? ? ? for (int c = 0; c < columns; c++) {

? ? ? ? ? ? ? ? String cellvalue = sheet.getCell(c, r).getContents();

? ? ? ? ? ? ? ? arrmap[r - 1][0].put(arrkey.get(c), cellvalue);

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? return arrmap;

? ? }

? ? /**

? ? * 獲得excel文件的路徑

? ? * @return

? ? * @throws IOException

? ? */

? ? public String getPath() throws IOException {

? ? ? ? File directory = new File(".");

? ? ? ? sourceFile = directory.getCanonicalPath() + "\\src\\source\\"

? ? ? ? ? ? ? ? + fileName + ".xls";

? ? ? ? return sourceFile;

? ? }

2、實(shí)現(xiàn)對(duì)瀏覽器的調(diào)用叹话,考慮到兼容性偷遗,需要同時(shí)滿足對(duì)Chrome、FireFox驼壶、IE三大瀏覽器的調(diào)用氏豌,我們需要準(zhǔn)備相關(guān)驅(qū)動(dòng)chromedriver.exe、IEDriverServer.exe热凹,這兩驅(qū)動(dòng)都是谷歌和IE官方提供的泵喘,可以從網(wǎng)上下載到;而FireFox不需要下載驅(qū)動(dòng)般妙,只要安裝瀏覽器就可調(diào)用(Selenium和FireFox屬于一個(gè)團(tuán)隊(duì)開發(fā)出來的纪铺,待遇就是不一樣)。

有了瀏覽器驅(qū)動(dòng)后(我們把驅(qū)動(dòng)放到工程目錄的WebDriver文件夾下碟渺,方便按相對(duì)路徑統(tǒng)一調(diào)用)鲜锚,我們就需要一個(gè)能調(diào)用瀏覽器的類,以下提供核心代碼樣例:

public static WebDriver getChromeDriver(String url) {

? ? ? ? //加載Google驅(qū)動(dòng)

? ? //System.setProperty("webdriver.chrome.driver","D:\\java\\chromedriver.exe");

? ? System.setProperty("webdriver.chrome.driver",System.getProperties().getProperty("user.dir")+"\\WebDriver\\chromedriver.exe");

? ? ChromeOptions options = new ChromeOptions();

? ? //通過配置參數(shù)禁止data;的出現(xiàn)

? ? options.addArguments("--user-data-dir="+System.getProperties().getProperty("user.home")+"/AppData/Local/Google/Chrome/User Data/Default");

? ? //通過配置參數(shù)刪除“您使用的是不受支持的命令行標(biāo)記:--ignore-certificate-errors苫拍。穩(wěn)定性和安全性會(huì)有所下降芜繁。”提示

? ? options.addArguments("--start-maximized","allow-running-insecure-content", "--test-type");

? ? WebDriver driver = new ChromeDriver(options);

? ? driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);

? ? driver.navigate().to(url);

? ? return driver;

}

public static WebDriver getFireFoxDriver(String url){

System.setProperty("webdriver.firefox.bin", "D:\\Program Files\\Mozilla Firefox\\firefox.exe");

// TODO Auto-generated method stub

WebDriver driver = new FirefoxDriver();

? ? //Puts a Implicit wait, Will wait for 10 seconds before throwing exception

driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

? ? //Launch website

driver.navigate().to(url);

return driver;

}

public static WebDriver getIEDriver(String url){

//System.setProperty("webdriver.ie.driver", "D:\\java\\IE64\\IEDriverServer.exe");

System.setProperty("webdriver.ie.driver", System.getProperties().getProperty("user.dir")+"\\WebDriver\\IE32\\IEDriverServer.exe");

DesiredCapabilities capabilities = DesiredCapabilities.internetExplorer();

? ? ? ? capabilities.setCapability(InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS,true);

? ? ? ? capabilities.setPlatform(Platform.WINDOWS);

? ? ? ? capabilities.setCapability("silent", true);

// TODO Auto-generated method stub

WebDriver driver = new InternetExplorerDriver(capabilities);

? ? //Puts a Implicit wait, Will wait for 10 seconds before throwing exception

driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

? ? //Launch website

driver.navigate().to(url);

return driver;

}

3绒极、寫一個(gè)以數(shù)據(jù)驅(qū)動(dòng)的場(chǎng)景類骏令,來進(jìn)行單個(gè)事務(wù)的用例跑測(cè)

(1)首行我們需要用TesgNg提供的數(shù)據(jù)驅(qū)動(dòng)方法(@DataProvider),來獲取一個(gè)場(chǎng)景的用例表數(shù)據(jù)垄提,這個(gè)場(chǎng)景從excel的第一個(gè)附表獲取

通過action名榔袋,調(diào)取用例表(用例表是以action名命名的附表),用例表如下所示(ExpectedObject表示用例校驗(yàn)對(duì)象的頁(yè)面Element標(biāo)簽铡俐,用凰兑;分隔,分號(hào)前面的表示ID审丘,分號(hào)后面的表示xpath):

以下為用例表數(shù)據(jù)獲取的代碼:

@DataProvider(name="action")

? ? public Object[][] Numbers() throws BiffException, IOException{

getActionString = actionData.getActionStr(1);//獲取第一個(gè)場(chǎng)景的broswer聪黎、url、action名

ExcelData e=new ExcelData("testdata", getActionString.get(2));

? ? ? ? return e.getExcelData();

? ? }

然后通過Java的反射機(jī)制备恤,實(shí)現(xiàn)動(dòng)態(tài)的獲取具體事務(wù)類和執(zhí)行相關(guān)操作(每個(gè)事務(wù)的類名和方法名都與action場(chǎng)景名一致),以下截選相關(guān)場(chǎng)景的部分調(diào)用代碼:

? ? @Test(dataProvider="action")

? ? public void testAction(HashMap data) throws BiffException, IOException {

? ? ? ? try {

? ? ? ? Class MyClass = Class.forName(packageName+"."+getActionString.get(2));

? ? ? ? Method method = MyClass.getMethod(getActionString.get(2),WebDriver.class);

? ? ? ? @SuppressWarnings("unused")

String [] results = (String []) method.invoke(null,driver);

? ? String ExpObject=data.get("ExpectedObject");

? ? ? ? String ExpObject_by=ExpObject.split(";")[0].toString();

? ? ? ? String ExpObject_Desc=ExpObject.split(";")[1].toString();

? ? ? ? if(ExpObject_by.length()>0){

? ? ? ? Assert.assertEquals(driver.findElement(By.id(ExpObject_by)).getText(),data.get("ExpectedData"), getActionString.get(2)+data.get("ID")+"驗(yàn)證結(jié)果:");

? ? ? ? }

? ? ? ? else if(ExpObject_Desc.length()>0){

? ? ? ? Assert.assertEquals(driver.findElement(By.xpath(ExpObject_Desc)).getText(),data.get("ExpectedData"), getActionString.get(2)+data.get("ID")+"驗(yàn)證結(jié)果:");

? ? ? ? }


? ? WebDriverDemo.WebSleep(500);

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

? ? }

另外說明的是锦秒,調(diào)用瀏覽器的方法露泊,需要明確是放在@BeforeMethod中,還是在@BeforeClass中旅择,如果是登錄校驗(yàn)測(cè)試惭笑,就要保證每次執(zhí)行測(cè)試方法都要打開一次瀏覽器和關(guān)閉一次瀏覽器,那么我們就要把調(diào)用瀏覽器,和關(guān)閉瀏覽器的方法放到@BeforeMethod中和@AfterMethod中沉噩。其他業(yè)務(wù)測(cè)試捺宗,只要在一個(gè)套件類中打開一次瀏覽器和關(guān)閉一次瀏覽器就可以,所以用到的是@BeforeClass和@AfterClass川蒙。

4蚜厉、我們需要再寫一個(gè)以動(dòng)作(關(guān)鍵詞)驅(qū)動(dòng)的場(chǎng)景類

同樣,調(diào)用第二個(gè)場(chǎng)景的用例表畜眨,樣例代碼如下:

@DataProvider(name="action")

? ? public Object[][] Numbers() throws BiffException, IOException{

getActionString = actionData.getActionStr(2);//獲取第二個(gè)場(chǎng)景的broswer昼牛、url、action名

ExcelData e=new ExcelData("testdata", getActionString.get(2));

? ? ? ? return e.getExcelData();

? ? }

然后在測(cè)試方法中康聂,動(dòng)態(tài)的調(diào)用具體操作動(dòng)作贰健,獲取WebElement標(biāo)簽的方法,包括通過By ID或者By?xpath恬汁,操作動(dòng)作以最常見的兩個(gè)為例(sendKeys伶椿、click),以下為樣例代碼節(jié)選:

? ? @Test(dataProvider="action")

? ? public void testAction(HashMap data) throws BiffException, IOException {

? ? //driver.manage().timeouts().implicitlyWait(5,TimeUnit.SECONDS);//找不到element就再給5秒查找

? ? ? ? try {

? ? ? ? WebElement TestWebElement = null;

? ? ? ? String SetObject=data.get("SetObject").trim();

? ? ? ? String SetObject_by=SetObject.split(";")[0].toString();

? ? ? ? String SetObject_Desc=SetObject.split(";")[1].toString();

? ? ? ? if(SetObject_by.length()>0){

? ? ? ? TestWebElement=driver.findElement(By.id(SetObject_by));

? ? ? ? }

? ? ? ? else if(SetObject_Desc.length()>0){

? ? ? ? TestWebElement=driver.findElement(By.xpath(SetObject_Desc));

? ? ? ? }

? ? ? ? if(data.get("SetOperate").equals("sendKeys")){

? ? ? ? TestWebElement.clear();

? ? ? ? TestWebElement.sendKeys(data.get("SetValue"));

? ? ? ? }else if(data.get("SetOperate").equals("click")){

? ? ? ? TestWebElement.click();

? ? ? ? }

? ? String ExpObject=data.get("ExpectedObject").trim();

? ? ? ? if(ExpObject.length()>0){

? ? ? ? String ExpObject_by=ExpObject.split(";")[0].toString();

? ? ? ? ? ? String ExpObject_Desc=ExpObject.split(";")[1].toString();

? ? ? ? if(ExpObject_by.length()>0){

? ? ? ? ? ? Assert.assertEquals(driver.findElement(By.id(ExpObject_by)).getText(),data.get("ExpectedData"), getActionString.get(2)+data.get("ID")+"驗(yàn)證結(jié)果:");

? ? ? ? ? ? }

? ? ? ? ? ? else if(ExpObject_Desc.length()>0){

? ? ? ? ? ? Assert.assertEquals(driver.findElement(By.xpath(ExpObject_Desc)).getText(),data.get("ExpectedData"), getActionString.get(2)+data.get("ID")+"驗(yàn)證結(jié)果:");

? ? ? ? ? ? }

? ? ? ? }


? ? WebDriverDemo.WebSleep(500);

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

? ? }

這段方法所調(diào)用的用例表如下所示(以登錄為例):

5氓侧、剩下就是業(yè)務(wù)擴(kuò)展類了脊另,所有復(fù)雜的事務(wù)都可以單獨(dú)建立測(cè)試類和方法(方便擴(kuò)展維護(hù),只需要在excel場(chǎng)景表中定義后就能調(diào)用甘苍,利用的是Java反射機(jī)制)尝蠕,在這里就不舉例了。

四载庭、實(shí)現(xiàn)測(cè)試套件調(diào)用和報(bào)告輸出

有了以上步驟看彼,一個(gè)可擴(kuò)展的自動(dòng)化框架已經(jīng)基本形成,但是還達(dá)不到大規(guī)模應(yīng)用測(cè)試和腳本方便可移植囚聚,這時(shí)候我們引入Ant(可以在Eclipse中安裝插件靖榕,可以直接上網(wǎng)下載后引用),為了能輸出漂亮一點(diǎn)的報(bào)告格式顽铸,我們還引入一個(gè)saxon-8.7.jar扩借。

有了Ant后城菊,我們就可以建議build.xml文件,就能一鍵bulid我們以上的自動(dòng)化代碼,并將執(zhí)行測(cè)試后的結(jié)果輸出成報(bào)告孽锥。

1、首先我們需要編輯好測(cè)試套件調(diào)用的testng.xml焚鹊,簡(jiǎn)單舉例如下:

2腕够、然后我們需要編輯好一個(gè)能引用基礎(chǔ)jar包、build測(cè)試代碼优质、調(diào)用testng竣贪、輸出漂亮報(bào)告的build.xml文件


3军洼、完成這些后,我們就可以通過Eclipse直接Run As Ant Build我們的自動(dòng)化腳本了演怎,輸出一份還算漂亮的報(bào)告:

同時(shí)匕争,需要在事務(wù)操作類中,對(duì)實(shí)際結(jié)果和預(yù)期結(jié)果進(jìn)行比較爷耀,并將測(cè)試結(jié)果寫入excel的用例表中甘桑,如下:

String[] result=new String [2];

result[0] = driver.findElement(By.xpath(pars.get(3).split(";")[1].toString())).getText();

result[1] = pars.get(4);

if(result[0].equals(result[1])){//pars.size()-1

ActionsDemo.modifyExcel(Thread.currentThread().getStackTrace()[1].getMethodName(),k,5,"通過");

} else {

ActionsDemo.modifyExcel(Thread.currentThread().getStackTrace()[1].getMethodName(),k,5,"失敗");

}

五、實(shí)現(xiàn)自動(dòng)化框架腳本的遷移調(diào)用

以上的腳本始終是在Eclipse下編譯和調(diào)用的畏纲,如果要實(shí)現(xiàn)靈活遷移扇住,隨便換任何一臺(tái)只裝了JDK的電腦都能運(yùn)行,那么我們就要來點(diǎn)改造

1盗胀、首行是保證我們寫的代碼中艘蹋,所以需要引用文件的地方,都用相對(duì)路徑的方式票灰,避免代碼包遷移后需要改路徑女阀。

2、通過批處理調(diào)用build文件及用例文件屑迂,調(diào)用時(shí)也是通過批處理自動(dòng)找到相關(guān)路徑浸策,避免用絕對(duì)路徑。

3惹盼、需要用環(huán)境變量的地方庸汗,盡量用批處理的方式實(shí)現(xiàn),甚至最好是不用配置環(huán)境變量手报,直接調(diào)用相引用相對(duì)命令文件的路徑調(diào)用

以下舉個(gè)通過bat批處理調(diào)用Ant來執(zhí)行整個(gè)框架代碼的build:

@echo off

::先將測(cè)試用例文件拷到用戶目錄下

copy src\source\testdata.xls %UserProfile%\src\source

%cd%\org.apache.ant_1.9.6\bin\ant.bat -buildfile build.xml

echo 在%cd%\test-output下查看測(cè)試報(bào)告

pause

六蚯舱、進(jìn)一步實(shí)現(xiàn)自動(dòng)化的持續(xù)集成

在以上基礎(chǔ)上,我們還可以通過jenkins實(shí)現(xiàn)對(duì)自動(dòng)化腳本的調(diào)用掩蛤,以及達(dá)到每日構(gòu)建枉昏,持續(xù)集成開發(fā)的要求。

1揍鸟、首先部署jenkins(網(wǎng)上有相關(guān)方法)兄裂,由于本人公司一直在用jenkins,我就省了搭建部署這一步阳藻,直接將以上的自動(dòng)化框架腳本上傳

2晰奖、自動(dòng)化腳本完整目錄(包括代碼、用例腥泥、lib畅涂、引用的jar、build.xml文件等)上傳到SVN(再自動(dòng)從SVN下到j(luò)enkins所在服務(wù)器)

3道川、在jenkins中新建一個(gè)測(cè)試項(xiàng)目TestAction,主要配置如下:

4、配置完后冒萄,就可以立即構(gòu)建(如果碰到相關(guān)報(bào)錯(cuò)問題臊岸,就按輸出的提示進(jìn)行處理),構(gòu)建成功后尊流,就可以在HTML_Report中看到測(cè)試結(jié)果:

七帅戒、后續(xù)處理

到此為止,一個(gè)完整的Selenium自動(dòng)化框架就出來了崖技,要說好用不逻住,不好說,還得經(jīng)過實(shí)踐的檢驗(yàn)迎献,但是以上這個(gè)思考過程和框架的演進(jìn)過程瞎访,應(yīng)該也是值得借鑒的,畢竟這是我這幾天摸索和學(xué)習(xí)的過程吁恍,對(duì)于一個(gè)沒有從事過自動(dòng)化測(cè)試扒秸,而且沒有做過Java開發(fā)的測(cè)試人員來說,這只是個(gè)開始冀瓦。

目前來看伴奥,這個(gè)框架在架構(gòu)分層上,還是不夠清晰翼闽,有很多要改進(jìn)的東西拾徙,從技術(shù)上來說,我已經(jīng)實(shí)現(xiàn)了我的目標(biāo)(學(xué)習(xí)自動(dòng)化測(cè)試)感局,但是在整體架構(gòu)和代碼重構(gòu)上尼啡,還有很多工作沒做,以下貼出一份Selenium自動(dòng)化框架的分層結(jié)構(gòu)蓝厌,以便后期按照這個(gè)標(biāo)準(zhǔn)進(jìn)行改進(jìn):

測(cè)試數(shù)據(jù)層:獨(dú)立封裝數(shù)據(jù)玄叠;

頁(yè)面對(duì)象層:封裝頁(yè)面對(duì)象,共頁(yè)面任務(wù)層做調(diào)用拓提;

頁(yè)面任務(wù)層:實(shí)現(xiàn)各個(gè)獨(dú)立頁(yè)面的操作读恃;

測(cè)試層:實(shí)現(xiàn)頁(yè)面測(cè)試;

測(cè)試套件層:實(shí)現(xiàn)測(cè)試層的管理調(diào)用代态;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末寺惫,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蹦疑,更是在濱河造成了極大的恐慌西雀,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件歉摧,死亡現(xiàn)場(chǎng)離奇詭異艇肴,居然都是意外死亡腔呜,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門再悼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來核畴,“玉大人,你說我怎么就攤上這事冲九“荩” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵莺奸,是天一觀的道長(zhǎng)丑孩。 經(jīng)常有香客問我,道長(zhǎng)灭贷,這世上最難降的妖魔是什么温学? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮氧腰,結(jié)果婚禮上枫浙,老公的妹妹穿的比我還像新娘。我一直安慰自己古拴,他們只是感情好箩帚,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著黄痪,像睡著了一般紧帕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上桅打,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天是嗜,我揣著相機(jī)與錄音,去河邊找鬼挺尾。 笑死鹅搪,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的遭铺。 我是一名探鬼主播丽柿,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼魂挂!你這毒婦竟也來了甫题?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤涂召,失蹤者是張志新(化名)和其女友劉穎坠非,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體果正,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡炎码,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年盟迟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辅肾。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡队萤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出矫钓,到底是詐尸還是另有隱情,我是刑警寧澤舍杜,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布新娜,位于F島的核電站,受9級(jí)特大地震影響既绩,放射性物質(zhì)發(fā)生泄漏概龄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一饲握、第九天 我趴在偏房一處隱蔽的房頂上張望私杜。 院中可真熱鬧,春花似錦救欧、人聲如沸衰粹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)铝耻。三九已至,卻和暖如春蹬刷,著一層夾襖步出監(jiān)牢的瞬間瓢捉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工办成, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留泡态,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓迂卢,卻偏偏與公主長(zhǎng)得像某弦,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子冷守,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

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