ui自动化_ui自动化测试 - CSDN
精华内容
参与话题
  • 得到功能测试的常规用例,查看是否可以进行自动化,要明确,自动化不是为了自动化自动化自动化是节省人力,主要做回归测试,如果变动性特别大,不建议做自动化,具体可查看其它文章“什么适合做自动化”,且有些...

    第一步:

    得到功能测试的常规用例,查看是否可以进行自动化,要明确,自动化不是为了自动化而自动化,自动化是节省人力,主要做回归测试,如果变动性特别大,不建议做自动化,具体可查看其它文章“什么适合做自动化”,且有些自动化要评判付出与收益比,如果付出很大,收益很小,这种也不值得做自动化

    第二步:

    确认可以做自动化,需要把用例转成自动化用例

    我关注的点:

    1. 自动化用例我会更注重,验证点,数据的准确性,ui的结果不单单只关注界面显示,为了数据准确性,我会从数据库中拿数据进行对比,或者是通过接口请求数据得到数据,
    2. 界面手工操作的,可用接口获取就用接口,如商品数据

    第三步:

    转成了自动化用例后,我们要合适自己部门的工具,工具选型, 我工具选取几个要点:

    1. 适合项目组成员能力
    2. 扩展性强
    3. 易维护和推广
    4. 帮助文档尽量多的

    目前在考虑是否使用airetest或rbotoframework工具,这块需要调研

    第四步:

    脚本编写,把自动化用例转成脚本 我关注的点: 1.ui框架的模式,关键字驱动,数据驱动,混合驱动等 2.代码要注意封装,使用PO模式,减少冗余 3.考虑脚本的扩展性

    第五步:

    验收,我关注的点:

    1. 是否达到了预期效果
    2. 脚本稳定性
    3. 脚本的运行速度
    4. 脚本准确性

    第六步:

    持续集成,集成方式有很多,目前使用多点的是使用Jenkins 我关注的点: 1. 定时的构建 1. 构建时会触发其他内容 1. 编译的日志

    第七步:

    消息通知 我关注的点: 1.结果的及时通知,如公司用到的一些聊天工具,是否可及时发送内容

    第八步:

    维护阶段,出现问题能快速定位,ui自动化就存在维护成本高的风险

     

    转载于:https://www.cnblogs.com/chongyou/p/10821445.html

    展开全文
  • WEB UI自动化框架设计

    千次阅读 2018-11-05 13:30:35
    1、框架简介 1、1 框架设计思想 本框架是由selenium+testng+java+maven编写的数据驱动框架,对于用例的开放设计性比较强,分离了页面元素、页面元素操作、用例和检查点,也就是说,每个页面的元素、操作、检查点...

    1、框架简介

    1、1 框架设计思想

            本框架是由selenium+testng+java+maven编写的数据驱动框架,对于用例的开放设计性比较强,分离了页面元素、页面元素操作、用例和检查点,也就是说,每个页面的元素、操作、检查点单独封装了,之后在用例中用到什么操作都可以调用之前写的。

            对于测试数据,是单独保存在excel文件中的,同一个功能有正向和逆向测试,只要把测试数据保存在excel中,多种逆向可能性都可以列出来,包括检查的数据,程序会一一读取,并反馈检查点是否正确,这就避开了每个正向或逆向测试都要写一遍用例的麻烦。

            对于失败的用例,我在监听器中加入了失败用例重跑功能,可设置重跑次数。因为有的时候用例的失败可能并不是出现bug,也许是网络原因或其他原因,可以再跑一次验证结果。

            对于测试结果,我这里有保存log日志,可查看每个用例都做了哪些操作,用了什么数据、检查点等,最后运行是否正确都有记录,同时还有testng的运行结果,里面统计了运行成功和失败的用例。还改写和report,使运行失败的用例截图放在运行结果中,以便查看问题。更值得一提的是,框架里加入了发送邮件功能,可以配置邮箱数据,待程序运行完成后吧带截图的结果发送到指定的邮箱。

    2、utils封装

    2、1 从txt文件读取配置数据

            Txt文件放置一些配置数据,保存在config文件夹下,内容格式如:name=lily。

    目前放置的是驱动的路径和

     

    2、2选择操作系统和浏览器

        封装了选择操作系统和浏览器的方法,浏览器在xml文件中定义,操作系统由代码获取。

     

    2.3日志获取和保存

           日志方法用到的插件是log4j,方法主要是配置日志输出格式和路径,调用时先初始化

    static Logger logger = Logger.getLogger(BaseParpares.class.getName());

     

    2.4从excel文件读取测试数据

           传参为文件名和sheet(用例名),返回的是参数值数组,具体可查看testng的@DataProvider。这里读取数据的时候,如果有多行会一并读取,每行都是一条测试用例。

     

    2.5 获取随机数

     

    2.6 连接数据库

     

    2.7 获取用例描述

     

    3、selenium常用操作封装

           Seleniumutils,按不同功能分了好几个类,封装同类功能各种操作方法,其中Browser是对浏览器操作的封装,包含了driver的定义,由于所有的操作都需要driver,其他的类都需要继承Browser,不会出现no session的情况。

     

    4、BaseParpares

           基本数据和设置,所有的用例都从这里开始,继承这个类的数据,写了beforeclass和afterclass的操作,每个用例的class执行前后都会执行这两个方法。还有@BeforeMethod和@AfterMethod,每个用例@Test执行前后都会执行这两个方法。以及每个用例用到的数据提供者配置,获取到用例的包和用例编码,对应excel文件的文件名和sheet名。以及获取用例名称、路径、classpath等的方法。

     

    5、用例设置

           用例的设置包括三大块,pages、pagehandlers、testcases。

    Pages:是每个页面的元素,调用org.openqa.selenium.By ,定义元素定位,如:

    public static final By L_LOGIN = By.id("login_frame");

    之后在pagehandlers中被调用。

    Pagehandlers:是每个页面的功能和检查点封装。注意检查点不需要异常处理,且调用检查方法时用Assert.assertTrue();因为其他地基本方都做了异常处理,如果这个也用异常处理的话整个用例就不会停止也不会失败,报错后会一直运行,增加了不必要的等待时间。

    Testcases:就是测试用例,调用pagehandlers的功能组合成用例。每个类都需要继承BaseParpares 。@Test的时候加入测试数据的读取@Test(dataProvider="testData") ,这样才能读取到对应的测试数据。这里读取数据的时候,如果有多行会一并读取,每行都是一条测试用例。所以要把用例先封装好,把测试数据作为方法的参数一并读取,再用@Test(dataProvider="testData") 获取excel数据同时传给一个用例。

     

    6、监听器

    TestResultListener:用例失败之后截图,通过重写testng的监听方法,需要导入org.testng.TestListenerAdapter;继承TestListenerAdapter。重写onTestFailure,加入截图的功能。同时加入了onTestStart、onTestSuccess等,onTestStart与base中的BeforeMethod有点重复,视情况重写。

    这个监听器可放在BaseParpares,因为每个用例的类都继承了BaseParpares,放置方法@Listeners({TestResultListener.class})

           RetryListener:是重跑失败的测试用例。通过implements IAnnotationTransformer写了新接口,implements 是实现多个接口, 接口的方法一般为空的, 必须重写才能使用,还需要加载配置文件config.properties。

           EmailableReporterListener:是运行完成后获取结果并发送到指定邮箱的监听器,重写了testng的EmailableReporter2,单独谢了发送邮件功能在这里调用,在testng套件里无论哪一级调用都得不到最终结果,所以最终选择在reporter调用,源码查看org.testng.reporters. EmailableReporter2。

    监听器都配置在testng.xml文件中,才可以加载。

        <listeners>

            <listener class-name="com.test.listener.RetryListener" />

            <listener class-name="com.test.listener.TestResultListener" />      

            <listener class-name="com.test.listener.EmailableReporterListener"/>

        </listeners>

     

    以上就是对于框架的介绍,代码我就不贴出来了,前面的博客有记录testng的一些扩展功能,博客上文提的失败用例截图,发送邮件等等,有兴趣可以看看

    展开全文
  • 聊聊UI自动化

    万次阅读 多人点赞 2017-02-14 11:17:06
    学习做自动化的同学一开始都是偏向于UI自动化,自己这些时间也写过很多:python的,Java的,以及RF关键字驱动的。。。 今天就说下UI自动化的一些东西吧,希望对大家有些帮助,少走些弯路。测试生命中三大幻觉: 今天...

    学习做自动化的同学一开始都是偏向于UI自动化,自己这些时间也写过很多:python的,Java的,以及RF关键字驱动的。。。
    今天就说下UI自动化的一些东西吧,希望对大家有些帮助,少走些弯路。

    测试生命中三大幻觉:

    • 今天能发布
    • 明天能发布
    • UI自动化实现了,测试就可以不用测了

    正是第三点赋予了UI自动化测试错误的价值。让UI自动化测试验证UI, 利用图片比较去做自动验证,甚至利用截图定位按钮。真是找死的节奏呀。

    UI自动化应该做的事情是什么呢?

    1. 验证逻辑而非UI

    UI的验证会引入大量的不稳定因素。换句话说,像当年的测试大牛段念说的,你跑过了UI自动化,你就相信没问题了吗?不会相信,原因是啥?因为聪明的你会发现,你验证的东西越多,例如界面的每个按钮,颜色,排布,互联网应用变化最大的就是UI, 你的用例就越不稳定,所以你最终肯定不会验证全部UI。那结果就是”然并卵”了, 你根本不会相信这个用例真的通过了。因此给大家定个UI自动化能做的,验证逻辑(另外一种说法,说这种叫功能自动化)。什么叫验证逻辑?例如验证qq是否登录成功,验证到了好友列表,就是登录成功,甚至有登录成功的日志都可以,怎么稳定怎么行。

    2. 代替大量的UI重复操作

    简单来说就是UI自动化你要投入5元,只是执行4次,每次赚5毛的话,那你还亏3元的问题。什么时候会大量呢?像手机apk, 编译百个市场的包,每个包要验证核心功能。或者像性能UI自动化监控,同一个用例为了多次采样,也会执行多次。还有每日构建,集成,都可以。关键点就是用次数来增加价值,UI自动化能帮你确保不出死人的问题,如登录不了,登录了又卡死,或者是监控UI之外的其他,如性能。这些都有机会让其价值高于成本的。

    最大难点:维护

    无间道: 出来混,迟早要还的。 这句话,最好用来说明,为什么自动化测试构造得越快越随便,未来的维护成本也就越大。更甚者,脚本依赖录制得来的,这是找死的节奏。 无数的故事告诉我,很多UI自动化都是死在一开始就写或者录一堆脚本,结果每天都要花大量时间排查错误,错误有脚本错误,有功能的变更,有bug,甚至问题是随机出现的,但是无论你的问题或者是功能的问题,反正你排查错误的时间是花进去了,哪怕你不用改脚本。

    所以这里看来,要解决维护的难点,终极招数就是不要碰UI自动化。其实很多大牛都是说不要做UI自动化的,或者这个事情不是最高优先级,但是现实是,大家都做了,优先级还不低。所以当然不说不做了,要做就只能要狠狠地干一场,要成功,不要失败。

    记得有句话是这样的:如果你不喜欢做一件事,那么就去努力的做好它。下面给大家有两点建议,一是策略,二是技术

    策略上:维护成本的控制,脚本要慢慢上,先做核心的BVT,人均维护的脚本1~2个,定目标,如稳定运营1个月,后面增加的脚本要在测试环境稳定跑上一周,才能切换到正式环境。 组织培训,知识分享,分享写自动化遇到的坑,沉淀最佳的实践,让大家知道写UI自动化也是在自我提升,而不是简单的工作任务。

    技术上:降低维护成本的方法如下

    • 脚本里不要有坐标,图像识别这些,想都别想,想都别想,想都别想!这些都是不稳定的因素。

    • 脚本里不要有sleep。sleep就是UI自动化的稳定性的克星,绝对不能有。一方面,如果帮助建立或者直接使用UI自动化测试等待界面稳定的阻塞方法,例如waitForIdle,等待控件出现和消失的方法,如waitForInvisiable之类的。另外一种,就是封装一个timeout的类,里面包含重试和sleep的策略,让脚本直接使用。反正,不要单单看到sleep。

    • 要用脚本要基于面向对象。脚本不需要编译,调试方便,学习门槛低,像python,能使用的库也丰富。所以自动化测试最佳的使用Python,再配合pydev、pycharm,用起来还是很舒服的。而说到面向对象,它有个作用,就是通过隔离变化来提升代码的可维护性。说多了,可能你都不明白,
      我举个例子来说说, 用了面向对象的UI自动化脚本的样子(python的哈)。
      app = Application("XYD")
      loginPanel = app.launch()
      buddylistPanel = loginPanel.login("18223292304","123456")
      aioPanel = buddylistPanel.findAndOpenAIO("18223292304")
      aioPanel.sendMsg("hi")
      好,这个伪脚本,有什么特点呢?对,没有见到控件。控件要封装到界面类里面(RF所说的关键字)。具体一下说,自动化脚本的隔离变化基本上可以分四个层次:
      a. 用例逻辑,通常有个用于继承的TestCaseBase, 用来封装用例的逻辑,类似teardown, setup,run之类。
      b. 业务逻辑,通常就是继承TestCaseBase,用例实现的本身。封装业务逻辑的变化。
      c. 界面逻辑,通常就是界面类,例如上面的LoginPanel。隔离了控件与业务逻辑,让控件位置,ID的变化,可以控制在界面类中。
      d. 控件驱动,通常就是基本的获取控件树,检索控件。封装控件获取方式。

    • 控件定位要用类似XPath的方式。这种方式的好处就是方便阅读,把复杂的位置描述封装到一条短短的字符串里面了。(有些朋友误会了,是XPATH,是类似XPATH的东西,但是要把他比较复杂的部分去掉,只支持属性,节点的简单定位就行。不然跟正则表达式一样,又是一对学习成本了)

    • 通过分Step的脚本化繁为简。UI自动化脚本都有个特色。长~!一个脚本通常我们希望验证好几点,登录,打开聊天窗口就不容易了,因此除了验证发消息,我们还希望可以发图,发表情,那么这个时候,最好可以把用例分割成几个Step。出了问题,就集中排查某个Step的日志就OK了。补充一下,大家肯定想个一个问题,每个用例都要独立的,要互不影响,重新登录,为了稳定,多补点时间我不在意,但是现实你有发现这些时间会增加用例出错之后的修复,验证的时间成本。所以“分Step”无疑意思是给大家一个合并用例来提升用例执行速度,但是又不影响用例与用例之间的独立性。这个也是为什么我提出数据分离,模块化脚本的原因,可能一开始大家会很痛苦,越写就会发现越简单。。。

    • 不要再给UI操作/验证本身压力了。例如输入文本这些操作,也没有必要用键盘事件来触发,如果你是注入方式的,获取到控件对象,直接setText吧,这样会稳定很多。还有端到端的UI自动化,如QQ发消息到另外一端的QQ的测试,我们就可以利用网络协议,发送消息,另外一端用UI验证接收消息。

    • 定时重启手机和电脑,出错的用例再跑一次,可能会帮助回避一些问题,可以做,但是不能以此来麻木自己对错误的敏感的感觉。

    • 稳定你的环境,这些环境包括网络,系统,账号资源,电脑/手机。
      a.网络, 假如我们的UI自动化是验证功能逻辑的,那网络就一定要被牢牢地控制,独立的路由器,并且监控着网络情况,如果存在严重的丢包和断连,这信息一定要及时同步出来,甚至可以自动控制你的用例,在网络差时暂停,网络回复后再跑。
      b. 系统, 系统经常有各种更新的弹窗,特别是IOS。利用网络,屏蔽这些无用的推送把。android则是找个稳定的ROM。
      c. 账号资源,有很多软件账号资源都是不能重用的,或者重用了之后,用例之间会相互影响。这里需要有账号资源池的概念,类似SVN, 通过CGI, 来取了资源,可以加锁,还回去,再解锁。
      d. 手机与电脑,肯定不能长时间运行,不然他们也会发脾气。所以定期重启手机和电脑,似乎是必不可少的一步。

    UI自动化测试的未来

    有很多人问, UI自动化应不应该投入,有没有前途?这个问题没有绝对的,要看项目的类型,像做Android手机的,因为项目相对来说比较稳定,CTS本身就有一定的用例量,几千个UI自动化测试,都能维护过来,而且通过率极高。做前端应用的,像我们PC QQ,开发在控件唯一标识的问题上,给予了不少支持,因此用例的量和稳定性也是非常高。说虚一点的,如果这个事情至上而下都是支持的,想做的,投入的方向没有错,价值认识正确,肯定是有积极的产出的。另外,UI自动化是测试生来无法回避的一种能力,可以不依赖他,但是你需要他。

    That’s all:
    UI自动化是一种能力,常常无法回避。
    UI自动化会给人幻觉,要看清现实与价值。
    UI自动化最适合一句话,喜欢是放肆,爱是克制。而克制是UI自动化能发挥作用的关键。

    展开全文
  • Web UI 自动化测试方案(超级干货)

    万次阅读 2018-09-03 20:39:51
    项目中符合自动化测试的部分有哪些?(目标和范围 scope, 准入准出标准) 稳定的需求点、变动较少的页面 每日构建后的测试验证 daily build 比较频繁的回归测试 需要在多平台上运行的相同测试案例、组合遍历型...

    项目讨论

    • 项目中符合自动化测试的部分有哪些?(目标和范围 scope, 准入准出标准)
      • 稳定的需求点、变动较少的页面
      • 每日构建后的测试验证 daily build
      • 比较频繁的回归测试
      • 需要在多平台上运行的相同测试案例、组合遍历型的测试、大量的重复任务
    • 自动化用例在整个项目的测试用例的覆盖率
      • 一般的要求 50% +
      • 重点的要求 80% +
      • 根据项目的具体要求,变动特别大的项目需要额外单独考虑覆盖率

    团队建设

    建立自动化测试的组,理想状态下有4个人员,测试开发、中高级自动化测试工程师、2个初级自动化工程师;非理想的情况下,可能只有一个人。

    • 测试开发:

      基础答案:自动化框架的建设,确定自动化框架的设计模式、第三方代码工具的封装、中间公共模块的设计和调用、测试用例、测试套件的管理和执行、测试报告和测试结果的输出(文件输出和邮件通知)

      可选高级:如果可能的话,需要搭建持续集成服务器(CI,Continuous Integration Server)的环境,进行持续交付和自动化的冒烟测试等。

      培训的任务,需要将设计的框架以及封装的驱动,对其他成员进行培训。

      有自动化方案的实施经验、有开发背景、以及持续集成的背景等。

    • 中高级自动化测试工程师:

      配合测试开发人员,实施测试框架的建设。主要负责中间公共模块的实现和实例化等,以及部分高难度和流程复杂的自动化用例脚本编写和调试等工作。

      有参与过自动化方案的建设、脚本编写经验丰富、会代码调试、懂Web测试等。

    • 初级自动化测试工程师:
      根据中间公共模块的设计,进行实例化公共模块、方法组合,实现自动化用例脚本的编写。
      有计算机编程思维、有代码经验、可以读懂脚本和HTML等。

    • 若只有我一个人:
      首先实现自动化用例的维护和执行。在这个基础上不断的抽取实现公共模块的设计以及测试报告的生成等工作。通过经验的积累,以及后续人员的补充,早日做好自动化框架的建设工作。

    • 在这里向大家推荐一个自动化学习群(672899761)

    技术方案

    Selenium WebDriver、Python(unittest) Java(JUnit)、CI Server

    技术方案:
    选择Python + Selenium 的技术方案。

    首先技术工具是免费的,Python的工具用PyCharm社区版,Selenium的WebDriver是开源工具。利用比较简洁的Python语言进行自动化测试,对于人员的学习成本来讲比较实用,学习时间短,有优势。

    另外Python自带的unittest单元测试框架可以很方便的实现自动化用例的设计和执行以及自动化用例套件的管理等任务。Python是纯面向对象的语言,后续也可以过渡到Java + Selenium进行更加丰富的自动化测试。
    此外,可以选择Jenkins作为持续集成服务器,配合Python+Selenium的方案进行自动化冒烟测试。

    源代码管理工具(VCS, version control system)

    选择SVN(git)作为代码的源代码管理工具。集成在PyCharm中的步骤如下

    1. 把代码放到SVN在本地签出(check out)的文件夹目录中,例如 D:\SVN\XXProject\Trunck
    2. 用PyCharm打开 刚刚部署的代码
    3. 选择PyCharm的 VCS|Enable VCS integration,选择 Subversion(svn) 或者 Git
    4. 右键项目文件的根目录,选择 Subversion | add to VCS
    5. 右键项目文件的根目录,或者选 VCS | Commit Directory...
    6. 每天打开代码后,首先 Subversion | update project

    硬件:
    硬件的要求不高,主要需要独立的测试环境。另外测试人员用的电脑最好是Windows桌面操作系统,需要安装Firefox浏览器,避免47.0的最新版本。测试人员最好也使用Chrome浏览器辅助进行Web元素的定位。

    Selenium 学习总结

    Selenium IDE (火狐的插件)

    1. Selenium IDE
      一个基于火狐浏览器的插件
      1. 录制(需要确保右上角的录制按钮是按下去的),为了我们熟悉Selenium WebDriver/ RC
      2. 保存和另存为测试用例
      3. 无论是否保存用例,都可以直接回放
        • 导出测试用例的对应的编程脚本
        1. C# Nunit WebDriver
        2. Java Junit / testNG WebDriver
        3. Python unittest WebDriver
        4. Ruby Test::Unit WebDriver
      4. 插入、编辑、删除命令
      5. 学习Selenium的WebDriver/ RC

    Python + Selenium WebDriver

    1. 搭建环境步骤
      a 安装 python3.x (windows xp 不支持 python3.5+)
      b 设置环境变量 path(安装时候也可以解决 勾上 add python.ext to path)
      c 安装Selenium 用pip命令安装 pip install -U selenium
      有无问题?
      1. 路径,pip可能定位不到,pip也可能定位到别的文件夹(perl)
        方案:cd c:\python34\scripts
      2. 外网ip问题。交换机的原因,局域网里面是同一个ip,造成安装超时
      3. 火狐的版本 46.0以及以下
      4. windows 7 x64以上的系统,需要用管理员模式运行cmd,否则会安装失败。
    2. 普通的使用
      定位方式
      by id, name, class_name, tag_name, css_selector, xpath, link_text, partial_link_text
      主要用的 是 id,name, css_selector, xpath, link_text

    Selenium 基本使用

    Python + Selenium 环境搭建

    1. 安装Python,3.x(3.4 3.5 3.6)
      注意:环境变量path
      需要添加 "C:\Python34;C:\Python34\Scripts;"到Path
      步骤:

      1. 右键 我的电脑 属性 | 高级系统设置 | 环境变量
      2. 系统变量 | Path 并 双击 | Ctrl+C | 编辑 | Ctrl+V
    2. 安装 Selenium
      cmd | pip install -U selenium

      -U = --upgrade 升级安装

      类似于linux命令
      command -x param
      容易出现的问题

      1. 环境变量
        cd C:\Python34\Scripts
        再安装
      2. 管理员权限
        右键 管理员方式运行

    WebDriver的基本使用

    1. 实例化一个WebDriver的对象(使用默认的火狐浏览器 v46或者以下)
      driver = webdriver.Firefox()

      注意,一定要写括号,代表实例化对象

    2. 打开网址
      driver.get("http://localhost/ranzhi/www")

    3. 查找元素
      用id : driver.find_element_by_id("account")
      用name: driver.find_element_by_name("password")
      用xpath css_selector
      对元素的操作
      clear()
      click()
      send_keys()

    4. 使用python的休眠,给浏览器留出时间加载页面
      sleep(2)

    5. 关闭退出火狐
      driver.quit()

    selenium WebDriver的进阶操作

    1. unittest 单元测试框架的使用

      验证:断言 self.assertEqual(expected, actual, msg)

      管理测试用例: 每一个以 test_ 开头的方法

      可以在自动化测试用例中忽略的部分:
       编号 名称 优先级 模块(项目) ## 忽略
      必须在自动化用例中强调的部分:
          前置条件    setUp()
          输入数据    
          步骤       test_ 开头的方法
          预期结果   test_ 开头的方法
          清理      tearDown()
      

      新增的一个知识点: 测试的初始化 以及 测试的结束

      setUpClass() 和 tearDownClass()

      注意 上述方法 与 setUp() 和 tearDown() 的调用顺序

    2. 定位方式的使用

      • css_selector

        方法调用:

        driver.find_element_by_css_selector("#langs > button")
        

        CSS的3种选择器:

        1. id: 使用#+id
        2. tag: 使用tag
        3. class: 使用.+class

        CSS selector的获取

        可以使用开发者工具,定位的元素,右键 | 复制 selector(复制CSS路径)

        • Chrome使用了相对路径 #langs > button
        • Firefox(firebug)使用了绝对路径 html.screen-desktop-wide.device-desktop body.m-user-login div.container div#login div.panel-head div.panel-actions div#langs.dropdown.open button.btn
      • class_name

        通过 class定位元素,必须保持 class唯一,否则定位会失败

        driver.find_element_by_class_name("btn")
        

    • link_text 和 partial_link_text

      • 文字选择正确就行了
    • xpath

      • chrome内核的开发者工具,复制的是相对的xpath
      • firefox内核的开发者工具(firebug),复制的绝对的xpath

    1. 特定的元素的处理

      • frame

        <iframe>
         <html>
             <head></head>
              <body>
                   <我们需要定位的元素>
              </body>
          </html>
        </iframe>
        

        上述代码中,我们需要定位的元素,处于 一个frame中:我们需要先切换到对应的frame中,然之操作,之后再退出

        ## 我们需要先切换到对应的frame中
        ## 切换frame
        driver.switch_to.frame("frame_name")
        ## 或者用保险的办法切换frame
        frame_element = driver.find_element_by_css_selector("#frame_id")
        driver.switch_to.frame(frame_element)
        ## 开始做定位操作
        ## <----------------->
        ## 结束做定位操作
        ## 切换frame必须成对的出现。
        ## 退出切换的frame到默认的网页html中
        driver.switch_to.default_content()
        

      • select

        select定位有个前提,元素标签必须是 select

        <select>
          
        </select>
        
        ## 部门是个 select 元素  <select></select>
        ## 需要3步骤:
        ##    1. 找到 select 的元素,赋值给变量 dept_select
        ##    2. 实例化 dept_select 为 Select()的对象 为 user_adding_dept
        ##    3. 调用 user_adding_dept 的方法 select_by_index()给元素赋值
        

        示例代码

        # 找到 select 的元素,赋值给变量 dept_select
        dept_select = driver.find_element_by_id("dept")
        
        # 实例化 dept_select 为 Select()的对象 为 user_adding_dept
        user_adding_dept = Select(dept_select)
        
        # 调用 user_adding_dept 的方法 select_by_index()给元素赋值
        user_adding_dept.select_by_index(2)
        
      • 清除 cookie

        在打开浏览器的时候,需要清理cookie。

        from selenium import webdriver
        
        driver = webdriver.Firefox()
        driver.delete_all_cookies()
        driver.get("...")
        

    数据驱动的方式编写用例

    主要有两种形式进行数据驱动

    数据驱动:用外部数据来驱动测试用例的执行

    • 数据库驱动:MySQL、Oracle、PostgreSQL、SQL Server

      import pymysql
      
      connect = pymysql.connect(host="xx", port=3306, user="root", passwd="xxx", db="xx")
      cur = connect.cursor()
      cur.execute("SELECT...")
      mysql_data = cur.fetchall()
      for row in mysql_data:
          # 进行测试
          # 使用字典类型
          data_to_test = {
            "key1": row[0],
            "key2": row[1]
          }
          
      cur.close()
      connect.close()
      

    • 数据文件驱动:csv文件最典型、xml文件、txt文件

      import csv
      
      csv_file = open("xxx.csv", "r", encoding="utf8")
      csv_data = csv.reader(csv_file)
      for row in csv_data:
          # 进行测试
          # 使用字典类型
          data_to_test = {
            "key1": row[0],
            "key2": row[1]
          }
      
      csv_file.close()
      

    • 需要掌握的知识点:

      1. python的字典类型 dict 类型
      2. python的读写文件
      3. python的读写数据库
      4. for循环
      5. 注意资源的释放
        1. 关闭数据库游标和连接
        2. 关闭文件

    模块化的方式编写用例

    需要将每个用例都需要用的公共的功能,抽取出来,放到一个公共类中,作为模块化

    1. 创建一个Python Package "common",在里面创建一个ranzhi_common.py文件,里面添加RanzhiCommon类

      • login() : 普通登录,默认用admin/123456登录
      • logout():退出系统
      • login_by_dict(user_to_login):使用字典类型的参数进行登录,user_to_login 是一个字典类型 dict
      • change_language(lang):zh_CN, en_US, zh_TW 切换语言,需要参数传递要切换的语言
      • select_app(app):crm, admin, oa, cash, team 选择App,需要传递选择 后台管理 | 客户管理 。。。
      • select_menu_for_admin(menu): organization 选择了后台管理以后,选择菜单 组织
      • add_user(user_to_add): 使用字典类型的参数进行添加
    2. 创建测试用例的类,比如 ranzhi_test_01.py ranzhi_test_02.py ranzhi_test_03.py... 在这些类中调用上面创建的类,一般会放到setUp() 中

      import unittest
      from common.ranzhi_common import RanzhiCommon
      
      class RanzhiTest01(unittest.TestCase):
          
          def setUp(self):
              ranzhi_common = RanzhiCommon()
              
          def test_xxx(self):
              ranzhi_common.login()
              ##....
      

    Selenium 自动化测试方案

    基础方案

    1. 使用unittest,主要是用 TestCase(测试用例)
    2. 使用模块化(基本的模块化,抽取公共模块)
    3. 使用数据驱动的方式(主要包括 数据库的形式 和文件读取 )
    4. 定制执行需要测试的用例,使用unittest,主要用的是TestSuite(测试套件)、和 TextTestRunner(文本测试运行器)[或者HTMLTestRunner]
    5. 生成测试报告(发送报告到指定邮箱)

     

     

    方案实现的具体步骤:

    1. 使用PyCharm创建新的PurePython项目

    2. 在项目中创建如下的文件夹(python package)

      • TestCase
      • Data
      • Common
      • TestRunner
      • Report
    3. 分别实现上述模块

      1. 在Data中存放数据,CSV文件,或者也可以放到数据中,使用数据驱动

        ## 使用csv文件
        csv.reader()
        ## 使用数据库(MySQL),可以参考www.imooc.com的python操作MySQL的视频
        cur.fetchall()
        

      2. 在Common中,创建测试公共模块,实现模块化的操作

        ## __init__(self, driver: webdriver.Firefox, base_url)
        self.common = RanzhiCommon(self.driver, self.base_url)
        

      3. 在TestCase创建自动化测试用例,注意使用unittest.TestCase

        def setUp()
        def tearDown()
        det test_xxx()
        

      4. 在TestRunner创建测试执行器和测试套件,使用unittest.TestSuiteHTMLTestRunner(第三方)

        test_suite = unittest.TestSuite()
        test_suite.addTest(RanzhiLogonTc01("test_xxx"))
        
        html_test_runner = HTMLTestRunner(stream=report_file, title="xxx", description="dddd")
        html_test_runner.run(test_suite)
        

      5. 在项目根目录创建main.py,作为测试项目的主入口,运行测试。

    4. 检查测试报告

    Selenium 可能遇到的问题

    有无问题?

    a <iframe> 
        f1 = find_element_by_css_selector(frame)
        switch_to.frame(f1)  
    b <select>
        s1 = find_element_by_css_selector(select)
        ss1 = Select(s1)
        ss1.select_by_index(0)
        ss1.select_by_value("人事部")
    c 编码问题 utf-8
    d 时间等待问题 sleep(5)
    

    单元测试框架
    unittest
    解决了什么问题?

    unittest.TestCase
        前置条件
        清理
        测试过程步骤
        断言 assertEqual(期望值, 实际结果, 错误提示)
        运行测试 test_开头的方法
    unittest.TestSuite
        addTest(xxx("test_batch_login"))
        自定义的添加测试用例,并执行
    unittest.TextTestRunner
        run(suite)
        执行创建并维护好的测试套件
        
    test_runner  test_suite  test_case
    测试运行器    测试套件     测试用例
    

    模块化操作

    面向对象的实践: 
    1. 编写一个类,类里面描述公共的方法
    2. 实例化这个类,调用这个类的方法
    有无问题?
    类的构造方法,需要传递 webdriver.Firefox()
        self.common = RanzhiCommon(self.browser, self.base_url)
    

    数据驱动测试
    读取csv,循环每一行数据进行操作
    读取MySQL,用例存到MySQL中

    1. 中文编码的问题。 
        # coding="utf-8"
        读csv的时候,添加 encoding='utf-8'
        csv.reader(open("xxx.csv", "r", -1, encoding="utf-8")
    2. 循环放到最外层
    3. 文件路径在控制台读取不到的问题,需要用绝对路径来指向文件
    

    封装WebDriver

    • 避免第三方代码的威胁,防止大批量修改测试用例
    • 节约人力的成本(如果封装以后,不需要每个自动化测试工程师都会WebDriver)
    • 标准化自动化用例的操作,只需要调用公共的标准模块就好。

    以上是我给大家整理的一个关于自动化的web ui的一个项目从开始到完成的方案 

    对这块有兴趣的同学可以加下我的一个测试学习交流群:672899761

    里面有大牛分享的自动化等测试技术和已经整理好的学习资料。欢迎加群交流哦!

     

    展开全文
  • Web UI自动化测试原理

    万次阅读 2013-12-10 16:26:38
    因为是转载文章 在此标明出处,以前有文章是转的没标明的请谅解,因为有些已经无法找到出处,或者与其它原因。 如有冒犯请联系本人,或删除,或标明出处。 因为好的文章,以前只想收藏,但连接有时候会失效,...
  • UI自动化的优势和劣势以及场景:

    千次阅读 2020-01-31 17:52:22
    自动化测试可以代替大量的手工机械重复性操作,测试工程师可以省下大量的时间来设计测试用例和新功能。 自动化测试可以大幅度提升回归测试的效率,非常适合敏捷开发。 自动化测试可以充分利用无人值守时间,来进行...
  • ui自动化设计思路

    千次阅读 2019-04-09 13:56:07
    小伙伴让我周末做技术分享,想着这是一件有意义的事情,便答应了下来,那就给大家讲讲ui自动化吧。这里会结合具体的代码给大家讲ui自动化一些理念,方案设计。 本文将探讨ui自动化设计思路,主要围绕以下方面展开...
  • APP-UI自动化

    2020-10-27 17:17:55
    allure2:可视报告框架,将测试结果以html的形式展示; pytest-allure-adaptor:pytest的插件,可以生成Allure需要的用于生成测试报告的数据 pytest+allure2可以 allure:正常下载安装,配置环境变量即可。...
  • 类似这种,系统多是添加、查询、编辑的,这种系统就不太适合做ui自动化,因为要写又臭又长的xpath。这种系统核心是数据,其后台实现其实就是各种查询接口。关键是数据正确。尤其是针对金融领域相关的系统,就应该用...
  • UI自动化:自己参考

    千次阅读 2019-08-02 07:46:35
    #encoding:utf-8 from selenium import webdriver import json ...from selenium.webdriver.support.ui import Select from selenium.webdriver import ActionChains driver= webdriver.Firefox() url="h...
  • UI自动化测试工具Airtest

    万次阅读 2018-08-09 16:57:35
    Airtest是网易出的基于图像识别和Poco控件识别的一款UI自动化测试工具。 两个关键点: 1、基于图像识别 Airtest可以通过屏幕截图的方式来获取我们想要操作的区域。例如对一些按钮进行测试时,我们可以不再写复杂...
  • web自动化测试终篇(28):总结我理解的ui自动化

    千次阅读 多人点赞 2019-05-04 23:05:13
    自动化测试最大的挑战就是需求的变化,而自动化脚本本身就需要修改、扩展、debug,去适应新的功能,如果投入产出比太低,那么自动化测试也失去了其价值和意义; 折中的做法是选择相对稳定的模块和功能进行自动化...
  • 分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!... 总体规则 所有模块设计均遵循POM(Page Object Model)结构,从上到下大体分为三层: ...用例层:编写测试用例代码的...
  • UI自动化测试,看看这篇文章再动手

    千次阅读 2017-07-11 11:25:18
    UI自动化测试作为测试人员的基本技能,拥有ROI(投入产出比)低、维护成本高、稳定性差等等特点。面对这些难题,本文以尝试寻找解决方案,希望对大家有用。  本文首先列举UI自动化过程中普遍会遇到的问题,...
  • iOS UI自动化测试

    千次阅读 2016-10-25 09:18:43
    转载地址:... ...随着移动互联网时代的蓬勃发展,移动终端的自动化测试也在业界日益活跃,总体来看在Android平台上的自动化工具和实践比较多,但是说到iOS平台无论从自动化工具的数量还是质
  • UI自动化一定要跨过这些坑

    千次阅读 2017-06-14 10:24:43
     UI自动化,在移动互联网时代的今天,一直都是在各大测试测试社区最为火爆的一个TOPIC。甚至在测试同行面前一提起自动化,大家就会自然而然的问:“恩,你们是用的什么框架?appium?还是robotium?”  其实在...
  • iOS自动化测试之UI自动化框架调研

    千次阅读 2017-07-05 09:07:54
    有哪些可用的UI自动化框架? 他们的区别在哪里? 我们是如何选择的? 条件1:支持移动端app自动化 从以上对比其实已经可以比较明确的帮助大家做出自己的选择,从我所在的团队来讲,我们主要做的是移动端的UI自动...
  • 本文由 玉刚说写作平台 提供写作赞助 原作者:却把清梅嗅 ... 版权声明:本文版权归微信公众号 玉刚说 所有,未经许可,不得以任何形式转载! 困境 ... 你在南方的艳阳里,手指纷飞;...接下来我将说到这种情况并非...
  • 小心!做UI自动化一定要跨过这些坑

    千次阅读 2017-03-28 09:21:49
    UI自动化一定要跨过这些坑**楚杰2017年03月24日一、引子UI自动化,在移动互联网时代的今天,一直都是在各大测试测试社区最为火爆的一个TOPIC。甚至在测试同行面前一提起自动化,大家就会自然而然的问:“恩,你们...
  • UI自动化框架分层

    千次阅读 2018-09-10 17:31:35
    项目以前的UI自动化大概是这样分层的 1.Common功能层:一些经常被调用的基本常用操作,用来完成某项具体的功能,与具体的业务无关。比如常用的封装:  --将元素定位方法重新封装 --封装上下左右滑动 eg: swipe...
1 2 3 4 5 ... 20
收藏数 259,147
精华内容 103,658
关键字:

ui自动化