Selenium自動(dòng)化驗(yàn)收測(cè)試_第1頁(yè)
Selenium自動(dòng)化驗(yàn)收測(cè)試_第2頁(yè)
Selenium自動(dòng)化驗(yàn)收測(cè)試_第3頁(yè)
Selenium自動(dòng)化驗(yàn)收測(cè)試_第4頁(yè)
Selenium自動(dòng)化驗(yàn)收測(cè)試_第5頁(yè)
已閱讀5頁(yè),還剩7頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Web 應(yīng)用程序的驗(yàn)收測(cè)試常常涉及一些手工任務(wù),例如打開(kāi)一個(gè)瀏覽器,并執(zhí)行一個(gè)測(cè)試用例中所描述的操作。但是手工執(zhí)行的任務(wù)容易出現(xiàn)操作人員人為的錯(cuò)誤,也比較費(fèi)時(shí)間。因此,盡可能將這些任務(wù)自動(dòng)化,以消除人為因素,這是一種很好的做法。于是 Selenium 之類的測(cè)試工具就有了用武之地。Selenium 幫助您自動(dòng)化驗(yàn)收測(cè)試,從而可以構(gòu)建經(jīng)過(guò)更嚴(yán)格測(cè)試、因而更為可靠也更易于維護(hù)的軟件。驗(yàn)收測(cè)試也稱黑盒測(cè)試和功能測(cè)試,是測(cè)試和檢驗(yàn)應(yīng)用程序是否能按照涉眾(stakeholder)的功能性需求、非功能性需求和其他重要需求來(lái)運(yùn)行的一種方法。驗(yàn)收測(cè)試是單元測(cè)試和組合測(cè)試的補(bǔ)充,后兩者通常是使用 xUnit 框

2、架編寫(xiě)的。驗(yàn)收測(cè)試也可以使用編程語(yǔ)言來(lái)編寫(xiě),但是 Selenium 和其他類似的工具,例如 Fitnesse,也支持用特定于工具的文檔格式編寫(xiě)測(cè)試。驗(yàn)收測(cè)試與單元測(cè)試和組合測(cè)試有以下不同之處:· 應(yīng)用程序是作為一個(gè)完整的端到端實(shí)體來(lái)測(cè)試的,而不是像單元測(cè)試和組合測(cè)試那樣,只是測(cè)試一個(gè)類或一組類。· 驗(yàn)收測(cè)試是在用戶界面(例如一個(gè)瀏覽器)上執(zhí)行的,而不是在 Web 應(yīng)用程序界面上執(zhí)行的。· 編寫(xiě)測(cè)試用例的人不一定知道應(yīng)用程序的內(nèi)部結(jié)構(gòu),因此也被稱作黑盒測(cè)試。非技術(shù)性用戶也可以編寫(xiě)驗(yàn)收測(cè)試。背景知識(shí)在討論 Selenium 之前,我要介紹關(guān)于以下三個(gè)話題的一些背景知識(shí)

3、,因?yàn)檫@些話題雖然不是本文的主題,但是和本文密切相關(guān):· 持續(xù)集成· Ajax· Ruby/Ruby on Rails持續(xù)集成持續(xù)集成的目標(biāo)是自動(dòng)化構(gòu)建和測(cè)試過(guò)程,以便每天自動(dòng)運(yùn)行一次或多次這些過(guò)程,而不是每個(gè)月手動(dòng)地運(yùn)行一次。使用持續(xù)集成的最大好處是,代碼的更改會(huì)定期地自動(dòng)被集成。如果系統(tǒng)受損,沒(méi)有構(gòu)建成功,Apache Continuum 和 Luntbuild 之類的持續(xù)集成工具可以自動(dòng)通過(guò)發(fā)送電子郵件通知團(tuán)隊(duì)(見(jiàn) 參考資料)。AjaxAjax 是 Asynchronous JavaScript and XML 的縮寫(xiě),這是為相當(dāng)老的技術(shù)新創(chuàng)造的一

4、個(gè)術(shù)語(yǔ)。Ajax 背后的主要思想是,由于只需更新部分頁(yè)面而不是整個(gè)頁(yè)面,所以 Web 應(yīng)用程序可以更快地對(duì)用戶操作做出響應(yīng)。Ajax 將更多的復(fù)雜性引入到 Web 應(yīng)用程序中,這一點(diǎn)也反映在測(cè)試中。這是因?yàn)?Ajax 就像它的名稱所表明的那樣,使用 JavaScript 和異步 HTTP 請(qǐng)求來(lái)更新頁(yè)面內(nèi)容。每個(gè)瀏覽器在實(shí)現(xiàn)中與其他瀏覽器相比有一些小小的不同。Selenium 是測(cè)試和檢測(cè)這些差異的很好的工具,因?yàn)樗诖蠖鄶?shù)流行的瀏覽器中都能夠運(yùn)行。Ruby/Ruby on RailsRuby 是一種開(kāi)放源碼的解釋型腳本語(yǔ)言,用于快捷、容易地進(jìn)行面向?qū)ο蟪绦蛟O(shè)計(jì)。它提供了大量的庫(kù),而且簡(jiǎn)單易用

5、,還具有可擴(kuò)展性和可移植性。該語(yǔ)言是由 Yukihiro “Matz” Matsumoto 創(chuàng)造的,目的是讓程序員將更多的注意力放在手頭的任務(wù)上,擺脫語(yǔ)法的煩惱。Rails 是由 David Heinemeier Hansson 創(chuàng)造的一種全棧的(full-stack)、開(kāi)放源碼的 Ruby Web 框架。Rails 的目標(biāo)是使現(xiàn)實(shí)中的應(yīng)用程序編寫(xiě)起來(lái)需要的代碼更少,并且比 J2EE 和 XML 之類的語(yǔ)言更容易。所有層都能夠無(wú)縫地一起工作,因此可以使用一種語(yǔ)言編寫(xiě)從模板到控制流乃至業(yè)務(wù)邏輯的各種東西。Rails 使用 YAML 而不是 XML 配置文件以及注釋形式的反射和運(yùn)行時(shí)擴(kuò)展。這里不存

6、在編譯階段 程序修改后將直接運(yùn)行?;仨?yè)首什么是 Selenium?Selenium 是 ThoughtWorks 專門(mén)為 Web 應(yīng)用程序編寫(xiě)的一個(gè)驗(yàn)收測(cè)試工具。據(jù) Selenium 主頁(yè)所說(shuō),與其他測(cè)試工具相比,使用 Selenium 的最大好處是:Selenium 測(cè)試直接在瀏覽器中運(yùn)行,就像真實(shí)用戶所做的一樣。Selenium 測(cè)試可以在 Windows、Linux 和 MacintoshAnd 上的 Internet Explorer、Mozilla 和 Firefox 中運(yùn)行。其他測(cè)試工具都不能覆蓋如此多的平臺(tái)。使用 Selenium 和在瀏覽器中運(yùn)行測(cè)試還有很多其他好處。下面是主要

7、的兩大好處:· 通過(guò)編寫(xiě)模仿用戶操作的 Selenium 測(cè)試腳本,可以從終端用戶的角度來(lái)測(cè)試應(yīng)用程序。· 通過(guò)在不同瀏覽器中運(yùn)行測(cè)試,更容易發(fā)現(xiàn)瀏覽器的不兼容性。Selenium 的核心,也稱 browser bot,是用 JavaScript 編寫(xiě)的。這使得測(cè)試腳本可以在受支持的瀏覽器中運(yùn)行。browser bot 負(fù)責(zé)執(zhí)行從測(cè)試腳本接收到的命令,測(cè)試腳本要么是用 HTML 的表布局編寫(xiě)的,要么是使用一種受支持的編程語(yǔ)言編寫(xiě)的。Selenium 適用于以下瀏覽器:  Internet ExplorerMozillaFirefoxSafari

8、Windows XP6.01.6+, 1.7+0.8+, 0.9+, 1.0  Red Hat Linux  1.6+, 1.7+0.8+, 0.9+, 1.0+  Mac OS X 10.3不支持1.6+, 1.7+0.8+, 0.9+, 1.0+1.3+回頁(yè)首Selenium 命令通過(guò) Selenium 命令,腳本編寫(xiě)者可以描述 browser bot 在瀏覽器中所執(zhí)行的操作??梢詫⑦@些命令分成兩類  操作(action) 和斷言(assertion):· 操作模擬用戶與 Web 應(yīng)用程序的交互。例如

9、,單擊一個(gè)按鈕和填寫(xiě)一個(gè)表單,這些都是常見(jiàn)的用戶操作,可以用 Selenium 命令來(lái)自動(dòng)化這些操作。· 斷言驗(yàn)證一個(gè)命令的預(yù)期結(jié)果。常見(jiàn)的斷言包括驗(yàn)證頁(yè)面內(nèi)容或當(dāng)前位置是否正確。在 Selenium 網(wǎng)站上可以找到可用命令的完整列表(見(jiàn) 參考資料)?;仨?yè)首Selenium 模式可以按兩種模式來(lái)使用 Selenium:test runner 和 driven。這兩種模式在復(fù)雜性和編寫(xiě)方式方面有所不同。driven 測(cè)試腳本編寫(xiě)起來(lái)往往要更復(fù)雜一些,因?yàn)樗鼈兪怯镁幊陶Z(yǔ)言編寫(xiě)的。但是如果使用 Python 或 Ruby 之類的高級(jí)動(dòng)態(tài)編程語(yǔ)言,那么這種復(fù)雜性

10、方面的差異就很小。兩種模式之間最大的不同點(diǎn)在于,如果使用 driven 腳本,測(cè)試有一部分在瀏覽器之外運(yùn)行,而如果使用 test runner 腳本的話,測(cè)試是完全在瀏覽器中運(yùn)行的。不管是 test runner 還是 driven 測(cè)試用例,都可以與持續(xù)集成工具集成。回頁(yè)首test runner 模式Selenium test runner 腳本,也稱測(cè)試用例(test case),是用 HTML 語(yǔ)言通過(guò)一個(gè)簡(jiǎn)單的表布局編寫(xiě)的,如 清單 1 所示。清單 1. Selenium 測(cè)試用例的結(jié)構(gòu) <table border="1"> <

11、tr> <td>First command</td> <td>Target</td> <td>Value</td> </tr> <tr> <td>Second command</td> <td>Target</td> <td>Value</td> </tr> </table>test runner 腳本通常與所測(cè)試的應(yīng)用程序(AUT)部署在同一個(gè)服務(wù)器上。這是因?yàn)?browser bot 使用 Ja

12、vaScript 來(lái)模擬用戶操作。這些腳本在一個(gè)受限制的沙箱環(huán)境中運(yùn)行。如果需要繞過(guò)這些限制,可以使用一個(gè)代理。test runner 腳本使用與 xUnit 框架相同的測(cè)試套件(test suite)和測(cè)試用例概念。測(cè)試用例和命令按照它們?cè)跍y(cè)試套件和測(cè)試用例中出現(xiàn)的順序依次執(zhí)行。在 清單 1 中:· 第一列包含命令 或斷言。· 第二列包含命令或斷言的目標(biāo)(target)。這里可以用多種受支持的組件定位符中的一種來(lái)指定目標(biāo)。通常使用的是組件的 ID 或名稱,但 XPath 和 DOM 定位符也是受支持的。· 第三列包含用于為命令或斷言

13、指定參數(shù)的值。例如,當(dāng)使用 type 命令時(shí),這一列可能就是一個(gè)文本域所期望的值。即使對(duì)于非技術(shù)人員來(lái)說(shuō),test runner 腳本也易于閱讀和編寫(xiě)。當(dāng)在一個(gè)瀏覽器中打開(kāi) 清單 1 中的例子時(shí),將得到類似這樣的一個(gè)表:First commandTargetValueSecond commandTargetValue接下來(lái),我將描述如何使用命令和斷言編寫(xiě)一個(gè)簡(jiǎn)單但是完整的測(cè)試用例。測(cè)試用例實(shí)例執(zhí)行 清單 2 中的測(cè)試腳本時(shí),它將執(zhí)行以下操作:1. 通過(guò)進(jìn)入 /change_address_form.html 打開(kāi)變更地址頁(yè)面。2. 在

14、 ID 為 address_field 的文本框中輸入 Betelgeuse state prison。3. 單擊名為 Submit 的輸入?yún)^(qū)。注意,這里使用 XPath 找到 Submit 按鈕,這導(dǎo)致表單數(shù)據(jù)被發(fā)送到服務(wù)器。4. 驗(yàn)證頁(yè)面是否包含文本 Address change successful。清單 2. 在測(cè)試用例中使用命令和斷言的例子 <table> <tr> <td>open</td> <td>/change_address_form.h

15、tml</td> <td></td> </tr> <tr> <td>type</td> <td>address_field</td> <td>Betelgeuse state prison</td> </tr> <tr> <td>clickAndWait</td> <td>/inputname='Submit'</td> <td></td> </t

16、r> <tr> <td>verifyTextPresent</td> <td>Address change successful</td> <td></td> </tr> </table>測(cè)試套件要達(dá)到對(duì)應(yīng)用程序的完全測(cè)試覆蓋,通常需要不止一個(gè)測(cè)試用例。這就是 Selenium 使用測(cè)試套件的原因。測(cè)試套件用于將具有類似功能的一些測(cè)試用例編成一組,以便讓它們按順序運(yùn)行。測(cè)試套件和測(cè)試用例一樣,都是用簡(jiǎn)單的 HTML 表編寫(xiě)的。Selenium 執(zhí)行的缺省測(cè)試套件的名稱是 TestS

17、uite.html。清單 3 展示了一個(gè)測(cè)試套件,該套件像通常的用戶一樣測(cè)試應(yīng)用程序。注意,測(cè)試套件使用一個(gè)只包含一列的表,表中的每一行指向一個(gè)包含某個(gè)測(cè)試用例的文件。清單 3. 測(cè)試套件示例 <table> <tr> <td>Test suite for the whole application</td> </tr> <tr> <td><a href="test_main_page.html">Access main page</a></td>

18、; </tr> <tr> <td><a href="test_login.html">Login to application</a></td> </tr> <tr> <td><a href="test_address_change.html">Change address</a></td> </tr> <tr> <td><a href="test_logout

19、.html">Logout from application</a></td> </tr> </table>接下來(lái)我將把目光轉(zhuǎn)移到 driven 測(cè)試腳本?;仨?yè)首driven 模式driven Selenium 腳本是用多種受支持的編程語(yǔ)言中的一種編寫(xiě)的 目前可用的有 Java、Ruby 和 Python 驅(qū)動(dòng)程序。這些腳本在瀏覽器之外的一個(gè)單獨(dú)的進(jìn)程中運(yùn)行。驅(qū)動(dòng)程序的任務(wù)是執(zhí)行測(cè)試腳本,并通過(guò)與運(yùn)行在瀏覽器中的 browser bot 進(jìn)行通信來(lái)驅(qū)動(dòng)瀏覽器。驅(qū)動(dòng)程序與 browser bot 之間的通信使用一種簡(jiǎn)單的特定于 Se

20、lenium 的連接語(yǔ)言 Selenese。driven 腳本比 test runner 腳本更強(qiáng)大、更靈活,可以將它們與 xUnit 框架集成。driven 腳本的缺點(diǎn)(與 test runner 腳本相比)是,這種腳本編寫(xiě)和部署起來(lái)更復(fù)雜。這是因?yàn)轵?qū)動(dòng)程序必須執(zhí)行以下任務(wù):· 啟動(dòng)服務(wù)器。· 部署所測(cè)試的應(yīng)用程序(AUT)。· 部署測(cè)試腳本。· 啟動(dòng)瀏覽器。· 發(fā)送命令到 browser bot。· 驗(yàn)證 browser bot 執(zhí)行的命令的結(jié)果。driven 腳本更依賴于應(yīng)用程序運(yùn)行時(shí)環(huán)境。例如,Java 驅(qū)動(dòng)程序使用一個(gè)嵌入式

21、 Jetty 或 Tomcat 實(shí)例來(lái)部署所測(cè)試的應(yīng)用程序。目前,已經(jīng)有人在致力于將 Selenium 集成到 Ruby on Rails 中,但是在我撰寫(xiě)本文之際,這個(gè)集成版本還沒(méi)有被發(fā)布。清單 4 摘自一個(gè)使用 Ruby 驅(qū)動(dòng)程序的 driven 測(cè)試腳本。注意,我省略了用于啟動(dòng)服務(wù)器和瀏覽器的步驟,這個(gè)測(cè)試腳本代碼幾乎和 test runner 腳本一樣簡(jiǎn)單。清單 4. 使用 Ruby 驅(qū)動(dòng)程序的例子 . . puts selenium.open('/logout.html') puts selenium.verify_location('/index.

22、html') . .回頁(yè)首現(xiàn)實(shí)中的需求在接下來(lái)的兩節(jié)(現(xiàn)實(shí)中的需求 和 現(xiàn)實(shí)中的用例)中,我將描述如何在現(xiàn)實(shí)場(chǎng)景中使用 Selenium,并針對(duì)用 Ruby on Rails 和一點(diǎn)兒 Ajax 技術(shù)編寫(xiě)的一個(gè)簡(jiǎn)單的股票報(bào)價(jià)查看器應(yīng)用程序編寫(xiě) Selenium 測(cè)試用例。雖然這個(gè)應(yīng)用程序是用 Ruby on Rails 編寫(xiě)的,但是也可以將這個(gè)例子應(yīng)用于任何 Web 應(yīng)用程序,因?yàn)闇y(cè)試腳本是按 test runner 模式以 HTML 編寫(xiě)的。這個(gè)示例應(yīng)用程序是用 Ruby 1.8.3 和 Ruby on Rails 0.14.2 測(cè)試的,但是它也可能可以使用更舊的

23、或更新的版本。如果有 Linux,那么發(fā)行版中通常已經(jīng)包括了 Ruby。在命令提示符下運(yùn)行 ruby -v,檢查您所擁有的版本。對(duì)于大多數(shù)平臺(tái),都可以在/ 上找到一個(gè) Ruby 發(fā)行版。接下來(lái)的步驟是通過(guò) RubyGems 打包系統(tǒng)安裝 Ruby on Rails。為此,只需執(zhí)行 gem install rails -include-dependencies。在某些平臺(tái)上,必須執(zhí)行一些額外的步驟,所以請(qǐng)?jiān)L問(wèn) Ruby on Rails 網(wǎng)站,以獲得更多細(xì)節(jié)。在我撰寫(xiě)本文之際,目前可用的 Seleni

24、um 版本是 0.6。我已經(jīng)將它集成在示例應(yīng)用程序中(見(jiàn) 下載 小節(jié)),我的做法是從 Selenium Core 包,然后將名為 selenium 的文件夾復(fù)制到用于靜態(tài)內(nèi)容的文件夾。在 Ruby on Rails 應(yīng)用程序中,這個(gè)文件夾的名稱是 public。在 J2EE Web 應(yīng)用程序中,可以將 selenium 文件夾放在 Web 應(yīng)用程序的根目錄或 WAR 歸檔文件中。最后一步是下載示例應(yīng)用程序。從 下載 小節(jié)中獲得這個(gè)包。解壓應(yīng)用程序,并打開(kāi)一個(gè)命令提示符。然后轉(zhuǎn)入應(yīng)用程序被解壓到的那個(gè)目錄。為了啟動(dòng)應(yīng)用程序,運(yùn)行 ruby scr

25、ipt/server。應(yīng)該看到 Rails 成功啟動(dòng)了,如 圖 1 所示。圖 1. 從命令提示符下運(yùn)行 Ruby on Rails回頁(yè)首現(xiàn)實(shí)中的用例在本節(jié)中,我將列出示例應(yīng)用程序的用例。通過(guò)這些簡(jiǎn)化的用例,可以編寫(xiě)模擬用戶所執(zhí)行步驟的驗(yàn)收測(cè)試,并驗(yàn)證這些步驟的結(jié)果是否與預(yù)期相符。股票報(bào)價(jià)應(yīng)用程序?qū)崿F(xiàn)了以下四個(gè)用例:· 登錄· 查看股票· 查看股票細(xì)節(jié)· 退出實(shí)現(xiàn)這些用例的代碼已經(jīng)編寫(xiě)好了;可以在 app 目錄中找到該代碼,測(cè)試用例在 public/selenium/tests 文件夾中。登錄用例大多數(shù)人都知道登錄頁(yè)面是如何工作的 輸入

26、用戶名和密碼,然后將數(shù)據(jù)提交到服務(wù)器。如果憑證有效,就可以成功登錄,并看到受安全保護(hù)的資源。在示例應(yīng)用程序中,這個(gè)測(cè)試用例包含以下用戶操作和斷言,必須將它轉(zhuǎn)換成一個(gè) Selenium 測(cè)試用例:1. 單擊登錄鏈接。2. 驗(yàn)證系統(tǒng)是否要求用戶進(jìn)行登錄。3. 輸入用戶名。4. 輸入密碼。5. 按下登錄按鈕。6. 驗(yàn)證是否登錄成功。圖 2 展示了用于這些需求的 Selenium 測(cè)試用例。注意,我是在運(yùn)行測(cè)試之后截取屏幕快照的。綠色箭頭表示成功地通過(guò)驗(yàn)證的斷言。圖 2. 登錄和查看股票測(cè)試用例查看股票測(cè)試用例查看股票頁(yè)面顯示一個(gè)公司列表。用于這個(gè)頁(yè)面的測(cè)試用例非常簡(jiǎn)單,所以被包括在前一個(gè)測(cè)

27、試用例的后面。該測(cè)試用例驗(yàn)證當(dāng)前位置是否為 /main/list_stocks,以及頁(yè)面是否包含文本 Click on a company name to view details。查看股票細(xì)節(jié)用例查看股票細(xì)節(jié)用例是在查看股票頁(yè)面上觸發(fā)的。用戶在一個(gè)公司名稱上單擊鼠標(biāo)時(shí),就觸發(fā)了到服務(wù)器的一個(gè) Ajax 請(qǐng)求。服務(wù)器的響應(yīng)包括該公司的詳細(xì)信息,這些信息將插入到當(dāng)前頁(yè)面中,而不必重新裝載完整的頁(yè)面。用于這個(gè)用例的測(cè)試用例執(zhí)行以下用戶操作:1. 單擊公司名稱 Acme Oil。2. 驗(yàn)證頁(yè)面上是否顯示該公司的詳細(xì)信息。3. 單擊公司名稱 Acme Automotive

28、。4. 驗(yàn)證頁(yè)面上是否顯示該公司的詳細(xì)信息。由于使用了 Ajax,請(qǐng)求是異步發(fā)生的。在一般的 Web 應(yīng)用程序中,所有東西通常都是同步的,因此這一點(diǎn)提出了一種不同的挑戰(zhàn)??梢韵駵y(cè)試其他功能一樣來(lái)測(cè)試 Ajax 功能。惟一的不同是,必須讓 Selenium 暫停,等待 Ajax 命令完成。為此,可以使用 pause 命令來(lái)等待 Ajax 命令的完成。另外,Joseph Moore 在他最近的 blog 貼中提到,還可以使用 waitForValue 和 waitForCondition 命令代替 pause 命令(見(jiàn) 參考資料)。圖 3 展示了被轉(zhuǎn)換成 Se

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論