TestNG+Selenium

Easter79
• 阅读 554
  • 是一个开源自动化测试框架。其实类似于JUnit这种单元测试框架,但进行了一些功能扩展
  • 属于selenium?还是说TestNG是一个测试框架,它用到了selenium的web自动化测试的功能,比如使用浏览器对应的driver去进行操作,
  • 不一定要由RobotFramework触发
  • 参考
  • 使用
    • 可以使用多种语言,下面以java语言为例,使用Chrome+编写抓取页面的逻辑
    • 流程
      • 新建一个java项目,可以是gradle项目
      • 新建测试类,使用testng提供的一些注解如@Test,打包成jar包待用(需要包含依赖的jar包,比如自定义gradle task创建完整的jar包)
        • 貌似简单情况下有编译完的class文件即可?
      • 新建一个testng的xml配置文件,其中可以指定测试类包全路径、一些文件路径、变量、执行测试类中的所有方法还是指定方法等。比如打开页面后要输入的账号密码等,java代码中可以使用。
        • 如果xml中包含url之类的参数,如果其中有.等特殊字符,需要进行urlencode。如果有&等特殊字符,需要进行xml转义。
      • 使用java命令触发执行测试方法
        • 可以简单的使用java org.testng.TestNG testng.xml,其中第一个参数通常是固定的,表明使用testng执行测试;第二个参数是配置文件的名称
          • 这里其实是默认了testng的jar包、测试脚本的jar包或class文件、xml配置文件都在执行命令的cmd当前目录下
        • 比较复杂的情况下,如果这些文件不在同一目录下,可以使用java命令的-cp参数(其实就是-classpath参数)指定搜索testng的jar包、测试脚本的jar包的目录(可以多个,用:分隔,路径中可以使用*这种匹配符),xml配置文件可以直接在java命令中写上全路径
          • 如C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml
        • 通常作为一个进程启动,脚本(比如.sh脚本)结束前要把这个进程杀掉。
    • 如果是按分辨率抓取信息,那么通常在执行命令前要进行屏幕(浏览器?)分辨率的设置,即使java等语言的测试类代码中是根据页面元素id来抓取的
    • 最好去selenium官网下载驱动,并且查看驱动、浏览器、selenium三者之间的版本对应关系,一定要对应上
    • 不需要指定浏览器的目录,需要指定driver文件的路径(需要指定系统属性如:System.setProperty("webdriver.gecko.driver", "/mmm/SeleniumLib/geckodriver");)。
    • selenium提供了需要操作页面元素的方法,比如getElement之类的
      • 找到Element后,可以获取内容,可以填充文本,还可以调用click()方法去点击按钮
      • 和scrapy类似,用的也是xpath去找的html元素,可以在火狐上装xpath的测试插件辅助开发
    • 使用Selenium+chromedirver自动化操作Chrome
      • Ubuntu上有可能出于版本等原因无法使用Selenium+chromedriver自动化操作Chrome
      • 即使java代码中使用chromedriver启动Chrome时不使用AddParameter()添加--headless参数,也无法打开界面
      • 有时需要在启动Chrome时传入一些参数关闭sandbox(可以在java等语言的测试类代码中使用chromedriver启动chrome时设置),才能正常使用。
    • 使用Selenium+geckodriver自动化操作Firefox
      • 脚本需要有足够的权限(比如root),否则即使直接运行Firefox命令都会报错,报错信息通常是Connection Refused、Can't open display: :0之类乱七八糟的错误。
      • Firefox不像Chrome那样是通过参数自定义设置,而是通过Profile,每个Profile包含一系列用户的设置(是不是下面的代理弹窗问题,也可以使用Profile解决?虽然java代码中Profile类没有代理账号密码之类的字段,但是可以自己打开浏览器输入一次,然后导出profile,让selenium去读和使用?貌似没有设置账号密码的preference。。。。难道是signon.autologin.proxy!?)。
      • 特殊情况下,比如特殊的公司网络下,浏览器在访问网页时需要使用代理服务器(可能是固定的,也可能是pac脚本动态判断的),这是有可能代理服务器会让你输入域账户的账号密码。这个很难处理(不处理的话就卡在这里了,没发进一步操作页面),selenium和geckodriver只提供了配置代理服务器的方式、地址、端口的变量,并没有提供设置账号密码的地方。网上有人说就是不支持。然后以前有个close-proxy-authentication的火狐插件也已经下架不能用了。自己写脚本往弹窗里填充有点困难。。。不是一个html页面。。。要抓包看看了?
      • 因为公司的代理服务器做了认证的设置?
      • 尝试设置系统网络的自动完成功能?
      • Windows的话尝试使用Windows凭证?
      • 可以使用前面Profile的办法,找到prefs.js文件查看有没有手动在浏览器中设置的账号密码,有的话就用到代码中
      • 还有一个可能:火狐的代理设置页面的下面有一个选项“如果密码已保存,不提示身份验证(I)”,是不是勾选了就行了?即使selenium启动的火狐是一个全新的profile,也可以在prefs.js文件中找到相关的配置,配到代码中?
      • 终于解决了!!!!!!!!!!在全局的cmd的环境变量中添加代理的认证信息,export http_proxy_user=”” and export http_proxy_pass=””,有可能同时要使用保存的账号密码,有可能代理要用系统设置
点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Easter79 Easter79
2年前
swap空间的增减方法
(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Easter79 Easter79
2年前
Testng Retry失败用例重新运行的方法(一)
Testng是Java自动化测试的一个框架,它提供了一个对失败用例重新执行的监听器,即接口IRetryAnalyzer。先准备一个测试类:importorg.testng.annotations.Test;importstaticorg.testng.Assert.assertTrue;pu
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k