<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # TestNG 教程:Selenium 中的注釋,框架和示例 > 原文: [https://www.guru99.com/all-about-testng-and-selenium.html](https://www.guru99.com/all-about-testng-and-selenium.html) ## 什么是 TestNG? **TestNG** 是一個自動化測試框架,其中 NG 代表“下一代”。 TestNG 的靈感來自使用注釋(@)的 [JUnit](/junit-tutorial.html) 。 TestNG 克服了 JUnit 的缺點,旨在簡化端到端測試。 使用 TestNG,您可以生成正確的報告,并且可以輕松了解通過,失敗和跳過了多少個測試用例。 您可以單獨執行失敗的測試用例。 例如: * 假設您有五個測試用例,則為每個測試用例編寫一種方法(假定使用 main 方法編寫程序而未使用 testNG)。 當您第一次運行該程序時,將成功執行三種方法,而第四種方法將失敗。 然后更正第四個方法中存在的錯誤,現在您只想運行第四個方法,因為前三個方法始終可以成功執行。 不使用 TestNG,這是不可能的。 * TestNG 在 test-output 文件夾中提供了一個選項,即 testng-failed.xml 文件。 如果您只想運行失敗的測試用例,則意味著您運行此 XML 文件。 它將僅執行失敗的測試用例。 除了上述概念之外,您還將了解有關 TestNG 的更多信息,例如 TestNG 的優點,如何使用@test 批注創建測試方法,如何將這些類轉換為測試套件文件并通過 eclipse 以及從命令行執行 。 在本教程中,您將學習 * [為什么將 TestNG 與硒一起使用?](#2) * [TestNG 優于 JUnit](#3) 的優勢 * [第一個使用注釋的測試用例](#4) * [創建一個新的 TestNG 測試文件](#5) * [編碼我們的第一個測試用例](#6) * [運行測試](#7) * [正在檢查由 TestNG](#8) 創建的報告 * [NGT0]中使用的注解[](#9) * [多個測試用例](#10) * [參數](#11) * [多個參數](#12) * [TestNG 注釋的摘要](#13) ### 為什么將 TestNG 與硒一起使用? 默認的硒測試不會為測試結果生成正確的格式。 使用 TestNG,我們可以生成測試結果。 由于其優勢,大多數 Selenium 用戶都比 [Junit](/junit-tutorial.html) 更多地使用它。 TestNG 有這么多的功能,但是我們僅關注可在 Selenium 中使用的最重要的功能。 以下是 TestNG 的主要功能 * 以適當的格式生成報告,包括運行的測試用例,通過的測試用例的數量,失敗的測試用例的數量以及跳過的測試用例的數量。 * 通過將多個測試用例轉換為 testng.xml 文件,可以更輕松地對其進行分組。 您可以在其中確定應首先執行哪個測試用例的優先級。 * 只需使用名為“調用計數”的關鍵字,就可以多次執行同一測試用例而無循環。 * 使用 testng,您可以在多個瀏覽器上執行多個測試用例,即跨瀏覽器測試。 * 該測試框架可以輕松地與 Maven,Jenkins 等工具集成。 * 例如,測試中使用的注釋非常容易理解:@ BeforeMethod,@ AfterMethod,@ BeforeTest,@ AfterTest * WebDriver 沒有用于生成報告的本機機制。 TestNG 可以采用可讀格式生成報告,如下所示。 ![TestNG Tutorial: Install, Annotations, Framework, Examples in SELENIUM](https://img.kancloud.cn/aa/54/aa542c11ea60cdfe64f559561dc6655f_260x147.png "How TestNG makes Selenium tests easier") * TestNG 簡化了測試編碼的方式。 在我們的測試中,不再需要靜態的 main 方法。 操作順序由易于理解的注釋(不需要方法是靜態的)進行調節。 ![TestNG Tutorial: Install, Annotations, Framework, Examples in SELENIUM](https://img.kancloud.cn/81/dd/81dd26831487bd3d35d486ee1f6e40be_462x432.png "How TestNG makes Selenium tests easier") ![TestNG Tutorial: Install, Annotations, Framework, Examples in SELENIUM](https://img.kancloud.cn/bc/ae/bcaed5be159767d85bd0aebd482daf71_423x471.png "How TestNG makes Selenium tests easier") * 未捕獲的異常由 TestNG 自動處理,而不會過早終止測試。 這些異常在報告中被報告為失敗的步驟。 ## TestNG 比 JUnit 的優勢 與 JUnit 相比,TestNG 具有三個主要優點: * 注釋更容易理解 * 測試用例可以更容易地分組 * 可以并行測試 **TestNG 中的注釋是可以控制將如何執行其下方法的代碼行**。 它們始終以@符號開頭。 下面是一個非常早期和快速的示例。 ![TestNG Tutorial: Install, Annotations, Framework, Examples in SELENIUM](https://img.kancloud.cn/f4/47/f447eddc728bf4e8ad7234ba204defa9_515x364.png "How TestNG makes Selenium tests easier") 批注將在后面的“ TestNG 中使用的批注”一節中討論,因此如果您還不了解上述示例,那是完全可以的。 重要的是,現在要注意,TestNG 中的注釋比 JUnit 中的代碼更易于編碼和理解。 可以并行運行測試的功能在 TestNG 中可用,但在 JUnit 中不可用,因此它是使用 Selenium Grid 的測試人員的首選框架。 ## 使用注釋的第一個測試用例 在創建測試用例之前,我們應該首先在 Eclipse 中設置一個新的 TestNG Project,并將其命名為“ FirstTestNGProject”。 ### 設置一個新的 TestNG 項目 **步驟 1:**單擊文件>新建> [Java](/java-tutorial.html) 項目 ![TestNG Tutorial: Install, Annotations, Framework, Examples in SELENIUM](https://img.kancloud.cn/e5/d6/e5d6625d5a0cee14f7736099049f86c8_585x138.png) **步驟 2:**鍵入“ FirstTestNGProject”作為項目名稱,然后單擊“下一步”。 ![TestNG Tutorial: Install, Annotations, Framework, Examples in SELENIUM](https://img.kancloud.cn/4b/e8/4be865f7eeacb1e1a06233bd0121e280_543x284.png) **步驟 3:**現在,我們將開始將 TestNG 庫導入到我們的項目中。 單擊“庫”選項卡,然后單擊“添加庫…”。 ![TestNG Tutorial: Install, Annotations, Framework, Examples in SELENIUM](https://img.kancloud.cn/ea/c0/eac0592e79c1da3004950bb0d3325cdd_495x229.png) **步驟 4:**在“添加庫”對話框中,選擇“ TestNG”,然后單擊“下一步”。 ![TestNG Tutorial: Install, Annotations, Framework, Examples in SELENIUM](https://img.kancloud.cn/4d/5c/4d5c63004559327ade76fcb8aeede164_322x318.png) **步驟 5:**單擊完成。 ![TestNG Tutorial: Install, Annotations, Framework, Examples in SELENIUM](https://img.kancloud.cn/d8/c5/d8c5db5e64d81915630ffc61247a94bf_458x244.png) 您應該注意到 TestNG 包含在“庫”列表中。 ![TestNG Tutorial: Install, Annotations, Framework, Examples in SELENIUM](https://img.kancloud.cn/8d/fc/8dfc5b2909b93fe3520a4281a43d45cb_251x141.png) **步驟 6:**現在,我們將添加包含 Selenium API 的 JAR 文件。 在上一章中安裝 Selenium 和 Eclipse 時,可以從 [http://docs.seleniumhq.org/download/](https://www.selenium.dev/downloads/) 下載的 Java 客戶端驅動程序中找到這些文件。 ![TestNG Tutorial: Install, Annotations, Framework, Examples in SELENIUM](https://img.kancloud.cn/72/71/7271c99bf398e6c4684c0548bb690534_497x138.png) 然后,導航到放置 Selenium JAR 文件的位置。 ![TestNG Tutorial: Install, Annotations, Framework, Examples in SELENIUM](https://img.kancloud.cn/4f/57/4f573c1333218e03ee3490afbff4a30d_411x329.png) 添加外部 JAR 之后,您的屏幕應如下所示。 ![TestNG Tutorial: Install, Annotations, Framework, Examples in SELENIUM](https://img.kancloud.cn/9b/4b/9b4baf87dfd596871831453921fa64f1_336x373.png) **步驟 7:**單擊“完成”,并驗證我們的 FirstTestNGProject 在 Eclipse 的 Package Explorer 窗口中可見。 ![TestNG Tutorial: Install, Annotations, Framework, Examples in SELENIUM](https://img.kancloud.cn/5e/a8/5ea8c37e3df5d6a95c1f5acdc04f806b_262x172.png) ## 創建一個新的 TestNG 測試文件 現在我們已經完成了設置項目的工作,讓我們創建一個新的 TestNG 文件。 **步驟 1:**右鍵單擊“ src”軟件包文件夾,然后選擇“新建”。>其他… ![TestNG Tutorial: Install, Annotations, Framework, Examples in SELENIUM](https://img.kancloud.cn/d1/ac/d1ac10888bbbd1af3510d01ab06cab56_488x187.png) **步驟 2:**單擊 TestNG 文件夾,然后選擇“ TestNG 類”選項。 點擊下一步。 ![TestNG Tutorial: Install, Annotations, Framework, Examples in SELENIUM](https://img.kancloud.cn/cd/52/cd524e56d696221b32b1cce200456cb9_263x373.png) **步驟 3:**在相應的輸入框中鍵入以下指示的值,然后單擊“完成”。 請注意,我們已將 Java 文件命名為“ FirstTestNGFile”。 ![TestNG Tutorial: Install, Annotations, Framework, Examples in SELENIUM](https://img.kancloud.cn/ae/f9/aef949de57f79f60ca0a0a07c9b988da_560x319.png) Eclipse 應該自動為我們的 TestNG 文件創建模板,如下所示。 ![TestNG Tutorial: Install, Annotations, Framework, Examples in SELENIUM](https://img.kancloud.cn/78/76/7876bcc1a66e6f2b38ec9744507956fb_300x203.png) ### 編碼我們的第一個測試用例 現在讓我們創建第一個[測試用例](/test-case.html),該用例將檢查 Mercury Tours 的主頁是否正確。 如下所示鍵入您的代碼。 ``` package firsttestngpackage; import org.openqa.selenium.*; import org.openqa.selenium.firefox.FirefoxDriver; import org.testng.Assert; import org.testng.annotations.*; public class firsttestngfile { public String baseUrl = "http://demo.guru99.com/test/newtours/"; String driverPath = "C:\\geckodriver.exe"; public WebDriver driver ; @Test public void verifyHomepageTitle() { System.out.println("launching firefox browser"); System.setProperty("webdriver.gecko.driver", driverPath); driver = new FirefoxDriver(); driver.get(baseUrl); String expectedTitle = "Welcome: Mercury Tours"; String actualTitle = driver.getTitle(); Assert.assertEquals(actualTitle, expectedTitle); driver.close(); } } ``` 請注意以下內容。 * TestNG 不需要您具有 main()方法。 * 方法不必是靜態的。 * 我們使用了@Test 批注。 **@Test 用于告訴它所使用的方法是一個測試案例**。 在這種情況下,我們將 verifyHomepageTitle()方法設置為測試用例,因此我們在其上方放置了一個'@Test'注釋。 * 由于我們在 TestNG 中使用注釋,因此需要導入包 org.testng.annotations。*。 * 我們使用了 Assert 類。 **Assert 類用于在 TestNG** 中進行驗證操作。 要使用它,我們需要導入 org.testng.Assert 包。 一個 TestNG 文件中可能有多個測試用例(因此,有多個@Test 批注)。 稍后將在“ TestNG 中使用的批注”部分中對此進行詳細處理。 ### 運行測試 要運行測試,只需像往常一樣在 Eclipse 中運行文件即可。 Eclipse 將提供兩個輸出-一個在“控制臺”窗口中,另一個在“ TestNG 結果”窗口中。 ![TestNG Tutorial: Install, Annotations, Framework, Examples in SELENIUM](https://img.kancloud.cn/c6/46/c6460e873a88b7db75b2d6944185a9ad_466x317.png) ![TestNG Tutorial: Install, Annotations, Framework, Examples in SELENIUM](https://img.kancloud.cn/fe/cd/fecd1b72610ee8956d90c114e462ba14_466x292.png) ## 檢查 TestNG 創建的報告 Eclipse 中的“控制臺”窗口提供了測試案例結果的基于文本的報告,而“ TestNG 結果”窗口則為我們提供了圖形化報告。 ![TestNG Tutorial: Install, Annotations, Framework, Examples in SELENIUM](https://img.kancloud.cn/da/aa/daaa07486ad8eb1f412a93b5548cb8d6_578x543.png) ### 生成 HTML 報告 TestNG 能夠生成 HTML 格式的報告。 **步驟 1:**運行上一節中創建的 FirstTestNGFile 后,在“項目資源管理器”窗口中右鍵單擊項目名稱(FirstTestNGProject),然后單擊“刷新”選項。 ![TestNG Tutorial: Install, Annotations, Framework, Examples in SELENIUM](https://img.kancloud.cn/ae/de/aedefaee791e33fb48332f7b5546a000_512x230.png) **步驟 2:**請注意,已創建“測試輸出”文件夾。 展開并查找 index.html 文件。 該 HTML 文件是最新測試運行結果的報告。 ![TestNG Tutorial: Install, Annotations, Framework, Examples in SELENIUM](https://img.kancloud.cn/a6/9c/a69cc34327608279a5e0b7ac27b65ef2_232x386.png) **步驟 3:**雙擊該 index.html 文件以在 Eclipse 的內置 Web 瀏覽器中將其打開。 就像在普通的 Web 瀏覽器中一樣,只需重新按一下 F5,就可以在重新運行測試后隨時刷新此頁面。 ![TestNG Tutorial: Install, Annotations, Framework, Examples in SELENIUM](https://img.kancloud.cn/7a/0d/7a0d0feeecdfcd3ca52b6a3f83cdba55_415x370.png) ## [NGG0] TestNG 中使用的注釋 在上一節中,向您介紹了@Test 批注。 現在,我們將研究更高級的注釋及其用法。 ### 多個測試案例 我們可以在一個 TestNG 文件中使用多個@Test 批注。 默認情況下,@ Test 注釋的方法按字母順序執行。 請參見下面的代碼。 盡管方法 c_test,a_test 和 b_test 不在代碼中按字母順序排列,但它們將照此執行。 ![TestNG Tutorial: Install, Annotations, Framework, Examples in SELENIUM](https://img.kancloud.cn/9d/8f/9d8f044d99f6f2019d1f2cb05c3f9c6c_391x265.png) 運行此代碼,然后在生成的 index.html 頁面上,單擊“按時間順序排列的視圖”。 ![TestNG Tutorial: Install, Annotations, Framework, Examples in SELENIUM](https://img.kancloud.cn/9e/76/9e768e7f976beaae7ee4aeac343ed048_435x399.png) ### 參數 如果希望方法以不同的順序執行,請使用參數“ priority”。 **參數是可修改注釋功能**的關鍵字。 * 參數要求您為其分配一個值。 通過在它們旁邊放置一個“ =”,然后在其后跟數值,可以做到這一點。 * 參數用一對括號括起來,它們放在注釋的后面,如下面的代碼片段所示。 ![TestNG Tutorial: Install, Annotations, Framework, Examples in SELENIUM](https://img.kancloud.cn/8c/50/8c50da04c5ef8676fb9fdce2c243f3b7_197x102.png) TestNG 將以最低優先級值到最高優先級執行@Test 批注。 您的優先級值不必是連續的。 ![TestNG Tutorial: Install, Annotations, Framework, Examples in SELENIUM](https://img.kancloud.cn/06/c3/06c3f8681546a7364d2cdaa595087d5c_507x261.png) TestNG HTML 報告將確認方法是根據優先級的升序執行的。 ![TestNG Tutorial: Install, Annotations, Framework, Examples in SELENIUM](https://img.kancloud.cn/fc/66/fc6669c6798ea95a204ffa87804803d9_337x128.png) ### 多個參數 除了“優先級”外,@ Test 還有一個名為“ alwaysRun”的參數,只能將其設置為“ true”或“ false”。 **要在單個注釋中使用兩個或多個參數,請用逗號**將其分開,如下所示。 ``` @Test(priority = 0, alwaysRun = true) ``` ![TestNG Tutorial: Install, Annotations, Framework, Examples in SELENIUM](https://img.kancloud.cn/97/48/9748d78f9f6b90b9209d28a5424febb9_362x267.png) @BeforeTest 和@AfterTest | **@BeforeTest** | 在 TestNG 文件中的第一個測試用例之前,將在**之前執行此注釋下的方法。** | | **@AfterTest** | 在 TestNG 文件中的所有測試用例都執行完之后,將執行此注釋下的方法**。** | 考慮下面的代碼。 ``` package firsttestngpackage; import org.openqa.selenium.*; import org.openqa.selenium.firefox.FirefoxDriver; import org.testng.Assert; import org.testng.annotations.*; public class firsttestngfile { public String baseUrl = "http://demo.guru99.com/test/newtours/"; String driverPath = "C:\\geckodriver.exe"; public WebDriver driver ; @BeforeTest public void launchBrowser() { System.out.println("launching firefox browser"); System.setProperty("webdriver.gecko.driver", driverPath); driver = new FirefoxDriver(); driver.get(baseUrl); } @Test public void verifyHomepageTitle() { String expectedTitle = "Welcome: Mercury Tours"; String actualTitle = driver.getTitle(); Assert.assertEquals(actualTitle, expectedTitle); } @AfterTest public void terminateBrowser(){ driver.close(); } } ``` 應用表和上面的代碼提供的邏輯,我們可以預測執行方法的順序為: * 1 <sup>st</sup> -launchBrowser() * 2 <sup>和</sup>-verifyHomepageTitle() * 3 <sup>rd</sup> -TerminateBrowser() **注釋塊的放置可以互換,而不會影響它們執行的時間順序**。 例如,嘗試重新排列注釋塊,以使您的代碼與以下代碼相似。 ``` package firsttestngpackage; import org.openqa.selenium.*; import org.openqa.selenium.firefox.FirefoxDriver; import org.testng.Assert; import org.testng.annotations.*; public class firsttestngfile { public String baseUrl = "http://demo.guru99.com/test/newtours/"; String driverPath = "C:\\geckodriver.exe"; public WebDriver driver ; @AfterTest //Jumbled public void terminateBrowser(){ driver.close(); } @BeforeTest //Jumbled public void launchBrowser() { System.out.println("launching firefox browser"); System.setProperty("webdriver.gecko.driver", driverPath); driver = new FirefoxDriver(); driver.get(baseUrl); } @Test //Jumbled public void verifyHomepageTitle() { String expectedTitle = "Welcome: Mercury Tours"; String actualTitle = driver.getTitle(); Assert.assertEquals(actualTitle, expectedTitle); } } ``` 運行上面的代碼,請注意 ![TestNG Tutorial: Install, Annotations, Framework, Examples in SELENIUM](https://img.kancloud.cn/34/0c/340cd1ef83d3f887f5b0cc4c34279380_337x121.png) @BeforeMethod 和@AfterMethod | **@BeforeMethod** | 在每個測試用例中,將在此方法之前執行**。** | | **@AfterMethod** | 在每個測試用例中,在每個方法之后將執行此注釋下的方法**。** | 在 Mercury Tours 中,假設我們想驗證下面兩個鏈接的目標頁面的標題。 ![TestNG Tutorial: Install, Annotations, Framework, Examples in SELENIUM](https://img.kancloud.cn/81/2e/812eadae9f87801c18697a26261ae71e_321x79.png) 我們的測試流程為: * 轉到主頁并驗證其標題。 * 單擊注冊并驗證其目標頁面的標題。 * 返回首頁并確認其標題是否正確。 * 單擊支持,并驗證其目標頁面的標題。 * 返回首頁并確認其標題是否正確。 下面的代碼說明了如何使用@BeforeMethod 和@AfterMethod 有效執行上述方案。 ``` package firsttestngpackage; import org.openqa.selenium.*; import org.openqa.selenium.firefox.FirefoxDriver; import org.testng.Assert; import org.testng.annotations.*; @Test public class firsttestngfile { public String baseUrl = "http://demo.guru99.com/test/newtours/"; String driverPath = "C:\\geckodriver.exe"; public WebDriver driver; public String expected = null; public String actual = null; @BeforeTest public void launchBrowser() { System.out.println("launching firefox browser"); System.setProperty("webdriver.gecko.driver", driverPath); driver= new FirefoxDriver(); driver.get(baseUrl); } @BeforeMethod public void verifyHomepageTitle() { String expectedTitle = "Welcome: Mercury Tours"; String actualTitle = driver.getTitle(); Assert.assertEquals(actualTitle, expectedTitle); } @Test(priority = 0) public void register(){ driver.findElement(By.linkText("REGISTER")).click() ; expected = "Register: Mercury Tours"; actual = driver.getTitle(); Assert.assertEquals(actual, expected); } @Test(priority = 1) public void support() { driver.findElement(By.linkText("SUPPORT")).click() ; expected = "Under Construction: Mercury Tours"; actual = driver.getTitle(); Assert.assertEquals(actual, expected); } @AfterMethod public void goBackToHomepage ( ) { driver.findElement(By.linkText("Home")).click() ; } @AfterTest public void terminateBrowser(){ driver.close(); } } ``` 執行此測試后,您的 TestNG 應報告以下順序。 ![TestNG Tutorial: Install, Annotations, Framework, Examples in SELENIUM](https://img.kancloud.cn/dc/5f/dc5f4f13e7add76ad3994e15663234b4_534x191.png) 簡而言之,@BeforeMethod 應該包含在每個測試用例之前需要在之前運行**的方法,而@AfterMethod 應該包含在每個測試用例之后**之后需要運行**的方法。** ## TestNG 注釋的摘要 **@BeforeSuite** :帶注釋的方法將在該套件中的所有測試運行之前運行。 **@AfterSuite** :帶注釋的方法將在該套件中的所有測試運行后運行。 **@BeforeTest** :帶注釋的方法將在運行屬于標記內部類的任何測試方法之前運行。 **@AfterTest** :注釋方法將在標簽內部所有屬于類的測試方法運行后運行。 **@BeforeGroups** :此配置方法將在其之前運行的組的列表。 保證此方法可以在調用屬于這些組中的任何一個的第一個測試方法之前不久運行。 **@AfterGroups** :此配置方法將在其后運行的組的列表。 保證在調用屬于這些組中任何一個的最后一個測試方法后不久便可以運行該方法。 **@BeforeClass** :帶注釋的方法將在調用當前類中的第一個測試方法之前運行。 **@AfterClass** :帶注釋的方法將在當前類中的所有測試方法運行后運行。 **@BeforeMethod** :帶注釋的方法將在每種測試方法之前運行。 **@AfterMethod** :帶注釋的方法將在每種測試方法之后運行。 **@Test** :帶注釋的方法是測試用例的一部分 ### 結論 * TestNG 是一個測試框架,能夠使 Selenium 測試更容易理解,并能夠生成易于理解的報告。 * 與 JUnit 相比,TestNG 的主要優點如下。 * 注釋更易于使用和理解。 * 測試用例可以更容易地分組。 * TestNG 允許我們創建并行測試。 * Eclipse 中的 Console 窗口生成基于文本的結果,而 TestNG 窗口更有用,因為它為我們提供了測試結果的圖形輸出以及其他有意義的細節,例如: * 每種方法的運行時。 * 執行方法的時間順序 * TestNG 能夠生成基于 HTML 的報告。 * 注釋可以像通常的 Java 方法一樣使用參數。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看