文档章节

和我一起学 Selenium WebDriver(1)——入门篇

zTree
 zTree
发布于 2012/12/05 16:17
字数 2387
阅读 73137
收藏 126
    zTree 东西不多,我也一直使用着原始的人工测试手段,随着内容的不断增多,测试起来就越发的繁杂,而且经常犯懒,这样就会忽略很多本该发现的问题,而且也容易出现旧的bug 反复出现的情况,这都是测试不规范造成的。要做好东西就要更加规范和严格,于是乎决定要学习一下 Selenium WebDriver,也就是原先的  Selenium v2 了,这方面整体的文章并不多,所以一边学着,自己一边整理吧。

    对于这个可以自动化测试的工具( Selenium WebDriver)我就不做过多描述了,去 google、baidu 搜索一下即可。 我这里只记录学习  Selenium WebDriver 的过程,尤其是运行时可能出现的问题,当然了,我是做java的,我只学习 java 与  Selenium WebDriver 配合的方法。

一、下载文件

先要去官网(http://seleniumhq.org/download/)下载必需的文件:

  • Selenium IDE (专门用于 FireFox 测试的独立界面,可以录制测试步骤,但我更倾向于写代码做标准的功能测试)
  • Selenium Server (可以输入指令控制、可以解决跨域的 js 问题,等到后面学到了再讲吧)
  • The Internet Explorer Driver Server (专门用于IE测试的)
  • Selenium Client Drivers (可以找到你熟悉的语言,例如我选择的 Java)
  • Third Party Browser Drivers NOT SUPPORTED/DEVELOPED by seleniumhq(第三方开发的 Selenium 插件,第一个就是 Chrome 的,否则你就没办法测试 Chrome 了)
  • 其他的,就根据你自己的需要寻找吧,目前这些足够我用了。

二、安装 & 运行

貌似摆弄新东西时,只有 “Hello World” 蹦出来以后,我们这些初学者才会感到情绪稳定,那就赶紧开始吧。

对于初期打算直接用编程方式制作测试用例的情况来说,Selenium IDE、Selenium Server 都可以不用安装执行。
英语好的朋友可以直接看官网的文档(http://seleniumhq.org/documentation/)就能够开始使用了。
看中文的,就继续听我唠叨:

【1. 建立 Maven 工程】
Selenium 支持 maven 工程,这会让你的工作更加简便。

用 Eclipse 建个 Maven 的工程,建成后,直接修改 pom.xml,(参考:http://seleniumhq.org/docs/03_webdriver.html#setting-up-a-selenium-webdriver-project

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>Selenium2Test</groupId>
	<artifactId>Selenium2Test</artifactId>
	<version>1.0</version>
	<dependencies>
		<dependency>
			<groupId>org.seleniumhq.selenium</groupId>
			<artifactId>selenium-java</artifactId>
			<version>2.25.0</version>
		</dependency>
		<dependency>
			<groupId>com.opera</groupId>
			<artifactId>operadriver</artifactId>
		</dependency>
	</dependencies>
	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>com.opera</groupId>
				<artifactId>operadriver</artifactId>
				<version>0.16</version>
				<exclusions>
					<exclusion>
						<groupId>org.seleniumhq.selenium</groupId>
						<artifactId>selenium-remote-driver</artifactId>
					</exclusion>
				</exclusions>
			</dependency>
		</dependencies>
	</dependencyManagement>
</project>


pom.xml 修改保存后,eclipse 会自动把需要的 jar 包下载完成。


【2. 测试 FireFox】
Selenium 最初就是在 FireFox 上做起来的插件,所以我们先来搭建 FireFox 的环境。
确保你正确安装了 FireFox 后,就可以直接编写 java 代码测试喽。

在 lesson1 目录下建立 ExampleForFireFox.java
(因为国内不少朋友访问 google 的时候会出问题,所以我就把代码中的 google 变成 baidu 了)

package lesson1;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait;

public class ExampleForFireFox  {
    public static void main(String[] args) {
    	// 如果你的 FireFox 没有安装在默认目录,那么必须在程序中设置
//    	System.setProperty("webdriver.firefox.bin", "D:\\Program Files\\Mozilla Firefox\\firefox.exe");
    	// 创建一个 FireFox 的浏览器实例
        WebDriver driver = new FirefoxDriver();

        // 让浏览器访问 Baidu
        driver.get("http://www.baidu.com");
        // 用下面代码也可以实现
        // driver.navigate().to("http://www.baidu.com");

        // 获取 网页的 title
        System.out.println("1 Page title is: " + driver.getTitle());

        // 通过 id 找到 input 的 DOM
        WebElement element = driver.findElement(By.id("kw"));

        // 输入关键字
        element.sendKeys("zTree");

        // 提交 input 所在的  form
        element.submit();
        
        // 通过判断 title 内容等待搜索页面加载完毕,Timeout 设置10秒
        (new WebDriverWait(driver, 10)).until(new ExpectedCondition<Boolean>() {
            public Boolean apply(WebDriver d) {
                return d.getTitle().toLowerCase().endsWith("ztree");
            }
        });

        // 显示搜索结果页面的 title
        System.out.println("2 Page title is: " + driver.getTitle());
        
        //关闭浏览器
        driver.quit();
    }
}

普通情况下,直接运行代码就可以看到会自动弹出 FireFox 窗口,访问 baidu.com,然后输入关键字并查询,一切都是自动完成的。

错误提醒:
1)Exception in thread "main" org.openqa.selenium.WebDriverException: Cannot find firefox binary in PATH. Make sure firefox is installed.
出现这个错误,是说明你的 FireFox 文件并没有安装在默认目录下,这时候需要在最开始执行:System.setProperty 设置环境变量  "webdriver.firefox.bin" 将自己机器上 FireFox 的正确路径设置完毕后即可。

2)Exception in thread "main" org.openqa.selenium.UnsupportedCommandException: Bad request

出现这个错误,很有意思。 查了一下 有人说应该是 hosts 出现了问题,加上一个 127.0.0.1  localhost 就行了,但我的 hosts 上肯定有这个玩意,为啥也会出现这个问题呢? 

经过调试,发现 127.0.0.1 localhost 的设置必须要在 hosts 文件的最开始,而且如果后面有其他设置后,也不要再出现同样的 127.0.0.1 localhost ,只要有就会出错。(因为我为了方便访问 google 的网站,专门加入了 smarthosts 的内容,导致了 localhost 的重复)

【3. 测试 Chrome】
Chrome 虽然不是 Selenium 的原配,但是没办法,她太火辣了,绝对不能抛下她不管的。
把 ExampleForFireFox.java 稍微修改就可以制作出一个 ExampleForChrome.java ,直接把 new FireFoxDriver() 修改为 new ChromeDriver() 你会发现还是行不通。

错误如下:
1)Exception in thread "main" java.lang.IllegalStateException: The path to the driver executable must be set by the webdriver.chrome.driver system property; for more information, see http://code.google.com/p/selenium/wiki/ChromeDriver. The latest version can be downloaded from http://code.google.com/p/chromedriver/downloads/list
这应该是找不到 chrome 的文件,好吧,利用 System.setProperty 方法添加路径,这里要注意,是 “webdriver.chrome.driver” 可不是“webdriver.chrome.bin

设置路径后还是会报错:
2)[6416:4580:1204/173852:ERROR:gpu_info_collector_win.cc(91)] Can't retrieve a valid WinSAT assessment.
这个貌似是因为 Selenium 无法直接启动 Chrome 导致的,必须要通过前面咱们下载 Chrome 的第三方插件 ChromeDriver,去看第一个错误中提示给你的 网址:http://code.google.com/p/selenium/wiki/ChromeDriver
按照人家给的例子来修改我们的测试代码吧:

package lesson1;

import java.io.File;
import java.io.IOException;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriverService;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait;

public class ExampleForChrome {
	public static void main(String[] args) throws IOException {
		// 设置 chrome 的路径
		System.setProperty(
				"webdriver.chrome.driver",
				"C:\\Documents and Settings\\sq\\Local Settings\\Application Data\\Google\\Chrome\\Application\\chrome.exe");
		// 创建一个 ChromeDriver 的接口,用于连接 Chrome
		@SuppressWarnings("deprecation")
		ChromeDriverService service = new ChromeDriverService.Builder()
				.usingChromeDriverExecutable(
						new File(
								"E:\\Selenium WebDriver\\chromedriver_win_23.0.1240.0\\chromedriver.exe"))
				.usingAnyFreePort().build();
		service.start();
		// 创建一个 Chrome 的浏览器实例
		WebDriver driver = new RemoteWebDriver(service.getUrl(),
				DesiredCapabilities.chrome());

		// 让浏览器访问 Baidu
		driver.get("http://www.baidu.com");
		// 用下面代码也可以实现
		// driver.navigate().to("http://www.baidu.com");

		// 获取 网页的 title
		System.out.println("1 Page title is: " + driver.getTitle());

		// 通过 id 找到 input 的 DOM
		WebElement element = driver.findElement(By.id("kw"));

		// 输入关键字
		element.sendKeys("zTree");

		// 提交 input 所在的 form
		element.submit();

		// 通过判断 title 内容等待搜索页面加载完毕,Timeout 设置10秒
		(new WebDriverWait(driver, 10)).until(new ExpectedCondition<Boolean>() {
			public Boolean apply(WebDriver d) {
				return d.getTitle().toLowerCase().endsWith("ztree");
			}
		});

		// 显示搜索结果页面的 title
		System.out.println("2 Page title is: " + driver.getTitle());

		// 关闭浏览器
		driver.quit();
		// 关闭 ChromeDriver 接口
		service.stop();

	}
}

运行一下看看,是不是一切OK了?

【2012.12.06补充】

上一个 Demo 中无法正常使用 new ChromeDriver(),今天在做进一步学习时看到一篇文章(http://qa.blog.163.com/blog/static/19014700220122231779/),恍然大悟,原来只需要把 ‘webdriver.chrome.driver’ 的值设置为 chromedriver 的路径就可以了。

package lesson1;

import java.io.IOException;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait;

public class ExampleForChrome2 {
	public static void main(String[] args) throws IOException {
		// 设置 chrome 的路径
		System.setProperty(
				"webdriver.chrome.driver",
				"E:\\Selenium WebDriver\\chromedriver_win_23.0.1240.0\\chromedriver.exe");
		// 创建一个 ChromeDriver 的接口,用于连接 Chrome
		// 创建一个 Chrome 的浏览器实例
		WebDriver driver = new ChromeDriver();

		// 让浏览器访问 Baidu
		driver.get("http://www.baidu.com");
		// 用下面代码也可以实现
		// driver.navigate().to("http://www.baidu.com");

		// 获取 网页的 title
		System.out.println("1 Page title is: " + driver.getTitle());

		// 通过 id 找到 input 的 DOM
		WebElement element = driver.findElement(By.id("kw"));

		// 输入关键字
		element.sendKeys("zTree");

		// 提交 input 所在的 form
		element.submit();

		// 通过判断 title 内容等待搜索页面加载完毕,Timeout 设置10秒
		(new WebDriverWait(driver, 10)).until(new ExpectedCondition<Boolean>() {
			public Boolean apply(WebDriver d) {
				return d.getTitle().toLowerCase().endsWith("ztree");
			}
		});

		// 显示搜索结果页面的 title
		System.out.println("2 Page title is: " + driver.getTitle());

		// 关闭浏览器
		driver.quit();

		// element = driver.findElement(By.id("kw"));
		// // element.clear();
		// element.click();
		// element.clear();
		// element.sendKeys("zTree");
		// element.submit();
	}
}

【4. 测试 IE】
想逃避 IE 吗?? 作为前端开发,IE 你是必须要面对的,冲吧!
其实你会发现, Selenium 主要也就是针对 FireFox 和 IE 来制作的,所以把 FireFox 的代码修改为 IE 的,那是相当的容易,只需要简单地两步:
1)把 ExampleForFireFox.java 另存为 ExampleForIE.java 
2)把 WebDriver driver = new FirefoxDriver(); 修改为 WebDriver driver = new InternetExplorerDriver();
3)一般大家的 IE都是默认路径吧,所以也就不用设置 property 了

package lesson1;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait;

public class ExampleForIE {
	public static void main(String[] args) {
		// 如果你的 FireFox 没有安装在默认目录,那么必须在程序中设置
		// System.setProperty("webdriver.firefox.bin", "D:\\Program Files\\Mozilla Firefox\\firefox.exe");
		// 创建一个 FireFox 的浏览器实例
		WebDriver driver = new InternetExplorerDriver();

		// 让浏览器访问 Baidu
		driver.get("http://www.baidu.com");
		// 用下面代码也可以实现
		// driver.navigate().to("http://www.baidu.com");

		// 获取 网页的 title
		System.out.println("1 Page title is: " + driver.getTitle());

		// 通过 id 找到 input 的 DOM
		WebElement element = driver.findElement(By.id("kw"));

		// 输入关键字
		element.sendKeys("zTree");

		// 提交 input 所在的 form
		element.submit();

		// 通过判断 title 内容等待搜索页面加载完毕,Timeout 设置10秒
		(new WebDriverWait(driver, 10)).until(new ExpectedCondition<Boolean>() {
			public Boolean apply(WebDriver d) {
				return d.getTitle().toLowerCase().endsWith("ztree");
			}
		});

		// 显示搜索结果页面的 title
		System.out.println("2 Page title is: " + driver.getTitle());

		// 关闭浏览器
		driver.quit();
	}
}

运行一下,是不是 so easy?

入门工作完成,现在完全可以利用 java 代码,让 Selenium 自动执行我们设置好的测试用例了,不过.....这仅仅是个开始。

© 著作权归作者所有

共有 人打赏支持
zTree

zTree

粉丝 831
博文 21
码字总数 21754
作品 1
朝阳
技术主管
私信 提问
加载中

评论(25)

zTree
zTree

引用来自“HimuraYu”的评论

请问谷歌浏览器的 usingChromeDriverExecutable 这一句报红,是缺什么jar包啊,我用的maven selenium2.53的版本
不知道哟。。。多少年不碰这个了。。抱歉
球形闪电z
球形闪电z
请问谷歌浏览器的 usingChromeDriverExecutable 这一句报红,是缺什么jar包啊,我用的maven selenium2.53的版本
zTree
zTree

引用来自“R9527”的评论

你好,我的maven工程报错,不知道如何解决,望请赐教
1、描述资源路径位置类型
Archive for required library: 'C:/Users/Administrator/.m2/repository/cglib/cglib-nodep/2.1_3/cglib-nodep-2.1_3.jar' in project 'Test' cannot be read or is not a valid ZIP file建路径构建路径问题
2、描述资源路径位置类型
CoreException: Could not get the value for parameter compilerId for plugin execution default-compile: PluginResolutionException: Plugin org.apache.maven.plugins:maven-compiler-plugin:3.1 or one of its dependencies could not be resolved: Failed to collect dependencies for org.apache.maven.plugins:maven-compiler-plugin🏺3.1 (): ArtifactDescriptorException: Failed to read artifact descriptor for org.apache.maven:maven-toolchain🏺1.0: UnresolvableModelException: Failure to transfer org.apache.maven:maven:pom:2.0.6 from http://repo1.maven.org/maven2 was cached in the local repository, resolution will not be reattempted until the update interval of central has elapsed or updates are forced. Original error: Could not transfer artifact org.apache.m
抱歉,你也看到了这是 4年前学着玩儿时弄得,已经很长时间不弄这个玩意了。。。你关键还是要注意 各个模块的版本兼容,注意模块放置的路径是否正常
Elven_Xu
Elven_Xu
信息: Detected dialect: OSS
Exception in thread "main" org.openqa.selenium.WebDriverException: unknown error: Runtime.executionContextCreated has invalid 'context': {"auxData":{"frameId":"8662.1","isDefault":true},"id":1,"name":"","origin":"://"}
(Session info: chrome=54.0.2840.71)
(Driver info: chromedriver=2.9.248307,platform=Mac OS X 10.11.6 x86_64) (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 304 milliseconds
Build info: version: '3.0.1', revision: '1969d75', time: '2016-10-18 09:48:19 -0700'
System info: host: 'elvendeMacBook-Pro.local', ip: '10.1.0.146', os.name: 'Mac OS X', os.arch: 'x86_64', os.version: '10.11.6', java.version: '1.8.0_122-ea'
Driver info: org.openqa.selenium.chrome.ChromeDriver
Capabilities [{applicationCacheEnabled=false, rotatable=false, chrome={userDataDir=/var/folders/y3/d8xwdpz56ng56pcrfgvfdj2m0000gn/T/.org.chromium.Chromium.27y0Z7}, takesHeapSnapshot=true, databaseEnabled=false, handlesAlerts=true, versio
zTree
zTree

引用来自“R9527”的评论

你好,我的maven工程报错,不知道如何解决,望请赐教
1、描述资源路径位置类型
Archive for required library: 'C:/Users/Administrator/.m2/repository/cglib/cglib-nodep/2.1_3/cglib-nodep-2.1_3.jar' in project 'Test' cannot be read or is not a valid ZIP file建路径构建路径问题
2、描述资源路径位置类型
CoreException: Could not get the value for parameter compilerId for plugin execution default-compile: PluginResolutionException: Plugin org.apache.maven.plugins:maven-compiler-plugin:3.1 or one of its dependencies could not be resolved: Failed to collect dependencies for org.apache.maven.plugins:maven-compiler-plugin🏺3.1 (): ArtifactDescriptorException: Failed to read artifact descriptor for org.apache.maven:maven-toolchain🏺1.0: UnresolvableModelException: Failure to transfer org.apache.maven:maven:pom:2.0.6 from http://repo1.maven.org/maven2 was cached in the local repository, resolution will not be reattempted until the update interval of central has elapsed or updates are forced. Original error: Could not transfer artifact org.apache.m
你这个是不是 资源依赖包没有下载成功?
R
R9527
你好,我的maven工程报错,不知道如何解决,望请赐教
1、描述资源路径位置类型
Archive for required library: 'C:/Users/Administrator/.m2/repository/cglib/cglib-nodep/2.1_3/cglib-nodep-2.1_3.jar' in project 'Test' cannot be read or is not a valid ZIP file建路径构建路径问题
2、描述资源路径位置类型
CoreException: Could not get the value for parameter compilerId for plugin execution default-compile: PluginResolutionException: Plugin org.apache.maven.plugins:maven-compiler-plugin:3.1 or one of its dependencies could not be resolved: Failed to collect dependencies for org.apache.maven.plugins:maven-compiler-plugin🏺3.1 (): ArtifactDescriptorException: Failed to read artifact descriptor for org.apache.maven:maven-toolchain🏺1.0: UnresolvableModelException: Failure to transfer org.apache.maven:maven:pom:2.0.6 from http://repo1.maven.org/maven2 was cached in the local repository, resolution will not be reattempted until the update interval of central has elapsed or updates are forced. Original error: Could not transfer artifact org.apache.m
zTree
zTree

引用来自“cloudroc”的评论

如果不装浏览器,只使用chrome driver是不是不行
这东西是直接去启动浏览器的。。。。
Solr_
Solr_
如果不装浏览器,只使用chrome driver是不是不行
shenghui7
shenghui7
mark
zTree
zTree

引用来自“田策”的评论

引用来自“REYN卢磊”的评论

我刚进入公司实习时候做的就是selenium的自动化测试,感觉对于这种web页面的测试有一个很bug的问题,开发页面的变化会直接影响到测试脚本的维护,譬如页面中的dom tree产生变化会影响到所有以xpath取值的脚本元素,而页面中又不是所有的节点都标注了Id。不知道你是怎么解决这个问题的,这个貌似还在持续困扰着我们的测试姑娘们!

我们的自动化测试已经全面禁止使用xpath,因为一旦页面语速改变,这些就全无法通过了. 最佳方案是css,使用@FindBy()的方法在每个page的上边进行定义,然后可以统一维护.

是应该这样的,靠一些约定的命名规则进行查找,不依赖固定的 xpath
Selenium实战——.Net下的自动化测试搭建

更新:响应各位朋友的需求,现在将代码推到了GitHub服务器上,今后也将会在此基础上更新,然后再次感谢各位的支持 地址如下: https://github.com/zhaoyan42/SeleniumInAction.git 这篇文章,...

赵晏龙
2013/03/11
0
33
运维学python之爬虫工具篇(五)Selenium的用法

1 介绍 Selenium是一组不同的软件工具,每个工具都有不同的方法来支持自动化测试,Selenium支持多种语言开发,比如 Java、C、Python等。Selenium有两个版本,Selenium 2 (也叫Selenium WebDri...

578384
2017/12/28
0
0
Selenium2+python自动化5-操作浏览器基本方法

前言 前面已经把环境搭建好了,这从这篇开始,正式学习selenium的webdriver框架。我们平常说的 selenium自动化,其实它并不是类似于QTP之类的有GUI界面的可视化工具,我们要学的是webdriver...

上海-悠悠
2016/12/01
0
0
Selenium是如何操纵浏览器的?

前言 上一篇文章《selenium webdriver 是怎么运行的》用了一个简单的例子——搭出租车,形象地讲解selenium webdriver 是如何运行的,而这一篇文章可以理解为深入了解selenium是如何和浏览器...

深圳-逸遥
08/20
0
0
扩展Python渗透测试探测器的新功能

文章首发个人博客:http://zmister.com/archives/185.html 第二篇:改善渗透测试探测器显示结果和添加新功能选项 本篇将会涉及: Selenium与PhantomJS 为渗透测试探测器添加截图功能 测试新功...

州的先生
2017/11/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Ubuntu18.04 安装MySQL

1.安装MySQL sudo apt-get install mysql-server 2.配置MySQL sudo mysql_secure_installation 3.设置MySQL非root用户 设置原因:配置过程为系统root权限,在构建MySQL连接时出现错误:ERROR...

AI_SKI
今天
3
0
3.6 rc脚本(start方法) 3.7 rc脚本(stop和status方法) 3.8 rc脚本(以daemon方式启动)

3.6-3.7 rc脚本(start、stop和status方法) #!/usr/bin/env python# -*- coding: utf-8 -*-# [@Version](https://my.oschina.net/u/931210) : python 2.7# [@Time](https://my.oschina.......

隐匿的蚂蚁
今天
3
0
Cnn学习相关博客

CNN卷积神经网络原理讲解+图片识别应用(附源码) 笨方法学习CNN图像识别系列 深度学习图像识别项目(中):Keras和卷积神经网络(CNN) 卷积神经网络模型部署到移动设备 使用CNN神经网络进行...

-九天-
昨天
5
0
flutter 底部输入框 聊天输入框 Flexible

想在页面底部放个输入框,结果键盘一直遮住了,原来是布局问题 Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("评论"), ...

大灰狼wow
昨天
4
0
Kernel I2C子系统

备注:所有图片来源于网络 1,I2C协议: 物理拓扑: I2C总线由两根信号线组成,一条是时钟信号线SCL,一条是数据信号线SDA。一条I2C总线可以接多个设备,每个设备都接入I2C总线的SCL和SDA。I...

yepanl
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部