在做自动化项目中,会出现很多错误和调试,所以在这里整理总结一下,具体如下:
这是最开始时,使用eclipse写python时遇到的一个问题,当时困扰了很久。
使用组合快捷键:Ctrl+Shift+E
eclipse默认切换编辑器,此快捷键导致。重新按此快捷键切换。
由于当初使用firefox火狐浏览器时,如果使用自动化脚本打开火狐,页面报错时需要调试,却发现已经安装的firebug等插件工具没有加载出来,这个需要在本地自定义配置文件,然后在启动webdriver时加载配置。
1.win+R,运行对话框会打开。
2.输入:firefox.exe -p
3.新建配置文件到文件夹
4.启动时将配置文件传入:
profileDir = r"D:\software\firefox\profile"
profile = webdriver.FirefoxProfile(profileDir)
driver = webdriver.Firefox(profile)
time.sleep(3)
这个问题是元素定位最多遇到的问题,大概是以下几种原因:
1.需要加载时间,加入sleep()休眠。
2.页面操作使得xpath发生了变化。
3.页面存在frame,需要切换到要定位元素的frame中才能正确定位。
刚开始写脚本的时候,一个很基础的问题。
原因是:class类中的方法没有编写完整,函数无效。
关于三种等待的方法。
1.WebDriverWait().until()显式等待
引用:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
2.driver.implicitly_wait()隐式等待
引用:
from selenium.webdriver.support.ui import WebDriverWait
3.time.sleep()
引用:
import time
备注:同时设置了隐性等待和显性等待,在其他操作中,隐性等待起决定性作用,在WebDriverWait..中显性等待起主要作用,但要注意的是:最长的等待时间取决于两者之间的大者
1.测试套件中,main()和discover方法中用例方法的执行顺序
答:按照 ASCII 码的从小到大的顺序来加载同一目录下测试文件
顺序:0~9,A~Z,a~z
文件夹名称~文件名称
2.discover执行测试目录下,执行各个测试文件夹的所有符合条件的测试用例
答:在各个目录下添加__init__.py 文件
刚开始接触测试报告HTMLTestRunner时,发现网上下载的版本是python2的版本,不兼容python3所以查了很多资料,对于下载的python2版本测试报告的一个改进步骤。
第94行,将import StringIO修改成import io
第539行,将self.outputBuffer = StringIO.StringIO()修改成self.outputBuffer= io.StringIO()
第631行,将print >> sys.stderr, ‘\nTime Elapsed: %s‘ %(self.stopTime-self.startTime)修改成print(sys.stderr, ‘\nTimeElapsed: %s‘ % (self.stopTime-self.startTime))
第642行,将if not rmap.has_key(cls):修改成if not cls in rmap:
第766行,将uo = o.decode(‘latin-1‘)修改成uo = e
第775行,将ue = e.decode(‘latin-1‘)修改成ue = e
第778行,将output = saxutils.escape(uo+ue),修改成output = saxutils.escape(str(uo)+str(ue)),
将上述几处改动,保存成功后,再将HTMLTestRunner.py放到C:\Python34\Lib目录中,检验是否加载成功,在Python IDLE 中输入 import HTMLTestRunner 若无报错,那么加载成功。
这个问题经常出现,而且出现时一脸懵逼完全不知道为什么会这样,仔细研究后发现:分析:我用dir函数来看导入模块的所有函数,发现的确是没有这个方法
原因:1.重名
2.循环引用
重名解决方案:
对于重名的问题,一般是由于文件夹包名、文件名、类名等,在引用时由于重名无法正确引用,
例如:文件夹包名为:common,文件夹中也有一个py文件叫common,此时引用时系统就无法判断是引用common文件夹下的文件,还是引用common文件下的class。所以要避免这样的重名,文件夹中不要有同样名称的文件。
循环引用解决方案:
对于循环引用,就像是在classA中引用了classB的方法,在classB中又引用了classA的方法,导致循环引用,在写ui自动化框架时如果没有考虑好基础方法的结构,就可能会遇到这个问题,解决方法如下:
方案01:
推迟引用方法在python中的导入,在需要引用时在方法内进行引用,某些情况下可以绕过错误。
例如:
import Module
def sFunction(arg):
from file.class imnport demo_def
方案02:
依旧是更改引用位置,例如放在这个py文件的最后面做引用
import Module
def test_1(arg):
pass
def test_2(arg):
pass
def test_3(arg):
pass
from file.class imnport demo_def
方案03:
重新设计方法、类的结构,例如我在UI自动化框架中,将引用第三方库的方法放在一起,引用自己写的基础方法的方法写在一起,将引用层级分清除,底层-方法层-逻辑层这样的层级来引用。
例如tools文件,里面是一些生成随机手机号码,生成文件路径这样的方法,是底层。
读取数据库、读取yaml文件,这样文件中可以引用tools库,是方法层。
登录、下单等业务逻辑的公共方法,可以引用方法层和底层中的方法,定义为逻辑层。
当把这些引用层级理顺后,循环引用的错误就很少会出现了。
分析:1.创建并使用了一个名称为:list的变量,变量名不能和公共类型名称重复。
2.列表的引用中,使用了()而不是[],使用了错误的取值方法。
分析:因为这个变量是浮点类型的,无法作为字符串直接切片,需要转换为str()类型
解决方案:
在v1.1.2版本无此问题,可以将ddt从v1.2修改为v1.1.2
pip install ddt==1.1.2