敏捷實(shí)踐 (3) - Appium Ruby Console

appium.png

1. Appium Ruby Console

Appium Ruby Console (ARC) 顧名思義就是Appium控制臺(tái)(命令行模式)叁鉴。
https://github.com/appium/ruby_console

2. 安裝

如果你在 敏捷實(shí)踐(1) - 我們是如何自動(dòng)化App驗(yàn)收標(biāo)準(zhǔn) 中,已經(jīng)安裝了ARC,這個(gè)步就可以忽略蚁署。

$ gem install appium_lib
$ gem install appium_console

3. 啟動(dòng)

3.1 appium

在打開(kāi)一個(gè)命令行窗口運(yùn)行 appium 服務(wù)
$ appium

run_appium.png

3.2 拉取Sample-Code

`$ git clone https://github.com/appium/sample-code.git

3.3 運(yùn)行ARC

arc 會(huì)自動(dòng)讀取 appium.txt 并通知appium啟動(dòng)appium.txt指定的App

app的位置在sample-code/sample-code/apps/TestApp/build/release-iphonesimulator/TestApp.app

$ cd sample-code/sample-code/examples/ruby
# 運(yùn)行 bundle 安裝依賴包
$ bundle
$ arc

這個(gè)一步發(fā)生了什么恃慧?
** ARC 啟動(dòng),讀取appium.txt的配置發(fā)送給 appium **

run_arc.png

** appium 收到請(qǐng)求,啟動(dòng)模擬器鹅髓,安裝WebDriverAgent & TestApp **
下面粘貼的日志信息可以讓大家看到許多背后的細(xì)節(jié),對(duì)理解appium如何工作很有幫助京景。

EdwarddeMBP:appium_work edwardzhou$ appium
[Appium] Welcome to Appium v1.6.3
[Appium] Appium REST http interface listener started on 0.0.0.0:4723
[HTTP] --> POST /wd/hub/session {"desiredCapabilities":{"browserName":"","version":"","platform":"ANY","javascriptEnabled":true,"cssSelectorsEnabled":true,"takesScreenshot":true,"nativeEvents":false,"rotatable":false,"newCommandTimeout":999999,"platformName":"ios","versionNumber":"10.2","deviceName":"iPhone 6","app":"/Users/edwardzhou/appium_work/sample-code/sample-code/apps/TestApp/build/release-iphonesimulator/TestApp.app","automationName":"XCUITest","language":"zh","locale":"zh_CN","autoAcceptAlerts":true}}
[debug] [MJSONWP] Calling AppiumDriver.createSession() with args: [{"browserName":"","version":"","platform":"ANY","javascriptEnabled":true,"cssSelectorsEnabled":true,"takesScreenshot":true,"nativeEvents":false,"rotatable":false,"newCommandTimeout":999999,"platformName":"ios","versionNumber":"10.2","deviceName":"iPhone 6","app":"/Users/edwardzhou/appium_work/sample-code/sample-code/apps/TestApp/build/release-iphonesimulator/TestApp.app","automationName":"XCUITest","language":"zh","locale":"zh_CN","autoAcceptAlerts":true},null,null,null,null]
[Appium] Creating new XCUITestDriver session
[Appium] Capabilities:
[Appium]   browserName: ''
[Appium]   version: ''
[Appium]   platform: 'ANY'
[Appium]   javascriptEnabled: true
[Appium]   cssSelectorsEnabled: true
[Appium]   takesScreenshot: true
[Appium]   nativeEvents: false
[Appium]   rotatable: false
[Appium]   newCommandTimeout: 999999
[Appium]   platformName: 'ios'
[Appium]   versionNumber: '10.2'
[Appium]   deviceName: 'iPhone 6'
[Appium]   app: '/Users/edwardzhou/appium_work/sample-code/sample-code/apps/TestApp/build/release-iphonesimulator/TestApp.app'
[Appium]   automationName: 'XCUITest'
[Appium]   language: 'zh'
[Appium]   locale: 'zh_CN'
[Appium]   autoAcceptAlerts: true
[debug] [XCUITest] XCUITestDriver version: 2.5.3
[BaseDriver] The following capabilities were provided, but are not recognized by appium: version, platform, javascriptEnabled, cssSelectorsEnabled, takesScreenshot, nativeEvents, rotatable, versionNumber.
[XCUITest] The capabilities 'autoAcceptAlerts' and 'autoDismissAlerts' do not work for XCUITest-based tests. Please adjust your alert handling accordingly.
[BaseDriver] Session created with session id: 136bbab8-78e5-4e5d-9cd1-0b174eeaa835
[debug] [XCUITest] Xcode version set to '8.2.1'
[debug] [XCUITest] iOS SDK Version set to '10.2'
[XCUITest] Simluator udid not provided, using desired caps to create a new simulator
[XCUITest] No platformVersion specified. Using latest version Xcode supports: '10.2' This may cause problems if a simulator does not exist for this platform version.
[iOSSim] Constructing iOS simulator for Xcode version 8.2.1 with udid 'C2E88820-BB65-4D79-923B-15C63D5FA384'
[XCUITest] Created simulator with udid 'C2E88820-BB65-4D79-923B-15C63D5FA384'.
[XCUITest] Determining device to run tests on: udid: 'C2E88820-BB65-4D79-923B-15C63D5FA384', real device: false
[BaseDriver] Using local app '/Users/edwardzhou/appium_work/sample-code/sample-code/apps/TestApp/build/release-iphonesimulator/TestApp.app'
[debug] [XCUITest] Checking whether app '/Users/edwardzhou/appium_work/sample-code/sample-code/apps/TestApp/build/release-iphonesimulator/TestApp.app' is actually present
[debug] [XCUITest] App is present
[debug] [iOS] Getting bundle ID from app '/Users/edwardzhou/appium_work/sample-code/sample-code/apps/TestApp/build/release-iphonesimulator/TestApp.app': 'io.appium.TestApp'
[debug] [iOSLog] Starting iOS 10.2 simulator log capture
[debug] [iOSLog] System log path: /Users/edwardzhou/Library/Logs/CoreSimulator/C2E88820-BB65-4D79-923B-15C63D5FA384/system.log
[XCUITest] Setting up simulator
[debug] [iOSSim] Checking whether simulator has been run before
[debug] [iOSSim] Simulator has not been run before
[debug] [iOS] No simulator directories found.
[debug] [iOSSim] Attempting to launch and quit the simulator, to create directory structure
[debug] [iOSSim] Will launch with Safari? false
[iOSSim] Starting simulator with command: open -Fn /Applications/Xcode.app/Contents/Developer/Applications/Simulator.app --args -CurrentDeviceUDID C2E88820-BB65-4D79-923B-15C63D5FA384
[iOSSim] Simulator log at '/Users/edwardzhou/Library/Logs/CoreSimulator/C2E88820-BB65-4D79-923B-15C63D5FA384/system.log'
[iOSSim] Tailing simulator logs until we encounter the string "com.apple.springboard"
[iOSSim] We will time out after 60000ms
[debug] [iOSSim] Waiting an extra 10000ms for the simulator to really finish booting
[debug] [iOSSim] Done waiting extra time for simulator
[iOSSim] Simulator booted in 11143ms
[debug] [iOSSim] Checking whether simulator has been run before
[debug] [iOSSim] Simulator has been run before
[debug] [iOSSim] Killing all iOS Simulators
[debug] [iOS] Setting locale information
[debug] [iOSSim] New language: zh
[debug] [iOSSim] New locale: zh_CN
[debug] [iOSSim] Writing new locale plist data
[debug] [iOS] Locale was updated. Stopping simulator.
[debug] [iOS] Killing the simulator
[debug] [iOSSim] Killing all iOS Simulators
[debug] [iOS] No iOS / app preferences to set
[XCUITest] Simulator with udid 'C2E88820-BB65-4D79-923B-15C63D5FA384' not booted. Booting up now
[debug] [iOSSim] Killing all iOS Simulators
[iOSSim] Starting simulator with command: open -Fn /Applications/Xcode.app/Contents/Developer/Applications/Simulator.app --args -CurrentDeviceUDID C2E88820-BB65-4D79-923B-15C63D5FA384
[iOSSim] Simulator log at '/Users/edwardzhou/Library/Logs/CoreSimulator/C2E88820-BB65-4D79-923B-15C63D5FA384/system.log'
[iOSSim] Tailing simulator logs until we encounter the string "com.apple.springboard"
[iOSSim] We will time out after 60000ms
[debug] [iOSSim] Waiting an extra 10000ms for the simulator to really finish booting
[debug] [iOSSim] Done waiting extra time for simulator
[iOSSim] Simulator booted in 22072ms
[debug] [XCUITest] Installing app '/Users/edwardzhou/appium_work/sample-code/sample-code/apps/TestApp/build/release-iphonesimulator/TestApp.app' on device
[XCUITest] Using WDA path: '/Users/edwardzhou/servers/node-v7.4.0/lib/node_modules/appium/node_modules/appium-xcuitest-driver/WebDriverAgent'
[XCUITest] Using WDA agent: '/Users/edwardzhou/servers/node-v7.4.0/lib/node_modules/appium/node_modules/appium-xcuitest-driver/WebDriverAgent/WebDriverAgent.xcodeproj'
[XCUITest] Launching WebDriverAgent on the device
[debug] [XCUITest] Carthage found: /usr/local/bin/carthage
[debug] [XCUITest] Killing hanging processes
[debug] [XCUITest] Beginning test with command 'xcodebuild build-for-testing test-without-building -project /Users/edwardzhou/servers/node-v7.4.0/lib/node_modules/appium/node_modules/appium-xcuitest-driver/WebDriverAgent/WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination id=C2E88820-BB65-4D79-923B-15C63D5FA384 -configuration Debug' in directory '/Users/edwardzhou/servers/node-v7.4.0/lib/node_modules/appium/node_modules/appium-xcuitest-driver/WebDriverAgent'
[debug] [XCUITest] Waiting up to 60000ms for WebDriverAgent to start
[debug] [XCUITest] Log file for xcodebuild test: /Users/edwardzhou/Library/Developer/Xcode/DerivedData/WebDriverAgent-ddapapcqxaoabrhjkjsyvzexgoxy/Logs/Test/98A1C0F5-03F0-4A95-9408-FE68E30628B2/Session-WebDriverAgentRunner-2017-02-26_191404-oFrhPq.log
[debug] [XCUITest] WebDriverAgent successfully started after 15361ms
[debug] [XCUITest] Sending createSession command to WDA
[debug] [JSONWP Proxy] Proxying [POST /session] to [POST http://localhost:8100/session] with body: {"desiredCapabilities":{"bundleId":"io.appium.TestApp","arguments":[],"environment":{},"shouldWaitForQuiescence":true}}
[debug] [JSONWP Proxy] Got response with status 200: {"value":{"sessionId":"AC8C1ADF-3E96-4C55-9302-73B4D7AA6B89","capabilities":{"device":"iphone","browserName":" ","sdkVersion":"10.2","CFBundleIdentifier":"local.pid.35906"}},"sessionId":"AC8C1ADF-3E96-4C55-9302-73B4D7AA6B89","status":0}
[debug] [XCUITest] Setting initial orientation to 'PORTRAIT'
[debug] [JSONWP Proxy] Proxying [POST /orientation] to [POST http://localhost:8100/session/AC8C1ADF-3E96-4C55-9302-73B4D7AA6B89/orientation] with body: {"orientation":"PORTRAIT"}
[debug] [JSONWP Proxy] Got response with status 200: {"value":{},"sessionId":"AC8C1ADF-3E96-4C55-9302-73B4D7AA6B89","status":0}
[Appium] New XCUITestDriver session created successfully, session 136bbab8-78e5-4e5d-9cd1-0b174eeaa835 added to master session list
[debug] [MJSONWP] Responding to client with driver.createSession() result: {"webStorageEnabled":false,"locationContextEnabled":false,"browserName":"","platform":"ANY","javascriptEnabled":true,"databaseEnabled":false,"takesScreenshot":true,"networkConnectionEnabled":false,"version":"","cssSelectorsEnabled":true,"nativeEvents":false,"rotatable":false,"newCommandTimeout":999999,"platformName":"ios","versionNumber":"10.2","deviceName":"iPhone 6","app":"/Users/edwardzhou/appium_work/sample-code/sample-code/apps/TestApp/build/release-iphonesimulator/TestApp.app","automationName":"XCUITest","language":"zh","locale":"zh_CN","autoAcceptAlerts":true}
[HTTP] <-- POST /wd/hub/session 200 68905 ms - 645 
[HTTP] --> GET /wd/hub/status {}
[debug] [MJSONWP] Calling AppiumDriver.getStatus() with args: []
[debug] [MJSONWP] Responding to client with driver.getStatus() result: {"build":{"version":"1.6.3","revision":null}}
[HTTP] <-- GET /wd/hub/status 200 11 ms - 83 
[HTTP] --> POST /wd/hub/session/136bbab8-78e5-4e5d-9cd1-0b174eeaa835/timeouts/implicit_wait {"ms":0}
[debug] [MJSONWP] Calling AppiumDriver.implicitWait() with args: [0,"136bbab8-78e5-4e5d-9cd1-0b174eeaa835"]
[debug] [XCUITest] Executing command 'implicitWait'
[debug] [BaseDriver] Set implicit wait to 0ms
[debug] [MJSONWP] Responding to client with driver.implicitWait() result: null
[HTTP] <-- POST /wd/hub/session/136bbab8-78e5-4e5d-9cd1-0b174eeaa835/timeouts/implicit_wait 200 17 ms - 76 

** iOS 模擬器就緒**

ios_01.png

大家看到窿冯,app首次運(yùn)行彈出的alert,就是導(dǎo)致sample-code中的測(cè)試用例無(wú)法通過(guò)的原因确徙。

因?yàn)樾汛械牟樵兌ㄎ唬际窃诋?dāng)前視圖中處理鄙皇,這個(gè)alert出現(xiàn)后就改變了當(dāng)前視圖芜赌。

let me show you~

在 arc 中輸入page,回車

[1] pry(main)> page
XCUIElementTypeApplication
   name, label:  
XCUIElementTypeOther
   name, label: 3 格 Wi-Fi 信號(hào)(共 3 格)
   value: SSID
XCUIElementTypeOther
   name, label: 下午7:27
XCUIElementTypeOther
   name, label: 電池電量:-100%
XCUIElementTypeAlert
   name, label: “TestApp”可能使 iPhone 變慢
XCUIElementTypeStaticText
   name, label, value: “TestApp”可能使 iPhone 變慢
XCUIElementTypeStaticText
   name, label, value: 應(yīng)用開(kāi)發(fā)者需要更新此應(yīng)用以改進(jìn)其兼容性伴逸。
XCUIElementTypeButton
   name, label: 好
nil
[2] pry(main)> 

page 指令背后的細(xì)節(jié) (appium log)

[HTTP] --> GET /wd/hub/session/136bbab8-78e5-4e5d-9cd1-0b174eeaa835/context {}
[debug] [MJSONWP] Calling AppiumDriver.getCurrentContext() with args: ["136bbab8-78e5-4e5d-9cd1-0b174eeaa835"]
[debug] [XCUITest] Executing command 'getCurrentContext'
[debug] [MJSONWP] Responding to client with driver.getCurrentContext() result: "NATIVE_APP"
[HTTP] <-- GET /wd/hub/session/136bbab8-78e5-4e5d-9cd1-0b174eeaa835/context 200 7 ms - 84 
[HTTP] --> GET /wd/hub/session/136bbab8-78e5-4e5d-9cd1-0b174eeaa835/context {}
[debug] [MJSONWP] Calling AppiumDriver.getCurrentContext() with args: ["136bbab8-78e5-4e5d-9cd1-0b174eeaa835"]
[debug] [XCUITest] Executing command 'getCurrentContext'
[debug] [MJSONWP] Responding to client with driver.getCurrentContext() result: "NATIVE_APP"
[HTTP] <-- GET /wd/hub/session/136bbab8-78e5-4e5d-9cd1-0b174eeaa835/context 200 4 ms - 84 
[HTTP] --> GET /wd/hub/session/136bbab8-78e5-4e5d-9cd1-0b174eeaa835/source {}
[debug] [MJSONWP] Calling AppiumDriver.getPageSource() with args: ["136bbab8-78e5-4e5d-9cd1-0b174eeaa835"]
[debug] [XCUITest] Executing command 'getPageSource'
[debug] [JSONWP Proxy] Proxying [GET /source/xml] to [GET http://localhost:8100/session/AC8C1ADF-3E96-4C55-9302-73B4D7AA6B89/source/xml] with no body
[debug] [JSONWP Proxy] Got response with status 200: "{\n  \"value\" : {\n    \"tree\" : \"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\\n<XCUIElementTypeApplication type=\\\"XCUIElementTypeApplication\\\" name=\\\" \\\" label=\\\" \\\" visible=\\\"true\\\" enabled=\\\"true\\\" x=\\\"0\\\" y=\\\"0\\\" width=\\\"375\\\" height=\\\"667\\\">\\n  <XCUIElementTypeWindow type=\\\"XCUIElementTypeWindow\\\" visible=\\\"false\\\" enabled=\\\"true\\\" x=\\\"0\\\" y=\\\"0\\\" width=\\\"375\\\" height=\\\"667\\\">\\n    <XCUIElementTypeOther type=\\\"XCUIElementTypeOther\\\" visible=\\\"false\\\" enabled=\\\"true\\\" x=\\\"0\\\" y=\\\"0\\\" width=\\\"375\\\" height=\\\"667\\\"\\/>\\n    <XCUIElementTypeOther type=\\\"XCUIElementTypeOther\\\" visible=\\\"false\\\" enabled=\\\"true\\\" x=\\\"0\\\" y=\\\"0\\\" width=\\\"375\\\" height=\\\"667\\\"\\/>\\n  <\\/XCUIElementTypeWindow>\\n  <XCUIElementTypeWindow type=\\\"XCUIElementTypeWindow\\\" visible=\\\"false\\\" enabled=\\\"true\\\" x=\\\"0\\\" y=\\\"0\\\" width=\\\"375\\\" height=\\\"667\\\">\\n    <XCUIElementType...
[debug] [MJSONWP] Responding to client with driver.getPageSource() result: "<?xml version=\"1.0\" encoding=\"UTF-8\"?><AppiumAUT><XCUIElementTypeApplication type=\"XCUIElementTypeApplication\" name=\" \" label=\" \" visible=\"true\" enabled=\"true\" x=\"0\" y=\"0\" width=\"375\" height=\"667\">\n  <XCUIElementTypeWindow type=\"XCUIElementTypeWindow\" visible=\"false\" enabled=\"true\" x=\"0\" y=\"0\" width=\"375\" height=\"667\">\n    <XCUIElementTypeOther type=\"XCUIElementTypeOther\" visible=\"false\" enabled=\"true\" x=\"0\" y=\"0\" width=\"375\" height=\"667\"/>\n    <XCUIElementTypeOther type=\"XCUIElementTypeOther\" visible=\"false\" enabled=\"true\" x=\"0\" y=\"0\" width=\"375\" height=\"667\"/>\n  </XCUIElementTypeWindow>\n  <XCUIElementTypeWindow type=\"XCUIElementTypeWindow\" visible=\"false\" enabled=\"true\" x=\"0\" y=\"0\" width=\"375\" height=\"667\">\n    <XCUIElementTypeOther type=\"XCUIElementTypeOther\" visible=\"false\" enabled=\"true\" x=\"0\" y=\"0\" width=\"375\" height=\"667\"/>\n  </XCUIElementTypeWindow>\n  <XCUIElementTypeWindow type=\"XCUIElementTypeWin...
[HTTP] <-- GET /wd/hub/session/136bbab8-78e5-4e5d-9cd1-0b174eeaa835/source 200 422 ms - 14307 

點(diǎn)擊 “好”缠沈,或直接在arc中輸入 alert_accept 回車,關(guān)閉對(duì)話框

ios_02.png

4. 測(cè)試指令

4.1 page

page 用于查看當(dāng)前視圖中有哪些元素错蝴,并以行文本形式輸出

[2] pry(main)> alert_accept
{}
[3] pry(main)> page
XCUIElementTypeApplication
   name, label: TestApp
XCUIElementTypeTextField
   name: IntegerA
  label: TextField1
XCUIElementTypeTextField
   name: IntegerB
  label: TextField2
XCUIElementTypeButton
   name: ComputeSumButton
  label: Compute Sum
XCUIElementTypeStaticText
   name: Answer
  label: SumLabel
  value: SumLabel
XCUIElementTypeButton
   name, label: show alert
XCUIElementTypeButton
   name, label: contact alert
XCUIElementTypeButton
   name, label: location alert
XCUIElementTypeStaticText
   name, label, value: AppElem
XCUIElementTypeSlider
   name, label: AppElem
   value: 50%
XCUIElementTypeStaticText
   name: Accessibility
XCUIElementTypeStaticText
   name, label, value: AppElem
XCUIElementTypeButton
   name: DisabledButton
  label: disabled button
XCUIElementTypeSwitch
   name, label: locationStatus
   value: 0
XCUIElementTypeButton
   name, label: Test Gesture
XCUIElementTypeButton
   name, label: Crash
XCUIElementTypeOther
   name, label: 3 of 3 Wi-Fi bars
   value: SSID
XCUIElementTypeOther
   name, label: 下午7:48
XCUIElementTypeOther
   name, label: -100% battery power
nil
[4] pry(main)> 

測(cè)試應(yīng)用為T(mén)estApp

XCUIElementTypeApplication
name, label: TestApp

第一個(gè)輸入框洲愤,類型為 XCUIElementTypeTextField,
name (id) 為IntegerA
文本標(biāo)簽TextField1

XCUIElementTypeTextField
name: IntegerA
label: TextField1

....


4.2 source

source 作用同 Page
source 返回個(gè)是XML的文檔格式。

4.3 查找元素(find_element, find, id, xpath ...)

Ref:
https://github.com/appium/ruby_lib/blob/master/docs/docs.md

Appium Ruby Lib(SeleniumDriver)真正提供的查找元素的方法是

  • find_element - 查找單個(gè)元素, 如果有多個(gè)滿足條件的顷锰,返回第一個(gè)柬赐。如果一個(gè)都沒(méi)有,報(bào)錯(cuò)官紫。
  • find_elements - 查找多個(gè)元素肛宋, 并以數(shù)組形式返回。沒(méi)找到束世,返回空數(shù)組 []酝陈。

其他的方法(find, id, xpath ...),都是語(yǔ)法糖良狈。

語(yǔ)法糖 對(duì)應(yīng)find_element(s)
id('comp_id') find_element(:id, 'comp_id')
buttons find_elements(:class, 'XCUIElementTypeButton')
button(index) => buttons[index]
texts find_elements(:class, 'XCUIElementTypeStaticText')
text(index) => texts[index]
textfields find_elements(:class, 'XCUIElementTypeTextField')
textfield[index] => textfields[index]
xpath('xpath_expr') find_element(:xpath, 'xpath_expr')
xpaths('xpath_expr') find_elements(:xpath, 'xpath_expr)
finds('text') find_elements(:xpath, "(//*)[@*[contains(translate(., "Text", "text"), "text")]]"
find('text') => finds('text')[0]

基于性能考慮后添,建議盡量使用 id 查找元素,find/finds 的性能最差.


4.4 對(duì)元素執(zhí)行動(dòng)作

拿到一個(gè)元素e之后,我們就是直接訪問(wèn)屬性或發(fā)送動(dòng)作遇西。

e.name # button, text
e.value # secure, textfield
e.type 'some text' # type text into textfield
e.clear # clear textfield
e.tag_name # calls .type (patch.rb)
e.text
e.size
e.location
e.rel_location
e.click
e.send_keys 'keys to send'
e.set_value 'value to set' # ruby_console specific
e.displayed? # true or false depending if the element is visible
e.selected? # is the tab selected?
e.attribute('checked') # is the checkbox checked?

這些屬性和動(dòng)作的背后馅精,都是發(fā)送指令到appium,可以直接在appium運(yùn)行日志中看到每個(gè)請(qǐng)求的具體細(xì)節(jié)粱檀。

有一點(diǎn)需要注意的是洲敢,e.click 背后的實(shí)現(xiàn)是,先獲取 e 的屏幕坐標(biāo)茄蚯,然后向該坐標(biāo)發(fā)送觸碰事件压彭,并不是說(shuō)能夠直接控制e觸發(fā)點(diǎn)擊事件。因此渗常,如果e被其他控件(如鍵盤(pán))遮住壮不,則觸碰事件實(shí)際是其他控件接受了。 這個(gè)著實(shí)坑了我們一把皱碘。


以后有時(shí)間再接著第一篇說(shuō)說(shuō)我們是如何改進(jìn)測(cè)試用例询一,把steps模版化。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末癌椿,一起剝皮案震驚了整個(gè)濱河市健蕊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌踢俄,老刑警劉巖缩功,帶你破解...
    沈念sama閱讀 211,948評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異都办,居然都是意外死亡嫡锌,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)脆丁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)世舰,“玉大人,你說(shuō)我怎么就攤上這事槽卫「梗” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,490評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵歼培,是天一觀的道長(zhǎng)震蒋。 經(jīng)常有香客問(wèn)我,道長(zhǎng)躲庄,這世上最難降的妖魔是什么查剖? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,521評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮噪窘,結(jié)果婚禮上笋庄,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好直砂,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布菌仁。 她就那樣靜靜地躺著,像睡著了一般静暂。 火紅的嫁衣襯著肌膚如雪济丘。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,842評(píng)論 1 290
  • 那天洽蛀,我揣著相機(jī)與錄音摹迷,去河邊找鬼。 笑死郊供,一個(gè)胖子當(dāng)著我的面吹牛峡碉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播颂碘,決...
    沈念sama閱讀 38,997評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼异赫,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了头岔?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,741評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤鼠证,失蹤者是張志新(化名)和其女友劉穎峡竣,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體量九,經(jīng)...
    沈念sama閱讀 44,203評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡适掰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了荠列。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片类浪。...
    茶點(diǎn)故事閱讀 38,673評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖肌似,靈堂內(nèi)的尸體忽然破棺而出费就,到底是詐尸還是另有隱情,我是刑警寧澤川队,帶...
    沈念sama閱讀 34,339評(píng)論 4 330
  • 正文 年R本政府宣布力细,位于F島的核電站,受9級(jí)特大地震影響固额,放射性物質(zhì)發(fā)生泄漏眠蚂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評(píng)論 3 313
  • 文/蒙蒙 一斗躏、第九天 我趴在偏房一處隱蔽的房頂上張望逝慧。 院中可真熱鬧,春花似錦、人聲如沸笛臣。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,770評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)捐祠。三九已至碱鳞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間踱蛀,已是汗流浹背窿给。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,000評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留率拒,地道東北人崩泡。 一個(gè)月前我還...
    沈念sama閱讀 46,394評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像猬膨,于是被迫代替她去往敵國(guó)和親角撞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評(píng)論 2 349

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

  • 1. 簡(jiǎn)介 在探索App自動(dòng)化測(cè)試工具過(guò)程中勃痴,主要接觸了 Macaca 和 Appium, 已及稍稍看了點(diǎn) Cal...
    edwardzhq閱讀 1,684評(píng)論 0 1
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理谒所,服務(wù)發(fā)現(xiàn),斷路器沛申,智...
    卡卡羅2017閱讀 134,633評(píng)論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法劣领,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法铁材,繼承相關(guān)的語(yǔ)法尖淘,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,598評(píng)論 18 399
  • 概述 Appium是一個(gè)移動(dòng)端的自動(dòng)化框架著觉,可用于測(cè)試原生應(yīng)用村生,移動(dòng)網(wǎng)頁(yè)應(yīng)用和混合型應(yīng)用,且是跨平臺(tái)的饼丘〕锰遥可用于IO...
    zhoutq閱讀 10,800評(píng)論 0 21
  • 曲湘念發(fā)短信說(shuō)下個(gè)星期要回來(lái),說(shuō)是有拍攝任務(wù)葬毫,結(jié)束了可以一起吃頓晚飯镇辉。萱準(zhǔn)予簡(jiǎn)單的回復(fù)了之后接著練歌。 后天酒吧要...
    城北的海洋閱讀 822評(píng)論 3 11