到底有没有滴滴滴滴预约抢单软件件

在做自动化测试之前你需要知道的
什么是自动化测?
  做测试好几年了,真正学习和实践自动化测试一年,自我感觉这一个年中收获许多。一直想动笔写一篇文章分享自动化测试实践中的一些经验。终于决定花点时间来做这件事儿。
  首先理清自动化测试的概念,广义上来讲,自动化包括一切通过工具(程序)的方式来代替或辅助手工测试的行为都可以看做自动化,包括性能测试工具(、)或自己所写的一段程序,用于生成到个测试数据。狭义上来讲,通工具记录或编写脚本的方式模拟手工测试的过程,通过回放或运行脚本来执行测试用例,从而代替人工对系统的功能进行验证。
  当然,我们更普遍的认识把“自动化测试”看做“&基于产品或项目层的自动化测试”。
分层的自动化测试
  这个概念最近曝光度比较高,传统的自动化测试更关注的产品层的自动化测试,而分层的自动化测试倡导产品的不同阶段(层次)都需要自动化测试。
  相信测试同学对上面的金字塔并不陌生,这不就是对产品开发不同阶段所对应的测试么!我们需要规范的来做单元测试同样需要相应的单元测试框架,如的、,的,的、等,几乎所有的主流语言,都会有其对应的单元测试框架。
  集成、接口测试对于不少测试新手来说不太容易理解,单元测试关注代码的实现逻辑,例如一个分支或一个循环的实现;那么集成、接口测试关注的一是个函数、类(方法)所提供的接口是否可靠。例如,我定义一个函数用于计算两个参数的结果并返回,那么我需要调用并传参,并比较返回值是否两个参数相加。当然,接口测试也可以是的形式进行传递。例如,我们通过方式向服务器发送请求,那么我们发送的内容做为的一部分传递到服务器端。但比如&Web&service&技术对外提供的一个公共接口,需要通过soapUI&等工具对其进行测试。&
  UI层的自动化测试,这个大家应该再熟悉不过了,大部分测试人员的大部分工作都是对层的功能进行测试。例如,我们不断重复的对一个表单提交,结果查询等功能进行测试,我们可以通过相应的自动化测试工具来模拟这些操作,从而解放重复的劳动。层的自动化测试工具非常多,比较主流的是,、、等。
  为什么要画成一个金字塔形,则不是长方形&或倒三角形呢?&这是为了表示不同阶段所投入自动化测试的比例。如果一个产品从没有做单元测试与接口测试,只做层的自动化测试是不科学的,从而很难从本质上保证产品的质量。如果你妄图实现全面的层的自动化测试,那更是一个劳民伤财的举动,投入了大量人力时间,最终获得的收益可能会远远低于所支付的成本。因为越往上层,其维护成本越高。尤其是层的元素会时常的发生改变。所以,我们应该把更多的自动化测试放在单元测试与接口测试阶段进行。
  既然层的自动化测试这么劳民伤财,那我们只做单元测试与接口测试好了。因为不管什么样的产品,最终呈现给用户的是层。所以,测试人员应该更多的精力放在层。那么也正是因为测试人员在层投入大量的精力,所以,我们有必要通过自动化的方式帮助我们“部分解放”重复的劳动。
  在自动化测试中最怕的是变化,因为变化的直接结果就是导致测试用例的运行失败,那么就需要对自动化脚本进行维护;如何控制失败,降低维护成本对自化的成败至关重要。反过来讲,一份永远都运行成功的自动化测试用例是没有价值。&
  至于在金字塔中三种测试的比例要根据实际的项目需求来划分。在《测试之道》一书,对于产品,的投入为单元测试,为集成、接口测试,为层的自动化测试。
我为什么要做自动化测试?
  根据51testing的《中国软件测试从业人员调查报告》,手工测试占到的89%&,相对开发来说,测试的门槛底,薪资普遍较底,所要求的知识面虽然有一定广度,但缺乏深度。这是测试的普遍现状。
  正因为手功测试人门槛不高,使大量的毕业生,甚至是非专业人员涌入这个行业。从而增加了这个行业的激烈竞争。对于工作几年扔处于手工测试的人员来说都会有强列的危机感。由于工作的技术含量不高,薪资的涨幅遇到瓶颈,另一方面受到新进入者的威胁,同样的工作公司花招来的人就可以做,那么就不会花的招。
  好吧,这个问题不应该出现讨论技术的话题中,但他的确是大多测试人员不得不面对的一个问题。所以,从测试人员自身的发展来说,我其实非常需要通过自动化技术来增加自己有竞争力。当然,做到一定年限测试人员会选择转管理或其它岗位,这又是另一个话题了。
  从测试行业的发展来说,国内产品由于产品特点,世界级的产品不多,技术含量相对不高,质量要求相对要求不高,外包国外项目,测试人力成本低廉,所以需要大量的手工测试人员。
  所以,在不远的未来,我认为纯的工手测试人员的需求是递减,公司更需要更高技术能力的测试。质量需要测试,测试行为永远不会消失,但纯的手工测试人员是否消失是有可能的。
  好吧,你可以说测试多朝阳的行业,我纯属在危言耸听。不管未来如何,我们都需要提升自身的技能对吧!
什么项目适合做自动化测试?
  假如你已经决定要学习自动化测试了,如何学习是要面临的下一个问题?这个问题以被测试产品为出发点进行分析,假如你所学的技术不能得到应用(验证),将会使你的学习过程寸步难行。
  首先考考虑产品是否适合做自动化测试。这方法比较普遍的共识是从三个方面进行权衡。
  软件需求变动不频繁
  测试脚本的稳定性决定了自动化测试的维护成本。如果软件需求变动过于频繁,测试人员需要根据变动的需求来更新测试用例以及相关的测试脚本,而脚本的维护本身就是一个代码开发的过程,需要修改、调试,必要的时候还要修改自动化测试的框架,如果所花费的成本不低于利用其节省的测试成本,那么自动化测试便是失败的。
  项目中的某些模块相对稳定,而某些模块需求变动性很大。我们便可对相对稳定的模块进行自动化测试,而变动较大的仍是用手工测试。
  项目周期较长
由于自动化测试需求的确定、自动化测试框架的设计、测试脚本的编写与调试均需要相当长的时间来完成。这样的过程本身就是一个测试软件的开发过程,需要较长的时间来完成。如果项目的周期比较短,没有足够的时间去支持这样一个过程,那么自动化测试便成为笑谈。
  自动化测试脚本可重复使用
  自动化测试脚本的重复使用要从三个方面来考量,一方面所测试的项目之间是否很大的差异性(如C/S系统和系统的差异);所选择的测试工具是否适应这种差异;最后,测试人员是否有能力开发出适应这种差异的自动化测试框架。
选择什么工具进行自动化测试
  假如你已经确认了XX&项目适合做自动化测试,那么接下来你要做的就是选测试工具了。
  首先要先确认你所测试的产品是桌面程序()还是应用()。
  桌面程序的工具有:、&AutoRunner
  web应用的工具有:、AutoRunner、、、
  由于架构的诸多优势,早几年前大量架构的应用转为结构。从而也推动了开发与测试技术的发展。假如,被测试有产品是架构的,那么推荐,在自动化测试领域占到了一半的试用率。所以,足以说明在自动化领域强大,易用性等。学习主流的工具也可以使你获得更多的机会。市面上关于的书籍也非常丰富。当然,要想学好,你必须要掌握脚本语言。
  如果,被测产品是结构,那么推荐,为什么不是或其它工具?因为对应用支持很好,更重要的一点,它支持多语言的开发,真正的试用,你所要掌握的不仅仅是一个工具而已,你还需要学习一门语言。我为什么要选择?还要学一门语言,这无疑增加了我的学习成本。增加成本的同时,也增加的你的竞争力,而且,在这个过程中你不单单只是学会了一个自动化工具而已,你完全可以使用所学的语言去做更多的事情。
  好吧!假如你决定试用了之后,你又面临了一个新的问题,选择一门语言。是支持java、python、ruby、php、C#、JavaScript&。
  从语言易学性来讲,首选,
  从语言应用广度来讲,首选java、C#、php、
  从语言相关测试技术成度(及&资料)来讲:ruby&,python&,java
  或者你可以考虑整个技术团队主流用什么语言,然后选择相应的语言。
selenium&用前须知
  OK!经过上的过程,我相信你一定做出的相应的选择,如果你选择的是selenium&工具,那么接着往下阅读。
首选你在开始selenium之前,需要花一到两个月时间去学一门语言,这里是根据没有语言基础的同学而定的。我推荐ruby&,python&,java&任意一门语言来进行学习。
  当然,已经如果有很好的语言基础略过这个环节,或者你的丰富的java编程能力,那么学习python&可能只需要几天时间或更短。
  假如,你已经搞定了一门语言的基础,接下来你需要先了解selenium&,selenium&并不是单纯的一个工具,他是一组工具的集合,而且,他还有1.0与2.0之分,当然3.0也已经到来。
  selenium&也不是简单一个工具,而是由几个工具组成,每个工具都有其特点和应用场景。
selenium&IDE
  selenium&IDE&是嵌入到Firefox浏览器中的一个插件,实现简单的浏览器操作的录制与回放功能。那么什么情况下用到它呢?
  快速的创建bug重现脚本,在测试人员的测试过程中,发现了bug之后可以通过IDE将重现的步骤录制下来,以帮助开发人员更容易的重现bug。
  IDE录制的脚本可以可以转换成多种语言,从而帮助我们快速的开发脚本,关于这个功能后而用到时再详细介绍。
selenium&Grid
  Selenium&Grid是一种自动化的测试辅助工具,Grid通过利用现有的计算机基础设施,能加快Web-app的功能测试。利用Grid,可以很方便地同时在多台机器上和异构环境中并行运行多个测试事例。其特点为:
·&并行执行
·&通过一个主机统一控制用例在不同环境、不同浏览器下运行。
·&灵活添加变动测试机
selenium&RC
  selenium&RC&是selenium&家族的核心工具,selenium&RC&支持多种不同的语言编写自动化测试脚本,通过selenium&RC&的服务器作为代理服务器去访问应用从而达到测试的目的。
  selenium&RC&使用分Client&Libraries和selenium&Server,Client&Libraries库主要主要用于编写测试脚本,用来控制selenium&Server的库。
  Selenium&Server负责控制浏览器行为,总的来说,Selenium&Server主要包括3个部分:Launcher、Http&Proxy、Core。其中Selenium&Core是被Selenium&Server嵌入到浏览器页面中的。其实Selenium&Core就是一堆JS函数的集合,就是通过这些JS函数,我们才可以实现用程序对浏览器进行操作。Launcher用于启动浏览器,把selnium&Core加载到浏览器页面当中,并把浏览器的代理设置为Selenium&Server&的Http&Proxy。
selenium&2.0
  搞清了selenium&1.0&的家族关系,selenium&2.0&是把WebDriver&加入到了这个家族中;简单用公式表示为:
  selenium&2.0&=&selenium&1.0&+&WebDriver&
  需要强调的是,在selenium&2.0&中主推的是WebDriver&,WebDriver&是selenium&RC&的替代品,因为&selenium&为了向下兼容性,所以selenium&RC&并没有彻底抛弃,如果你使用selenium开发一个新自动化测试项目,强列推荐使用WebDriver&。那么selenium&RC&与webdriver&主要有什么区别呢?
  selenium&RC&在浏览器中运行JavaScript应用,使用浏览器内置的JavaScript&翻译器来翻译和执行selenese命令(selenese&是selenium命令集合)。
  WebDriver通过原生浏览器支持或者浏览器扩展直接控制浏览器。WebDriver针对各个浏览器而开发,取代了嵌入到被测Web应用中的JavaScript。与浏览器的紧密集成支持创建更高级的测试,避免了JavaScript安全模型导致的限制。除了来自浏览器厂商的支持,WebDriver还利用操作系统级的调用模拟用户输入。
  如果是新项目直接学习webdriver&就OK了,RC是过时技术。
selenium学习路线
  配置你的测试环境,真对你所学习语言,来配置你相应的selenium&测试环境。selenium&好比定义的语义---“问好”,假如你使用的是中文,为了表术问好,你的写法是“你好”,假如你使用的是英语,你的写法是“hello”。&所以,同样有语义在不同的语言下会有不同的写法(语法)。
&  接着你需要熟悉webdriver&API&,API就是selenium&所定义一方法,用于定位,操作页面上的各种元素。
  先学习元素的定位,selenium&提供了id、name、class&name、&tag&name、link&text、partial&link&text、&xpath、css、等定位方法。xpath和css&功能强大语法稍微复杂,在这其间你可能还需要了解更多的前端知识。xml&,javascript&等。
  定位元素的目的是为了操作元素,接就要学习各种元素有操作,输入框,下拉框,按钮点击,文件上传、下载,分页,对话框,警告框...等等。
  经过一段时间的学习,你可以游刃有余的模拟手工测试来操作页面上的各种元素了。接着你需要做的就是把这些“用例”组织起来,统一来跑。
  那么你需要做的就是学习并使用单元测试框架,单元测试框架本身就解决了用例的组织与运行。
  当你写了一些“测试用例”&之后,你会发现用例中有大量重复的操作,能不能写到一个单独的文件中,需要的时候调用这些操作?当然可以,运用你的编程能力来实现这一点将非常简单。然后,你又发现每个用例中都有一些数据,这些数据也是一样的,但如果变化了修改起来非常麻烦,你也可以把他写到一个单独的文件中进行读取。
  接着你又遇到了新的疑问,我写的脚本(用例)都是流水式的,我怎么知道用例运行失败还是成功。那么就需要在脚本中加一些验证与断言。
  接着你又有了更多的想法,单元测试框架的log太简陋了,能不能生成一张漂亮的测试报告出来。我能不能定时的来跑这个脚本。能不能把每一次跑脚本的测试结果直接发到我的邮箱。能不能......
  为解决这些问题,你不得不学习更多的编程技术,然后你的“测试结构”会功能越来越强大,越来越灵活。产生了一定的通用性和移植性。一个有模有样的自动化测试框架诞生了。
&  假如,有一天你不再做UI的自动化测试了,你会发现你去做单元测试&或接口测试基本没什么难度。开发个测试工具之类的也不在话下,感谢selenium&吧!顺便也感谢一下我吧!
TA的最新馆藏[转]&[转]&[转]&后使用快捷导航没有帐号?
UI自动化测试
查看: 701|
评论: 0|原作者: bawn
秉着想偷懒的原则和测试这块一直存在的诟病,空闲的时把苹果提供的UIAutomation研究了一番,心想这样就可以坐等APP自己跑完所有流程然后输出 carsh 报告。但是想象很丰满,现实很骨感,UiAutomation 并没有想象中那 ...
& &&& & & 秉着想偷懒的原则和测试这块一直存在的诟病,空闲的时把苹果提供的UIAutomation研究了一番,心想这样就可以坐等APP自己跑完所有流程然后输出 carsh 报告。但是想象很丰满,现实很骨感,UiAutomation 并没有想象中那么的完美。&基本介绍&? + I&打开Instruments,选择 UiAutomation,基本界面就是这样&功能区域介绍:① 开始、结束测试按钮,选择设备和项目菜单② JS脚本编辑区,Trace Log 和 Editor Log显示区③ 时间线④ 其他菜单页面⑤ 脚本或是Log选择菜单⑥ 自动生成JS脚本代码的开始、结束和停止按钮&看一个简单的测试例子,APP的界面上有一个UITextField,称之为A元素,Navigationbar有个rightItem,称之为B元素,点击rightItem会push到另一个VC&在④中选择一个空的脚本写入下列代码,对 JS 不了解的也不用当心,自动化测试的 JS 代码非常简单。&var target = UIATarget.localTarget(); var app = target.frontMostApp(); var window = app.mainWindow(); // 打印元素树 app.logElementTree();? + R跑一下,②区域应该会自动切换到Log界面&Log打印出来的是当前界面的元素(UIAElement)树,同层级的元素会被包含到数组中,模拟用户操作其实就是对元素的操作,那么获取到元素才是关键。logElementTree()这个函数非常有用,在页面切换的时候记得要再次调用,以便找到你想要的元素&补充脚本:var target = UIATarget.localTarget(); var app = target.frontMostApp(); var window = app.mainWindow();
app.logElementTree(); var textField = window.textFields()[0]; // 在 A 元素中输入122 textField.setValue("122"); // 停顿1秒 target.delay(1); // 获取 B 元素 var rightButton = window.navigationBar().buttons()['Button']; // 点击 B 元素 rightButton.tap();运行后的效果是:A 元素被输入了122的字符——&然后 B 元素被点击——&APP 进入了一个页面&代码解读:获取 A 元素:window.textFields()[0],界面上只有一个textField,那么当然是textFields数组的第一个元素&获取 B 元素:window.navigationBar().buttons()['Button'],由于 B 元素是在navigationBar上,所以需要先获取navigationBar,再从buttons数组中获取 B 元素,通过 B 元素name属性的值Button(默认值)获取。&元素的name值也可以手动设置,比如设置 A 元素的name值为textField,注意:不要设置元素的可访问性(isAccessibilityElement)为NO&或者用代码设置&self.aView.accessibilityLabel = @"textField";那么就可以通过下面这种方式获取&var textField = window.textFields()['textField'];关于元素的可执行方法,比如tap(),可以查看苹果的官方文档。&以及元素数组包括:1. buttons() 2. images() 3. scrollViews() 4. textFields() 5. Views() 6. segmentedControls() 7. sliders() 8. staticTexts() 9. switches() 10. tabBar() 11. tableViews() 12. textViews() 13. toolbar() 14. toolbars() 15. secureTextFields() // 加密的UITextField
...苹果另外也提供一个辅助检查功能,可以方便查看元素的信息打开设置(Settings)-- 通用(General)-- 辅助功能(Accessibility)-- 辅助功能检查器(Accessibility Inspector)&操作脚本录制&在④中创建一个新的脚本,在⑥中点击中间的红色按钮,代表开始录制用户操作并转换为JS代码,点击右侧的按钮,停止录制,点击左侧按钮,执行脚本。这时候你肯定在想,既然有这功能,还需要写什么脚本,真是这样吗?下面录制的一个同样的操作:点击 A 元素——&在键盘上输入112——&点击 B 元素&var target = UIATarget.localTarget();
target.frontMostApp().mainWindow().textFields()[0].textFields()[0].tap();
target.frontMostApp().keyboard().typeString("112");
target.frontMostApp().navigationBar().buttons()["Button"].tap();这种方式生成的代码会有个问题,在各个操作之间都不会生成停顿代码,也就是target.delay();。如果对于那种夸页面的复杂操作,这种方式录制的脚本,在重新执行的时候有可能会报错。&举个例子:点击一个按钮后present到另一个页面,然后在另一个界面上点击上面的textfield,那么大概的脚本应该是这样:&var target = UIATarget.localTarget();
target.frontMostApp().mainWindow().buttons()[0].tap();
target.frontMostApp().mainWindow().textFields()[0].tap();当执行到target.frontMostApp().mainWindow().textFields()[0].tap();这时候界面其实还处于前一个,那么获取textfield必然会有问题,所以如果遇到此类问题,不妨各个操作之间加入target.delay();试试。另外,缺少逻辑判断,比如当情况一点击这个按钮,情况二点击另一个。&所以想完全依靠这种方式,偷懒不用写脚本,基本上行不通。&常用操作&苹果官方API文档&屏幕点击&// 单击 UIATarget.localTarget().tap({x:100, y:200}); // 双击 UIATarget.localTarget().doubleTap({x:100, y:200}); // 双指点击 UIATarget.localTarget().twoFing**ap({x:100, y:200});缩放&// 放大 UIATarget.localTarget().pinchOpenFromToForDuration({x:20, y:200},{x:300, y:200},2); // 缩小 UIATarget.localTarget().pinchCloseFromToForDuration({x:20, y:200}, {x:300, y:200},2);拖拽与划动&// 拖拽 UIATarget.localTarget().pinchOpenFromToForDuration({x:20, y:200},{x:300, y:200},2); // 划动 UIATarget.localTarget().pinchCloseFromToForDuration({x:20, y:200}, {x:300, y:200},2);打印&UIALogger.logStart("xxx");
UIALogger.logFail("xxx");
UIALogger.logDebug("xxx");命令行执行&使用命令行的原因是,Instruments工具跑测试实在太慢了,命令如下&instruments -t /Applications/Xcode.app/Contents/Applications/Instruments.app/Contents/PlugIns/AutomationInstrument.xrplugin/Contents/Resources/Automation.tracetemplate -w "iPhone 5s (8.3 Simulator)" /Users/xxxx/Library/Developer/CoreSimulator/Devices/A35F991E-425E-4F41-B76C-B7C176A06C36/data/Containers/Data/Application/324E3D2F-A0BC-4E96-97DF-97E791AB10A8/xxxx.app -e UIASCRIPT /Users/xxxx/Desktop/untitled.js -e UIARESULTSPATH /Users/xxxx/Desktop/tmp/需要自行修改的部分&// 测试设备 -w "iPhone 5s (8.3 Simulator)" // 项目目录,如果目录中没有xxxx.app也没关系 /Users/xxxx/Library/Developer/CoreSimulator/Devices/A35F991E-425E-4F41-B76C-B7C176A06C36/data/Containers/Data/Application/324E3D2F-A0BC-4E96-97DF-97E791AB10A8/xxxx.app// 脚本目录 -e UIASCRIPT /Users/xxxx/Desktop/untitled.js// 测试报告输出目录
-e UIARESULTSPATH /Users/xxxx/Desktop/tmp/ 最后&之所以说 UiAutomation 并没有想象中那么的完美的原因有下面几点:&JS脚本调试较为麻烦&UiAutomation 目前存在不少bug,比如手动设置accessibilityLabel无效、莫名其妙的报错,再跑一次又好了&不够完善,比如不能判断一个button是否可用(对应enabled属性),UIAlterView无法手动处理(网上提供的方法都无效),多份JS脚本,不能设置完成之后自动跑下一份&输出的测试报告比较简单,只有简单的log和截图,截图的规则也不太清楚(可能有提供截图的API)&另外推荐一个开源的测试库tuneup_js,以及文档。&注意:提交项目的时候若遇到Error itms-90035错误请尝试去掉tuneup_js库。
刚表态过的朋友 ()
上一篇:下一篇:
广告位招租作为一名自动化测试工程师,你合格嘛? : 经理人分享
作为一名自动化测试工程师,你合格嘛?
这是一篇来自软件测试员的内容世界。
听说长得好看的都在做软件测试,测试界从不缺大神,比如张南(Google测试经理)、Lisa Crispin和Janet Gregory等等这些。在软件测试变的越来越重要的今天,自动化测试也在崭露头角。
那么,作为想在自动化测试方面大展宏图以及已经成文自动化测试工程师的你,那么以下的知识你究竟掌握了多少呢。
自动化测试框架及开发技术掌握
熟练掌握自动化测试框架的原理,和理论知识,以及在自动化测试框架基础上,完成对测试用例设计。自动化测试,不仅仅需要掌握UI界面测试,对一些开发知识:如JAVA/C++等开发语言,数据库知识掌握,代码结构等等技能往往会给自己的工作添彩。
测试用例维护
手工测试相较于自动化测试来说,针对大型项目,维护不方便。而对于,自动化测试来说,UI测试的难点就在于一旦有了变化,利用TestWriter可以对测试用例进行维护,一般来说,测试用例的维护量很大时,在维护上便有难度。
自动化测试工具的使用
业界流行的自动化测试工具有QTP,winrunner,TestWriter等,了解工具的特性并且掌握方法,结合项目对测试工具进行选择。自动化测试一般通过简单的方法,便可以实现简单自动化测试,比如:1.通过制脚本,录制/回放2.驱动脚本执行手写脚本。同时对测试用例、计划进行管理。
自动化测试实践
作为一名合格的自动化测试工程师,对测试员以及团队是否起到帮助,这是相当重要的一个素质。针对测试人员自动化测试方向,给予推荐建设性的建议。明确的分析开发测试的成本,在工作中,对手工测试和自动化测试做出合适的选择。
以下列出,微信,微博,QQ群,论坛,等交流方式。
&QQ群:领测老贺聊软件测试 微信公众号: 领测软件测试网新浪微博:领测软件测试喜马拉雅订阅频道:蜻蜓FM订阅频道:http://www.qingting.fm/#/vchannels/198184
苹果广播:搜索“领测老贺”
荔枝FM:FM1663127 领测老贺聊软件测试
& & & &目前暂定每周不定期更新,您的关注,转发,打赏就是我们坚持的动力!&&&&&
领测软件测试网&∣一个有逼格的软件测试网站
长按,识别二维码,加关注
加入领测老贺聊测试QQ群可扫描下面的二维码
(下载iPhone或Android应用“经理人分享”,一个只为职业精英人群提供优质知识服务的分享平台。不做单纯的资讯推送,致力于成为你的私人智库。)
作者:佚名
文章相关知识点
评论&&|&& 条评论

我要回帖

更多关于 滴滴快车抢单软件 的文章

 

随机推荐