当前游戏未开放聊天截图自动化截图什么意思

developerWorks 社区
本文主要讲解了利用 Selenium WebDriver 来实现 TVT(Translation Verification Testing) 的自动化截图工作,TVT 是 IBM GSSC 部门为产品翻译做验证测试的一个重要环节,其中的截图工作量大而且重复性很强,对其实现自动化可以节省很多时间和人力成本。您通过此文,不仅能够了解到自动化在 TVT 多语言环境过程中的作用,而且可以在 Selenium WebDriver 做自动化测试方面获得更多的启发,比如 WebDriver 对 Firefox 浏览器的操作等等。
, 软件工程师,
罗小双目前工作于 IBM GSSC 的 Globalization 部门,主要负责 Tivoli 产品的 GVT 和 TVT 测试工作。
TVT 的概念和 TVT 自动化的必要性概念翻译验证测试 (Translation Verification Testing,TVT) 是 IBM GSSC 部门为 IBM 的各种产品做本地化 (Localization) 的一个测试环节。众所周知,我们开发出一款产品,需要让全球各地的用户都能够无障碍的使用,就必须精准的将产品 UI 和相关文档翻译成各种语言,这样不同国家和地区的用户才能够顺畅使用。TVT 的过程就是一个产品翻译验证测试的过程。必要性从字面上看,TVT 是一个比较简单的翻译验证过程,然而在 GSSC 内部,完成这个过程却有复杂流程。在这些流程中,其中有一个重复而且工作量很大的环节就是截图。截图是将产品所有语言版本的 UI 和相关文档以图片的形势截取并保存下来,然后发给各个国家的 Tester 去验证 (Verification) 其翻译正确性。我们可以计算一下截图的工作量,如果一个产品要做 20 个语言的版本,那么一个 case 需要截图 20 张,假如一个项目中有 1000 个 case,那么 GSSC 的 TSE(Test Support Engineer) 就必须截 20000 张图 (20*1000)。 如果手动来截图,一张图大概要花费 5 分钟的时间,那么手动截图大概是 100 张 / 人天 (60*8/5=96)。10 个 TSE 来完成这项工作也至少需要 20 天时间 (10 人 *100 张 *20 天 =20000 张 )。所以如果能够使用自动化来完成这些重复的工作,录制一次 case 脚本,然后在 20 种语言环境下执行,那么这将大大节省时间和人力成本,所以自动化在 TVT 中是非常有帮助和必要的。Selenium 简介
Selenium 是针对 Web 应用的测试框架,支持多种浏览器和多种编程语言。Selenium 2 的主要新功能是集成了 WebDriver - 曾经是 Selenium 1(又名 Selenium RC)的竞争对手。Selenium RC 在浏览器中运行 JavaScript 应用,而 WebDriver 通过原生浏览器支持或者浏览器扩展直接控制浏览器。
Selenium IDE:FireFox 的一个插件,支持脚本录制。在 TVT 自动化截图工作中,需要用到 Selenium WebDriver 和 Selenium IDE 这两个工具,鉴于本文主要是介绍 TVT 的自动化截图,详细的 Selenium 知识,这里不再介绍,大家可以去其官方网站上了解更多相关知识。
为了配合 Selenium IDE 一起工作,还需要 Firefox 的另外一个插件:Firebug,这个工具可以查找 Web 页面元素的属性,比如元素 ID、Name、Class、CSS、Path 等等,这些都是 Selenium IDE 和 WebDriver 需要使用到的。用 Selenium IDE 录制和导出脚本
首先需要下载 Selenium IDE, 可以从 Selenium 下载最新版本的 IDE,但是需要注意 IDE 与 Firefox 的兼容性,具体的兼容性可以在下载的时候阅读 Selenium IDE 的 release notes。下载完成后以插件的形势安装在 Firefox 上。
启动 Firefox 并输入录制网站的 URL,点击菜单栏上面的工具 -&Selenium IDE, Selenium IDE 就会弹出来。接下来对 Firefox 的所有操作都会记录下来,比如系统的登陆过程(如图 1 所示),当所有步骤完成之后,点击 IDE 右上角的红色圆点停止按钮就完成了一个 Case 脚本的录制工作。图 1. 录制用户登录
接下来介绍一下 Firebug,下载 Firebug, 可以从其 下载最新版本,同时也需要注意其版本与 Firefox 的兼容性。下载好之后同样以插件的形势安装在 Firefox 上。
安装完之后就可以利用 Firebug 来查找页面元素,右键点击需要查找的元素,选择 Inspect Element with Firebug,这个元素的各种属性就会高亮显示出来,(如图 2 所示),这时候您就可以根据自己的需要选择元素的各种属性,Firebug 的使用,请大家参考其 。图 2. 使用 Firebug 查看页面元素
脚本录制完就可以导出来了,在 Selenium IDE 的菜单栏上点击 File-& Export Test Case As..-& Java/ Junit4/WebDriver, 输入文件名并保存,注意后缀为 .java(如图 3 所示)。到此就得到了 Case 执行过程中的 Java 脚本,接下来需要做的就是将其导入 Eclipse 修改和添加相关步骤。
图 3. 导出脚本修改脚本,实现多语言环境下截图
在 Eclipse 中新建一个 Java Project, 并将 Selenium-server-standalone-2.2.X.jar 包加入引用类库(如图 4 所示),可以通过以下链接下载 。
图 4. 在 Eclipse 中创建工程并导入 WebDriver 类库
新建一个类,将在 Selenium IDE 中保存下来的类代码复制到新类中,注意新建类的类名要和导出来保存的文件名相同,比如在 Selenium IDE 中导出的文件名为 TestCase.java, 那么新建类名也要命名为 TestCase( 如图 5 所示 )。如果新建类名和导出来的文件名不相同,那么在代码拷贝到 Eclipse 之后,需要将代码中的类名修改到与新建类名一致,这样 Eclipse 才不会有编译错误的提示。
图 5. 将导出代码拷贝到 Eclipse 中
到此,一个 Junit4 test case 就在 Eclipse 中建成 , 如代码清单 1.
清单 1. 将脚本导入 Eclipse package com.example.caseP
import static org.junit.Assert.
import java.util.concurrent.TimeU
import org.junit.A
import org.junit.B
import org.junit.T
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptE
import org.openqa.selenium.NoSuchElementE
import org.openqa.selenium.WebD
import org.openqa.selenium.WebE
import org.openqa.selenium.support.ui.S
import com.example.util.TVTU
public class TestCase{
private WebD
private String baseU
* This is the directory to save the screen captures, if you have finished a
* language executing, please change the directory to save another
* languages screen captures
public static final String DIRECTORY = "c:\\ScreenCapture\\jp\\";
// the pictures's format
public static final String FORMAT = ".gif";
private StringBuffer verificationErrors = new StringBuffer();
public void setUp() throws Exception {
driver = TVTUtility.openPreferenceFirefox ("en");
baseUrl = "https://9.115.46.97:16311";
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS );
driver.manage().window().maximize();
public void testCase_() throws Exception {
System.out .println("case1 start");
driver.get(baseUrl + "/ibm/console/logon.jsp");
driver.findElement(By.id ("j_username")).clear();
driver.findElement(By.id ("j_username")).sendKeys("admin");
driver.findElement(By.id ("j_password")).clear();
driver.findElement(By.id ("j_password")).sendKeys("password");
driver.findElement(By.id ("other")).click();
* judge whether the user has login in the system or not, if the user
* has already login in, then click OK button to log-out
* the pre-user,
* if there were no user has login the system, just ignore this step
if (isElementPresent(By.name ("submit"))) {
driver.findElement(By.name ("submit")).click();
driver.switchTo().frame("ISCNavigation");
driver.findElement(By.id ("2-nav-tree-expandable-item")).click();
driver.findElement(By.id ("3-nav-tree-expandable-item")).click();
driver.findElement(By.id ("
nav-tree-item-com.ibm.license.mgmt.ui.reports.ManageReports.node"\
)).click();
Thread.sleep (1000);
driver.switchTo().defaultContent();
driver.switchTo().frame("ISCWork");
driver.findElement(By.className ("btnm1")).click();
driver.findElement(By.className ("pop5")).click();
Thread.sleep (1000);
driver.findElement(By.xpath("html/body/div[1]/table/tbody/tr/td/div/
table/tbody/tr/td/table/tbody/tr[3]/td/table/tbody/tr/td/form/span/
table/tbody/tr[3]/td/table[2]/tbody/tr/td/table/tbody/tr[3]/td/table/
tbody/tr[3]/td[1]/table/tbody/tr/td/table/tbody/tr/td/table/tbody/
tr/td[4]/a/img")).click();
Select m1= new Select(driver.findElement(By.id(TVTUtility.byDom(
driver,"document.getElementsByTagName('select')[0].id"))));
m1.selectByIndex(9);
// select the day
Select y1= new Select(driver.findElement(By.id(TVTUtility.byDom(
driver,"document.getElementsByTagName('select')[1].id"))));
y1.selectByValue("2013");
driver.findElement(By.linkText("9")).click();
driver.findElement(
By.xpath("html/body/div[3]/div/table/tbody/tr[3]/td/input[1]"\
)).click();
driver.findElement(By.xpath("html/body/div[1]/table/tbody/tr/td/\
div/table/tbody/tr/td/table/tbody/tr[3]/td/table/tbody/tr/td/form/\
span/table/tbody/tr[3]/td/table[2]/tbody/tr/td/table/tbody/tr[3]/\
td/table/tbody/tr[5]/td/table/
tbody/tr/td[1]/input")).click();
Thread.sleep(1000);
TVTUtility.captureScreen(driver, DIRECTORY,\
TVTUtility.getMethodName(),FORMAT);
System.out.println("case1 finished");
public void tearDown() throws Exception {
driver.quit();
String verificationErrorString = verificationErrors.toString();
if (!"".equals(verificationErrorString)) {
fail(verificationErrorString);
}清单 1 是一个完整的 Case 脚本,每个脚本从 Selenium IDE 中导出来都会由三个方法组成,setup(),tearDown() 和 testXxx()。setup() 在 testXxx() 前执行,tearDown() 在 testXxx() 之后执行。setup() 主要是用来初始化一些通用参数,比如 WebDriver 的构建和某些参数的初始化工作,或者系统的登陆。tearDown() 主要是来关闭浏览器等后续动作 ,Case 的主体在 testXxx() 中完成。由于每个 Case 的主要步骤都是在 testXxx() 方法中完成,而 setup() 和 tearDown() 方法是一些通用的步骤,所以在写脚本的时候,不用为每一个导出的脚本都新建一个 Java 类,只需要将脚本中的 testXxx() 方法拷贝到已经建好的类中,并重用 setup() 和 tearDown() 方法。这样就可以在一个类中添加多个 testXxx() 方法,每个方法对应一个 Case 脚本。其中 testXxx() 方法命名最好是有规律和规范的,比如 testCase_(), testCase_()..., 这样在保存截图的时候就可以使用方法名或者方法名的一部分作为图片名,处理起来也比较简单。在 testXxx() 方法中,有很多如 driver.findElement(By.id ("2-nav-tree-expandable-item")).click();
driver.findElement(By.xpath ("xxxxxxxxxxxxxxxxxxxxxxx")).click(); 的语句,这些语句就是用来查找页面元素的,在用 Selenium WebDriver 的时候,主要挑战就是查找元素,所以了解更多的 WebDriver API 才能更顺利的去实现 Case 的编写。
前面已经讨论过,在 TVT 中,重复工作在于截图,所以接下来就要解决截图问题。Selenium WebDriver 已经提供了截图方法,我们只需在需要截图的代码位置,嵌入截图语句。以下方法是将截图功能封装在一个 TVTUtility 的工具类中,如代码清单 2.清单 2. 截图方法public static void captureScreen(WebDriver dr, String directory,String captureName,
String format)
File screenShotFile = ((TakesScreenshot) dr).getScreenshotAs(OutputType.FILE );
FileUtils.copyFile (screenShotFile, new File(directory+ captureName + \
} catch (IOException e) {
e.printStackTrace();
}在需要截图的位置,嵌入 TVTUtility.captureScreen(driver, DIRECTORY, TVTUtility.getMethodName(),FORMAT) 语句,就能完成截图并保存到指定的位置。这里需要注意语句的执行速度一般比 Firefox 的响应速度快,所以有必要在截图之前显示等待一段时间以便页面的完全加载,如 Thread.sleep(1000), 具体的时间要看实际情况而定。captureScreen() 方法中参数 driver 是一个 Selenium WebDriver 对象,DIRECTORY 是保存图片的位置,TVTUtility.getMethodName() 参数的作用是获取当前的方法名,前面我们讨论过,这个方法的命名最好是有规律和规范的,这样就可以截取其一部分来作为图片保存的名称,比如截取成 10020...,FORMAT 参数为图片的格式,如 jpg,gif 等。
完成上面的步骤,就可以实现 Case 在英文环境下截图了,但是要截取其他语言下的图片,就必须将 Firefox 的 language 属性切换成相应的语言。通常情况下,是通过点击 Firefox 菜单栏上面的 Tools-& Options → Content → Language → Choose..., 然后选择语言。但是在脚本的执行过程中, Firefox 是通过语句来启动的,没办法通过手动来切换语言。 这时就需要在代码中改变 Firefox 的这个参数,如代码清单 3.
清单 3. 切换 Firefox 的语言public static WebDriver openPreferenceFirefox(String locale){
FirefoxProfile profile = new FirefoxProfile();
profile.setPreference("intl.accept_languages",locale);
return new FirefoxDriver(profile);
}清单 3 是通过在启动 Firefox 的时候,改变其“intl.accept_languages ”属性来切换显示语言。在 Selenium WebDriver 中,可以通过 FirefoxProfile 类的 setPreference() 方法来实现,如 profile.setPreference("intl.accept_languages","zh-CN") 是在启动 Firefox 的时候将其语言属性设置为简体中文。更多的有关 Firefox 属性,可以参考 mozillaZine 的 About:然后在初始化 WebDreiver 参数的时候,只需要调用此方法即可达到浏览器语言的自动切换:WebDriver driver = TVTUtility.openPreferenceFirefox("zh-CN"); 这样每次在脚本执行的过程中,只要将对应语言的简称传入这个方法作为参数,Firefox 就会切换到相应的语言了。解决了语言切换问题,就可以实现多语言环境下的脚本执行了。需要注意的细节
Selenium 是基于 Web 的自动化工具,所以对于非基于 Web 的项目,此方法是不可用的。
在有些项目中,Web 元素的 ID 是动态的,并且没有 name 属性,这样的元素定位只能靠 xpath 或者 class、CSS 等方法来定位,这个时候 Firebug 这个工具非常有用。甚至有些元素没有上面的所有属性,或者 Case 的步骤比较复杂,那么这个 Case 最好不要使用自动化脚本来实现截图。
在 Selenium IDE 中录制的脚本可以成功回放,但是将脚本导入 Eclipse 后, 却回放不成功,这种问题很常见,问题可能在于 Selenium IDE 录制的脚本,有些步骤是不能转换成 Java 代码的。比如,在 Selenium IDE 中的 selectFrame 操作,就不能转换成相应的 Java 代码,而这些操作在产找元素的时候似乎必须的,否者在回放的过程中会出现找不到元素的异常,所以在导入到 Eclipse 之后,需要对代码进一步检查和修改。
有时候在定位一个页面元素,却发现一直定位不了,反复检查自己写的定位器没有任何问题,代码也没有任何问题。这时您就要看一下这个页面元素是否在一个 iframe 中,这可能就是找不到的原因之一。如果您在一个 default content 中查找一个在 iframe 中的元素,那肯定是找不到的。反之您在一个 iframe 中查找另一个 iframe 元素或 default content 中的元素那必然也定位不到。
Selenium WebDriver 中提供了进入一个 iframe 的方法:WebDriver org.openqa.selenium.WebDriver.TargetLocator.frame(String nameOrId)也提供了一个返回 default content 的方法:WebDriver org.openqa.selenium.WebDriver.TargetLocator.defaultContent() 使用这两个方法可以方便的进入或者跳出一个 iframe, 从而方便的找到元素。
当您熟悉了 WebDriver API 的时候,您会发现,Case 步骤基本相同的时候,您只需要使用 Selenium IDE 录制一个 Case,其他类似的可以拷贝这个 Case 的代码做一些修改,这比起每只 Case 都使用 IDE 录制要更快。结束语目前,GSSC 部门 TVT 主要还是以手动截图为主,Selenium 也只能对基于 Web 的产品做自动化操作,而对于基于 Windows 客户端的的产品,也有比较成熟的自动化工具,其中 IBM Rational Function Testing 是目前比较主流的自动化测试工具之一,用的比较广泛。要解决多语言环境下的 TVT 的自动化截图,需要从多方面去考虑,选择适合项目本身的自动化方案。但是不管选择哪一种工具和方案,都还需要做更多的研究。
访问 ,下载 Selenium WebDriver 类库和 IDE。
访问 , 了解更多关于 Selenium 的操作。
访问 ,下载和学习 FireBug 的更多知识。
查看 , 了解操作 Firefox 的相关参数,通过这篇文章,可以查找所有 Firefox 界面上对应的参数和属性值。
:通过专门关于 Web 技术的文章和教程,扩展您在网站开发方面的技能。:这是有关 Ajax 编程模型信息的一站式中心,包括很多文档、教程、论坛、blog、wiki 和新闻。任何 Ajax 的新信息都能在这里找到。,这是有关 Web 2.0 相关信息的一站式中心,包括大量 Web 2.0 技术文章、教程、下载和相关技术资源。您还可以通过
栏目,迅速了解 Web 2.0 的相关概念。查看 ,了解更多和 HTML5 相关的知识和动向。加入 。查看开发人员推动的博客、论坛、组和维基,并与其他 developerWorks 用户交流。
developerWorks: 登录
标有星(*)号的字段是必填字段。
保持登录。
单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件。
在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。
所有提交的信息确保安全。
选择您的昵称
当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。昵称长度在 3 至 31 个字符之间。
您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。
标有星(*)号的字段是必填字段。
(昵称长度在 3 至 31 个字符之间)
单击提交则表示您同意developerWorks 的条款和条件。 .
所有提交的信息确保安全。
文章、教程、演示,帮助您构建、部署和管理云应用。
立即加入来自 IBM 的专业 IT 社交网络。
免费下载、试用软件产品,构建应用并提升技能。
static.content.url=/developerworks/js/artrating/SITE_ID=10Zone=Web development, Java technologyArticleID=861397ArticleTitle=基于 Selenium WebDriver 实现多语言环境下自动化截图publish-date=神鬼世界新手入门
召唤兽系统
神鬼世界攻略心得
神鬼世界精彩视频
神鬼世界美图欣赏&&&&自动化测试图片比较工具
自动化测试图片比较工具
请在Ubuntu下使用。用于自动化测试后的图片比较,找出图片不同的地方。具体参考blog
若举报审核通过,可奖励20下载分
被举报人:
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
VIP下载&&免积分60元/年(1200次)
您可能还需要
移动开发下载排行在测试运行期间获取错误的截图,一方面可以给自己定位错误测试脚本提供方便,另外一方面,可以和开发人员进行有效的沟通,错误的截图不仅仅如此,它有助于调试测试或者创建测试运行的证据。如下是汇总了seleniumwebdriver带有内置方法在测试执行期间获取截图的方法,见如下:方法描述Examplesave_screenshot(filename)获取当前的屏幕截图且保存driver.save_screenshot('test.png')get_screenshot_as_file(filename)获取当前的屏幕截图,使用完整的路劲driver.get_screenshot_as_file('result/test.png')get_screenshot_as_png()获取当前屏幕截图的二进制文件窗口数据driver.get_screenshot_as_png()get_screenshot_as_base64()获取当前的屏幕截图的base64编码driver.get_screenshot_as_base64() 1、Save_screenshot():
save_screenshot(filename)是获取当前屏幕的截图,如我们打开/,调用self.driver.save_screenshot('文件名称.png'),就会在当前目录下生成一个图片,该图片是打开窗口的屏幕截图,见实现的测试脚本:#coding:utf-8 fromselenium import webdrivermon.by import Byfromselenium.webdriver.support.ui import WebDriverWaitfromselenium.webdriver.support import expected_conditionsmon.action_chains import ActionChainsmon.keys import Keysimportunittestfromtime import
sleep classdemoTest(unittest.TestCase):
def setUp(self):
self.driver=webdriver.Firefox()
self.driver.maximize_window()
self.driver.implicitly_wait(30)
self.driver.get('/')
def testSavePng(self):
self.driver.save_screenshot('videojs.png')
def tearDown(self):
self.driver.quit() if__name__=='__main__':
unittest.main(verbosity=2) 2、get_ screenshot_as_file():
get_screenshot_as_file(filename)是保存当前的屏幕截图,并且带有完整的路劲,我们任然已/为实例,来获取屏幕截图:self.driver.get_screenshot_as_file('/path/videojs.png'),见如下实现的测试代码:#coding:utf-8 fromselenium import webdrivermon.by import Byfromselenium.webdriver.support.ui import WebDriverWaitfromselenium.webdriver.support import expected_conditionsmon.action_chains import ActionChainsmon.keys import Keysimportunittestfromtime import
sleep classdemoTest(unittest.TestCase):
def setUp(self):
self.driver=webdriver.Firefox()
self.driver.maximize_window()
self.driver.implicitly_wait(30)
self.driver.get('/')
def testGetScreen(self):
self.driver.get_screenshot_as_file('D:/git/PyCharm/TestCase/report/videojs.png')
def tearDown(self):
self.driver.quit() if__name__=='__main__':
unittest.main(verbosity=2) 3、get_screenshot_as_png():
get_screenshot_as_png() 是获取当前屏幕的截图二进制的数据,我们任然已/为实例,来获取首页屏幕截图的二进制数据并输出,输出的二进制数据为乱码,测试代码见如下:#coding:utf-8 fromselenium import webdrivermon.by import Byfromselenium.webdriver.support.ui import WebDriverWaitfromselenium.webdriver.support import expected_conditionsmon.action_chains import ActionChainsmon.keys import Keysimportunittestfromtime import
sleep classdemoTest(unittest.TestCase):
def setUp(self):
self.driver=webdriver.Firefox()
self.driver.maximize_window()
self.driver.implicitly_wait(30)
self.driver.get('/')
def testPng(self):
print self.driver.get_screenshot_as_png()
def tearDown(self):
self.driver.quit() if__name__=='__main__':
unittest.main(verbosity=2) 4、get_screenshot_as_base64():
get_screenshot_as_base64()是获取当前屏幕截图的base64编码,我们已/为例,输出该网站首页的base64的编码,见实现的测试代码:#coding:utf-8 from selenium import webdriverfrom mon.byimport Byfrom selenium.webdriver.support.uiimport WebDriverWaitfrom selenium.webdriver.support importexpected_conditionsmon.action_chains import ActionChainsfrom mon.keysimport
Keysimport unittestfrom time import
sleep class demoTest(unittest.TestCase):
defsetUp(self):
self.driver=webdriver.Firefox()
self.driver.maximize_window()
self.driver.implicitly_wait(30)
self.driver.get('/')
deftestBase64(self):
printself.driver.get_screenshot_as_base64()
deftearDown(self):
self.driver.quit() if __name__=='__main__':
unittest.main(verbosity=2) python自动化测试(python-selenium) 
 文章为作者独立观点,不代表大不六文章网立场
python-selenium使用Python语言,介绍Python语言与Selenium,Appium的API的交互以及其他,来玩转web平台,移动平台的自动化测试。热门文章最新文章python-selenium使用Python语言,介绍Python语言与Selenium,Appium的API的交互以及其他,来玩转web平台,移动平台的自动化测试。&&&&违法和不良信息举报电话:183-
举报邮箱:
Copyright(C)2016 大不六文章网
京公网安备78}

我要回帖

更多关于 ios 获取当前屏幕截图 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信