亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Selenium 2 入門

系統(tǒng) 2322 0

在多個瀏覽器中進(jìn)行 Web 應(yīng)用程序的端到端功能測試

Selenium 是一款有名的 Web 應(yīng)用程序測試框架,用于進(jìn)行功能測試。新版本 Selenium 2 結(jié)合了 Selenium 1 和 WebDriver(Selenium 的并行項(xiàng)目)中的最佳特性。在本文中,我們將介紹如何輕松地從 Selenium 1 過渡到 Selenium 2,并用一些示例介紹如何使用 Selenium 2,如何進(jìn)行遠(yuǎn)程測試,以及如何將書面測試從 Selenium 1 遷移到 Selenium 2 中。

簡介

Selenium 是用于測試 Web 應(yīng)用程序用戶界面 (UI) 的常用框架。它是一款用于運(yùn)行端到端功能測試的超強(qiáng)工具。您可以使用多個編程語言編寫測試,并且 Selenium 能夠在一個或多個瀏覽器中執(zhí)行這些測試。

Selenium(以下簡稱為 Selenium 1)并不是能夠在瀏覽器中自動化功能測試的惟一工具。由 Simon Stewart(來自 Google)創(chuàng)建的 WebDriver 是一個具有類似目標(biāo)的項(xiàng)目。要控制瀏覽器,需要依賴采用本機(jī)支持的獨(dú)立客戶端。WebDriver 僅提供 Java 綁定,并不能支持 Selenium 1 所能支持的那么多瀏覽器。

Selenium 1 + WebDriver = Selenium 2

Selenium 1 和 WebDriver 合并成一款性能更佳的產(chǎn)品 Selenium 2(或 Selenium WebDriver),該款產(chǎn)品發(fā)行于 2011 年。Selenium 2 具有來自 WebDriver 的清晰面向?qū)ο?API,并能以最佳的方式與瀏覽器進(jìn)行交互。Selenium 2 不使用 JavaScript 沙盒,它支持多種瀏覽器和多語言綁定。在撰寫本文時,Selenium 2 為下列程序提供驅(qū)動程序:

  • Mozilla Firefox
  • Google Chrome
  • Microsoft Internet Explorer
  • Opera
  • Apple iPhone
  • Android browsers

借助 Selenium 2,您可使用 Java、C#、Ruby、和 Python 編寫測試。Selenium 2 還提供基于 HtmlUnit 的無外設(shè)驅(qū)動,是用于測試 Web 應(yīng)用程序的 Java 框架。HtmlUnit 運(yùn)行速度特別快,但它不是一個真正與真實(shí)瀏覽器相關(guān)聯(lián)的驅(qū)動。

目前,Selenium 2 仍處于開發(fā)階段,還有些細(xì)節(jié)問題正在處理。當(dāng)前版本為 2.9。針對 Safari 和 Blackberry 的驅(qū)動將會在近期集成到產(chǎn)品中。

在本文當(dāng)中,我們將學(xué)習(xí)如何利用 Selenium 2 來測試 Web 應(yīng)用程序。示例展示了如何遠(yuǎn)程實(shí)現(xiàn)測試。我們還將學(xué)習(xí)如何將編寫好的測試從 Selenium 1 轉(zhuǎn)移到 Selenium 2 中。

下載 本文中所使用的源代碼。

?

Selenium 2 入門

在本節(jié),我們將學(xué)習(xí)如何將 Selenium 2 框架用于 Web 應(yīng)用程序的一個相對簡單的測試中。開發(fā)環(huán)境采用 Java 語言。您還需要包括 Java 綁定的 selenium-java-<version>.jar(參閱? 參考資料 并下載)。在一個 Maven 項(xiàng)目中,您只需要在 pom.xml 中包含正確的依賴性,如 清單 1所示。

清單 1. Selenium-java 依賴性
                   <dependency> 

    <groupId>org.seleniumhq.selenium</groupId> 

    <artifactId>selenium-java</artifactId> 

    <version>2.9.0</version> 

 </dependency>
                

現(xiàn)在,可以開始編寫測試。WebDriver API 中的主要組件是? WebDriver 接口。這一公共接口在每個有效瀏覽器中都能實(shí)現(xiàn)。例如,類 FirefoxDriver 將用于控制 Mozilla Firefox。 清單 2 展示了如何在測試當(dāng)中實(shí)例化一個特定的實(shí)現(xiàn)。您可以采用最符合您需求的測試框架,比如 JUnit 或者 TestNG。

清單 2. 實(shí)例化的? FirefoxDriver
                   public class Selenium2Example1Test { 

    @Test 

    public void test() { 

        // Instantiate a webDriver implementation 

        WebDriver webdriver = new FirefoxDriver(); 

    } 

 }
                

要加載頁面進(jìn)行測試,可利用? get() 方法。在? 清單 3 中,GitHub 主 (https://github.com) 被加載到先前創(chuàng)建的 Firefox 實(shí)例中。

清單 3. 在測試下加載頁面
                   WebDriver webdriver = new FirefoxDriver(); 

 webdriver.get(https://github.com);
                

您可在剛加載的頁面上添加斷言。假如您想要測試頁面標(biāo)題是否等于? "GitHub - Social Coding" ,如下? 清單 4 所示。WebDriver 提供 getTitle() 方法;您可利用所選的測試框架來生成斷言。

清單 4. 頁面標(biāo)題的斷言
                   Assert.assertEquals("GitHub - Social Coding", webdriver.getTitle());
                

完成測試以后,最好利用? quit() 方法來終止 WebDriver 實(shí)例,如下 清單 5所示。

清單 5. 終止 WebDriver 實(shí)例
                   webdriver.quit();
                

FirefoxDriver 只是有效的 WebDriver 實(shí)現(xiàn)之一。您可以利用 ChromeDrive 在 Chrome 內(nèi)部運(yùn)行測試,來執(zhí)行相同的測試。 清單 6 展示了利用 ChromeDriver 的完整示例。

清單 6. ChromeDriver 樣例
                   public class Selenium2Example2Test { 

    @Test 

    public void test() { 

        System.setProperty("webdriver.chrome.driver", 

"src/main/resources/drivers/chrome/chromedriver-mac"); 



        // Instantiate a webDriver implementation 

        WebDriver webdriver = new ChromeDriver(); 



        webdriver.get(https://github.com); 



        Assert.assertEquals("GitHub - Social Coding", webdriver.getTitle()); 

    } 

 }
                

在實(shí)例化 ChromeDriver 之前,需要正確設(shè)置? "webdriver.chrome.driver" 系統(tǒng)屬性。該屬性指出您操作系統(tǒng)的 ChromeDriver 文件位置(參閱? 參考資料 并下載)。 清單 6 中的示例使用了針對 Mac 的版本;同樣可用針對 Windows 和 Linux 的版本。

要在 Internet Explorer 中執(zhí)行相同的測試,需要用到? InterentExplorerDriver 類的實(shí)例,如 清單 7所示。

清單 7.? InternetExplorerDriver 實(shí)例化
                   WebDriver webdriver = new InternetExplorerDriver();
                

當(dāng)采用? InterenetExplorerDriver 時,可能會遇到一個安全問題提示:"Protected Mode must be set to the same value (enabled or disabled) for all zones"。想要解決這一問題,需要設(shè)置特定的功能,如 清單 8所示。

清單 8. 為 Internet Explorer 設(shè)置安全性功能
                   DesiredCapabilities capability=DesiredCapabilities.internetExplorer(); 

 capability.setCapability( 

              InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_ 

 IGNORING_SECURITY_DOMAINS, true); 

 WebDriver webdriver = new InternetExplorerDriver(capability);
                

要在 Opera 中執(zhí)行測試,需要實(shí)例化? OperaDriver 類,這是由 Opera 直接開發(fā)的。記得要將包含驅(qū)動的 JAR 包括到項(xiàng)目中。如果您使用 Maven,則僅需增加 清單 9中的依賴性。

清單 9.? OperaDriver 依賴性
                   <dependency> 

    <groupId>com.opera</groupId> 

    <artifactId>operadriver</artifactId> 

    <version>0.7.3</version> 

 </dependency>
                

需要額外配置以實(shí)現(xiàn)在 iPhone 或者 Android 瀏覽器模擬器中運(yùn)行測試。

?

使用 Selenium 2 進(jìn)行測試

使用 Selenium 2 可以構(gòu)建比前節(jié)內(nèi)容更加復(fù)雜的測試。在本節(jié)中,您將測試到,GitHub 主頁的頂部導(dǎo)航共有 5 個列表項(xiàng):Signup and Pricing、Explore GitHub、Features、Blog 以及 Login。圖 1展示了 Github 主頁。

圖 1. Github 主頁
Github 主頁

查看頂部導(dǎo)航的 HTML 代碼,如 清單 10所示。

清單 10. 頂部導(dǎo)航的 HTML 代碼
                   <html> 

 <head> 

    ... 

    </head> 

    <body class="logged_out env-production"> 

        <div id="main"> 

            <div id="header" class="true"> 

 ... 

                <div class="topsearch"> 

                        <ul class="nav logged_out"> 

                            <li class="pricing"> 

 <a >Signup and Pricing</a> 

 </li> 

                            <li class="explore"> 

 <a >Explore GitHub</a> 

 </li> 

                          <li class="features"> 

 <a >Features</a> 

 </li> 

                            <li class="blog"> 

 <a >Blog</a> 

 </li> 

                          <li class="login"> 

 <a >Login</a> 

 </li> 

                        </ul> 

 </div> 

 ... 

            </div> 

            ... 

        </div> 

       ... 

    </body> 

 </html>
                

可利用 WebDriver API(從 HTML 代碼內(nèi)部)檢索您需要測試的元素。 findElement() 和? findElements() 方法會返回公共接口 WebElement 的一個實(shí)例或者一組實(shí)例。 WebElement 可以以一種清晰的、面向?qū)ο蟮姆绞綉?yīng)用于頁面中的所有元素。在 API 中可以使用許多不同的策略來定位 UI 元素。這些策略由傳遞至? findElement() 和? findElements() 方法的不同類型參數(shù)所代表。 清單 11 展示了應(yīng)用抽象類 By 的各個方法來實(shí)現(xiàn)不同策略的示例。

清單 11. 使用? findElement() 方法
                   WebElement element1 = webdriver.findElement(By.id("header")); 

 WebElement element2 = webdriver.findElement(By.name("name")); 

 WebElement element3 = webdriver.findElement(By.tagName("a")); 

 WebElement element4 = webdriver.findElement(By.xpath("http://a[@title='logo']")); 

 WebElement element5 = webdriver.findElement(By.cssSelector(".feautures")); 

 WebElement element6 = webdriver.findElement(By.linkText("Blog")); 

 WebElement element7 = webdriver.findElement(By.partialLinkText("Ruby")); 

 WebElement element8 = webdriver.findElement(By.className("login"));
                

使用? 清單 11 中的一個策略,就可以開始編寫測試來檢索第一個元素: UL 標(biāo)記中? LI 標(biāo)記帶有? nav 類。清單 12使用了 Xpath ( By.xpath() )。

清單 12. Xpath
                   List<WebElement> webElements = webdriver.findElements(By 

            .xpath("http://ul[@class='nav logged_out']/li"));
                

清單 13使用 CSS 選擇器 ( By.cssSelector() ) 來檢索? LI 標(biāo)記。

清單 13. CSS 選擇器
                   List<WebElement> webElements = webdriver.findElements(By 

            .cssSelector("ul.nav li"));
                

此時,可在所檢索的項(xiàng)數(shù)量上生成斷言,如 清單 14所示。

清單 14. 項(xiàng)數(shù)量上的斷言
                   Assert.assertEquals(5, webElements.size());
                

前面的步驟驗(yàn)證了? LI 標(biāo)記數(shù)量等于 5。

下一步是檢索每個? LI 標(biāo)記中的每個錨點(diǎn)( A 標(biāo)記)。? 清單 15 展示了如何在第一個? LI 中獲取錨點(diǎn)。此用例使用了 tagName ( By.tagName() ) 策略。

清單 15. 檢索第一個? LI 標(biāo)記 中的? A 錨點(diǎn)
                   WebElement anchor1 = webElements.get(0).findElement(By.tagName("a"));
                

您可以使用類似的方法收集到所有的 5 個錨點(diǎn),如 清單 16所示。

清單 16. 檢索? LI 標(biāo)記中的所有錨點(diǎn)
                   WebElement anchor1 = webElements.get(0).findElement(By.tagName("a")); 

 WebElement anchor2 = webElements.get(1).findElement(By.tagName("a")); 

 WebElement anchor3 = webElements.get(2).findElement(By.tagName("a")); 

 WebElement anchor4 = webElements.get(3).findElement(By.tagName("a")); 

 WebElement anchor5 = webElements.get(4).findElement(By.tagName("a"));
                

在這一階段,您可以驗(yàn)證,錨點(diǎn)內(nèi)的文本是否與所期望的字符串一致。要檢索標(biāo)記內(nèi)的文本,WebDriver 提供了? getText() 方法。清單 17展示了完整的測試方法,以及測試底部的斷言。

清單 17. 完成測試
                   @Test 

 public void test() { 

 WebDriver webdriver = new FirefoxDriver();    

 webdriver.get("https://github.com"); 

 List<WebElement> webElements = webdriver.findElements(By 

                .xpath("http://ul[@class='nav logged_out']/li")); 

 Assert.assertEquals(5, webElements.size()); 



    // Retrieve the anchors 

    WebElement anchor1 = webElements.get(0).findElement(By.tagName("a")); 

    WebElement anchor2 = webElements.get(1).findElement(By.tagName("a")); 

    WebElement anchor3 = webElements.get(2).findElement(By.tagName("a")); 

    WebElement anchor4 = webElements.get(3).findElement(By.tagName("a")); 

    WebElement anchor5 = webElements.get(4).findElement(By.tagName("a")); 

    

 // Assertions    

    Assert.assertEquals("Signup and Pricing", anchor1.getText()); 

    Assert.assertEquals("Explore GitHub", anchor2.getText()); 

    Assert.assertEquals("Features", anchor3.getText()); 

    Assert.assertEquals("Blog", anchor4.getText()); 

    Assert.assertEquals("Login", anchor5.getText()); 

        

    webdriver.quit(); 



 }
                

啟動這一測試后,將會打開一個新的 Firefox 窗口,該窗口將會保持開啟,直到執(zhí)行完所有的斷言。

?

使用 Selenium Grid 2 進(jìn)行遠(yuǎn)程測試

可在 Selenium 2 中進(jìn)行本地或遠(yuǎn)程測試。要實(shí)現(xiàn)遠(yuǎn)程運(yùn)行,該測試需要使用名為? RemoteWebDriver 的? WebDriver 接口的特定實(shí)現(xiàn)。您可以指定瀏覽器采用? DesiredCapabilities 類運(yùn)行。清單 18顯示了相關(guān)示例。

清單 18.? RemoteWebDriver 和? DesiredCapabilities
                   DesiredCapabilities capabilities = new DesiredCapabilities(); 

 capabilities.setBrowserName("firefox"); 

 capabilities.setVersion("7"); 

 capabilities.setPlatform("MAC"); 

 WebDriver webdriver = new RemoteWebDriver(capabilities);
                

借助? DesiredCapabilities 類,您可以指定瀏覽器的名稱、平臺和瀏覽器版本。您還可指定瀏覽器支持的其他功能。

如果想要遠(yuǎn)程執(zhí)行結(jié)構(gòu)化測試,并運(yùn)行多個瀏覽器(并且可能是不同的虛擬機(jī)),Selenium Grid 提供了很好的解決方案。

Selenium Grid 2 提供了基礎(chǔ)設(shè)施,其中每個節(jié)點(diǎn)代表了不同瀏覽器將自身注冊到 hub 當(dāng)中。單數(shù)的測試將會調(diào)用一個 hub,它負(fù)責(zé)將每個請求分配到正確的瀏覽器。Hub 和節(jié)點(diǎn)可以運(yùn)行在不同的虛擬機(jī)當(dāng)中。

要實(shí)現(xiàn)遠(yuǎn)程測試,則需要在您將要使用的每臺機(jī)器上下載 selenium-server-standalone-<version>.jar。要在機(jī)器上安裝 hub,轉(zhuǎn)到您下載 JAR 所在的文件夾,并運(yùn)行 清單 19中的命令。

清單 19. 啟動 hub
                   java -jar selenium-server-standalone-2.9.0.jar ?role hub
                

您可在 http://localhost:4444/grid/console 訪問 Grid 2 控制臺,其中會列出所有可用的節(jié)點(diǎn)。要注冊一個節(jié)點(diǎn),僅需運(yùn)行一個命令,如 清單 20所示。

清單 20. 在 hub 中注冊的節(jié)點(diǎn)
                   java -jar selenium-server-standalone-2.9.0.jar 

 -role webdriver ?hub http://localhost:4444/grid/register -port 5556
                

在默認(rèn)情況下,清單 20中的命令注冊了 7 個瀏覽器:5 個 Firefox 實(shí)例、1 個 Chrome 實(shí)例以及一個 Internet Explorer 實(shí)例。您可以在特定的端口上定位一個特定瀏覽器,如 清單 21所示。

清單 21. 在 hub 上注冊的 Firefox 7 實(shí)例
                   java -jar selenium-server-standalone-2.9.0.jar -role webdriver 

 -hub http://localhost:4444/grid/register -port 5556 -browser 

 browserName=chrome,version=14,platform=MAC
                

注冊完一些瀏覽器之后,Selenium Grid 2 控制臺會變成如 圖 2顯示的樣子。

圖 2. Selenium Grid 2 控制臺視圖
Grid 2 控制臺視圖樣例

要使用網(wǎng)格,則需要在測試用例中指定 hub 的 URL 和所要控制的瀏覽器。 清單 22 展示了? RemoteWebDriver 類構(gòu)造函數(shù)接受了 hub 的 URL 以及定義特定瀏覽器的? DesiredCapabilities 實(shí)例。

清單 22.? RemoteWebDriver 實(shí)例化
                   DesiredCapabilities capability = new DesiredCapabilities(); 

 capability.setBrowserName("chrome"); 

 capability.setVersion("14"); 

 capability.setPlatform(Platform.MAC); 

 WebDriver webdriver = new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"), 

 capability);
                

在本用例中,hub 將會啟動與 Chrome 版本 14(之前已在? 清單 21 中注冊的)相關(guān)聯(lián)的節(jié)點(diǎn)。

Selenium Grid 2 還向后兼容 Selenium 1。您可以在 hub 中注冊 Selenium 1 RC 節(jié)點(diǎn)(這是 hub 中 Selenium 1 基礎(chǔ)設(shè)施的一部分),如 清單 23所示。

清單 23. Selenium 1 RC 節(jié)點(diǎn)注冊
                   java ?jar selenium-server-standalone-2.9.0.jar 

 -role rc ?hub http://localhost:4444/grid/register -port 5557
                
?

將測試從 Selenium 1 遷移到 Selenium 2

如果需要將編寫好的測試從 Selenium 1 轉(zhuǎn)移到 Selenium 2,那么這種轉(zhuǎn)移會相當(dāng)平滑。Selenium 1 API 保留在新的 API 中,使得 Selenium 2 能夠完全向后兼容。

將測試從 Selenium 1 轉(zhuǎn)移到 Selenium 2 非常簡單,這要?dú)w功于? WebDriverBackedSelenium 類。它將一個? WebDriver 的實(shí)例和 URL 作為測試的參數(shù),并且返回一個 Selenium 實(shí)例。清單 24展示了與? 清單 16 相同示例,但是使用集成到 Selenium 2 中的 Selenium 1 API。

清單 24. 將 Selenium 1 集成到 Selenium 2
                   @Test 

 public void test() { 

    String url = "https://github.com"; 

 WebDriver webdriver = new FirefoxDriver(); 

 webdriver.get(url); 

 Selenium selenium = new WebDriverBackedSelenium(webdriver, url); 

    selenium.open(url); 

        

 // Get the number of LIs 

    Number lis = selenium.getXpathCount("http://ul[@class='nav logged_out']/li"); 



    Assert.assertEquals(5, lis.intValue()); 



    // Retrieve the text inside the anchors 

    String anchor1Text = selenium.getText("http://ul[@class='nav logged_out']/li[1]/a"); 

    String anchor2Text = selenium.getText("http://ul[@class='nav logged_out']/li[2]/a"); 

    String anchor3Text = selenium.getText("http://ul[@class='nav logged_out']/li[3]/a"); 

    String anchor4Text = selenium.getText("http://ul[@class='nav logged_out']/li[4]/a"); 

    String anchor5Text = selenium.getText("http://ul[@class='nav logged_out']/li[5]/a"); 

        

    Assert.assertEquals("Signup and Pricing", anchor1Text); 

    Assert.assertEquals("Explore GitHub", anchor2Text); 

    Assert.assertEquals("Features", anchor3Text); 

    Assert.assertEquals("Blog", anchor4Text); 

    Assert.assertEquals("Login", anchor5Text); 

        

    webdriver.quit(); 

 }
                

Selenium 2 更加關(guān)注開發(fā)者。它具有比 Selenium 1 更清晰的 API,正如? getText() 和? getXpathCount() 方法簽名所證明的一樣。Selenium 2 API 還具有更好的面向?qū)ο蟮奶攸c(diǎn)。例如,不允許您處理 UI 元素對象,僅允許處理字符串。

?

結(jié)束語

Selenium 2 標(biāo)志著瀏覽器內(nèi)部自動測試的一個演變過程。它繼承了 Selenium 1 與 WebDriver 最優(yōu)秀的部分,并提供了與多個瀏覽器的緊密集成。新的 API 更符合開發(fā)人員的要求,提供了面向?qū)ο蟮姆椒ǎ⑻峁┝瞬煌哪P陀糜诰帉憸y試。此外,Selenium 2 還:

  • 克服與相同原始策略相關(guān)聯(lián)的限制。
  • 為彈出窗口提供更好的支持。
  • 有效控制本機(jī)的鍵盤與鼠標(biāo)的交互。

Selenium Grid 的新版本(包括在 Selenium 2 中)使得遠(yuǎn)程加載測試更加方便。Selenium 2 能夠向后兼容 Selenium 1,因此升級到新版本輕而易舉。Selenium 2 能夠幫助確保應(yīng)用程序按需工作。

Selenium 2 入門


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 91视频最新网址 | 久久se精品一区二区国产 | 精品久久网 | 欧美人与性动交α欧美精品图片 | 妞干网中文字幕 | 欧美国产一区二区三区 | 女人18一级毛片免费观看 | 一本到视频在线观看 | 色视频在线看 | 热e国产 | 欧美成人性视频在线黑白配 | 欧美 日韩 成人 | 久久精品亚洲精品一区 | 久久99精品国产自在现线小黄鸭 | 日韩精品中文字幕一区三区 | 久久国产乱子伦精品免 | 不卡的在线视频免费观看 | 曰本女人视频69xxx | 亚洲午夜片子大全精品 | 亚洲综合另类 | 久久中文字幕综合不卡一二区 | 一区二区三区四区国产 | 婷婷色中文字幕 | 九九热在线观看 | 婷婷激情综合 | 国产精品视频在线免费观看 | 精品久久久久久中文字幕专区 | 97在线观看成人免费视频 | 一级做人免费观看c欧美网站 | 四虎天堂 | 四虎黄色网址 | 免费看欧美一级特黄α大片 | 久久啊| 亚洲精品国产精品乱码不卞 | 国产成+人+亚洲+欧美综合 | 久久香蕉影院 | 欧美手机手机在线视频一区 | 日本伦理中文字幕 | 亚洲h在线观看 | 久久91精品久久91综合 | 亚洲视频一区二区三区四区 |