近期想自己参照网上资料用selenium搭建一下UI自动化项目。期望达到的效果是:数据,元素,业务逻辑分离,并生成测试报告。这里记录下,整个过程中遇到的问题和解决办法。
前期:环境安装搭建可以参照:https://blog.csdn.net/TestingGDR/article/details/81950593
接下来创建项目,项目结构如图:
简单介绍下结构层级和作用,
commonbase:存放公用方法,和较底层的实现
config:存放配置文件,目前配置文件仅配置driver和测试地址。(后续考虑如何实现非手动修改配置而是动态读取配置)
pages:存放被测页面的控件定位和封装简单的测试动作
testcase:存放测试用例
data:存放测试数据,考虑读取excle,但是这个方法不好,此文件夹可以不要
log:存放运行log
report:存放生成的测试报告
screenshots:存放报错后的截图信息
问题记录:
问题:1:遇到无法呼起浏览器
解决方法:executable_path 需要直接指定出来,这个程序才能吊起浏览器
self.driver = webdriver.Chrome(executable_path ='C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe')
问题2:
try: XXXXXX
except NoSuchElementException,e:XXXXX 会报错
解决办法:NoSuchElementException 改为Exception 即可
问题3:AttributeError: 'testLogin' object has no attribute 'driver'
解决办法:需要在testLogin类里定义一下driver。我在类全局变量处加入driver =None,在setUpClass里加入testLogin().__init__()
问题4:使用unittest框架,执行时,未执行setUpClass,setUp,以及testcase,仅仅执行了main。
解决办法:必须在类内引入unittest,类名后的()内加入unittest.TestCase即可。
问题5:basepage完成后,我简单实现了下登录页面的测试case,同时基于pageObject的思想,对loginpage页面元素封装。遇到了一个问题一直找不页面元素,参照文档也正确使用了定位器,但是依旧找不到元素,后经高人指导,页面类继承基础类了,可以不使用定位器来指定根据什么找元素,直接传递元素id即可,如图。
问题6:在使用testcase调用browser类的方法时,报错:AttributeError: 'browser' object has no attribute 'driver',排查N久后,发现在browser类的open_browser方法中,实例化出来的driver是个私有变量,导致其他方法,如quit_browser不能使用。最后通过定义全局变量解决。
问题7:当我在框架中加入生成测试报告的部分时,发现不通过IDE,通过命令的方式来执行时。遇到找不到Section的问题,报错:configparser.NoSectionError: No section: 'browserType'
网络解释:configparser在python2.7和python3上要使用绝对路径,或者使用linux路径,我这里使用了linux的路径解决了,如图
问题8:遇到web页面的弹窗,使用chrom的工具识别,无法抓取到,导致后续用例无法执行
解决办法:增加以下代码解决
alert =self.driver.switch_to.alert
alert.accept()
至此:在考虑数据驱动和测试报告生成时,被安利了pytest单元测试框架,然后被它众多的插件吸引,因此在此框架基础上,替换pytest框架,当然pytest时兼容unittest用例的执行的,但是由于我这边case不多,所以就直接替换了。也省去了后面解决兼容性的一些问题。替换后大致组成如下:
python+pytest+page objects。
目录修改如图:
好吧,下面再看一篇文章,来记录下在网上挣扎着自学pytest测试框架的历程吧
参考文档:
https://blog.csdn.net/TestingGDR/article/details/81950593
https://blog.csdn.net/sinat_34817187/article/details/82018099