51Testing软件测试论坛

标题: 给你21个精囊,让你运营自动化更加得心应手! [打印本页]

作者: 草帽路飞UU    时间: 2022-9-5 16:40
标题: 给你21个精囊,让你运营自动化更加得心应手!
本帖最后由 草帽路飞UU 于 2022-9-5 16:41 编辑

1、引言  

在撸码过程中,99.1%的大佬,都不敢说自己的撸出来的代码,是不需要debug的。换句话说,码农在撸码过程中,最痛苦的,莫过于撸出来的代码,为了能避坑,小鱼也是在撸码过程中,总结的一点避坑方法,请各位大佬笑纳。

  2、避坑内容总结


  2.1无法定位到元素

  遇到问题:

  找不到元素,脚本报“NoSuchElementException:Unable to find element”,或"定位到了,不能操作,点击无效。

  解决方法:

  1)查看自己的“属性值”是否写正确

  2)元素的标签不唯一,默认找到第一个

  3)向上查看,元素是否在frame或iframe框架中

  4)查看元素是否在新打开的页面中,需要切换到新窗口

  5)换其它的定位方式:id/name/class name/tag name/link text/xpath/css selector

  6)检查元素属性是否是会变动的、是否是隐藏的

  7)添加等待时间sleep(),implicitly_wait(),WebDriverWait(driver, 10, 1).until(定位的元素, messages)

  8)查看标签的属性是否有“style=’display:none’->。元素不显示。属性改为block即可

  9)查看标签的属性是否有‘οnclick=return false’->。取消点击。属性改为false即可

  10)针对于后两种情况,修改js属性:

js=”document.getElementById(‘title‘).style.display=’block’”

driver.execute_script(js)


2.2 Indentation Error

  遇到问题:

  出现 Indentation Error


  解决方法:


  脚本代码对齐。




  2.3 PO设计模式类


  1、使用PO设计模式封装页面元素类,需要有初始化函数"init"。

  2、页面元素调用Page类时候,Page函数,后面括号的“self”不用写。


  3、Page的初始化包含(self,driver)两个元素,在页面封装类中,初始化中调用方式为:


Page.__init__(self,driver)

       4、页面元素封装时候,定位方式一定要写对,否则报错。
  定位方式是实现WebUI自动化的基础。


     5、在页面封装中,类的初始化使用如下样式:


def __init__(self,driver):
Page.__init__(self,driver)


6、类中定义变量,比如x=“hello”,调用时使用:self.x。


7、在testcase中调用已封装的并且实例化的类时,在testcase中定义函数,不需要写self。


# -*- coding: utf-8 -*-


"""


@ auth : carl_DJ


@ time : 2020-12-19


"""

def test_pmlogin(self):


  try:


driver = self.driver


pm = Login(driver)


pm.strat()


pm.login_home()


pm.login_username('admin')


pm.login_password('8888888')


pm.login_click()


time.sleep(2)


pm.quit()


except Exception as e:


logging.info(f"login in failed {e}")


pm.quit

2.4 页面封装类中没有已定义函数的问题


  2.4.1 提示没有该方法

  遇到问题:

  在调用baseView.py文件的公共方法,提示:没有该方法。


  解决方法:


  1.需要在baseView.py文件确认,是否已封装该方法。


  2.导入的包/模块是否正确。


2.4.2 没有定义好的函数


  遇到问题:

  提示在页面封装类中没有baseView.py文件中定义好的函数。


  解决方法:


  ①新建名字为module_baseView.pth文件,内容为“baseView.py文件”存放路径:例如(“E:\Progect”)。


  ② 进入python的安装目录,将文件放到python3\lib\sit-packages文件夹下。


  ③ 在测试用例中导入其他文件夹模块引入:import sys。


  ④ sys.path.append(“…”)。


  ⑤ from … import …




2.5 parater must be str


  遇到问题:

  出现”parater must be str“。


  原因:


  使用参数有问题。


  解决方法:


  ①在封装页面元素定位方式时,经常会会遇到二次定位。


  ② 第一次定位调用基础类的方法,第二次定位就正常写就行了。


  例如:


x=self.find_element(locu).find_element(By.ID,'locu')



2.6 继承


  继承,使我们减少代码冗余及代码高效的常用方式。

  子集继承父级(不是继承银子)


  老规矩,上例子:


"""


@ auth : carl_DJ


@ time : 2020-12-19


"""


def __init__(self,dirver):


Logger.__init__(self,'DJ')


self.log=self.getlog()


self.driver = driver


2.7 not all arguments curerted during string format


  遇到问题:

  打印输出时显示“not all arguments curerted during string format”

  原因:


  前后参数不对应。


  解决方法:


  调整前后参数,使其一致。




  2.8 读取文件转码错误


  遇到问题:

  读取txt文件的汉子和字符是,打印出一串编码,如下:

  (b’\xef\xbb\xbf\xe5\xa5\xbd\xe7\x9a\x84\r\n’)


  解决办法:


"""


@ auth : carl_DJ


@ time : 2020-12-19


"""


x = open("test.txt","rb")


y = x.readlines()


for i in y:


#追加utf8 格式


j = i.decode('utf-8')


print(j)


x.close()




2.9 str object is not callable



  遇到问题:

  出现"“str object is not callable”


  原因:


  使用定义的变量名字与内置模块名字相同。


  解决办法:


  修改定义变量名。




  2.10 开启多窗口无法定位到最后一个句柄


  遇到问题:

  开启多窗口,第一次得到的句柄列表为a=[1,2],第二次得到的句柄列表是b=[1,3,2],按照顺序排序,要切换到句柄3。


  解决方法:


  首先把a和b变成集合,再取b不同于a的元素:


c=list(set(b)-set(a))=[3]


然后再转换为列表赋值给变量c:


driver.switch_to.window(c[0])




2.11 Can not connect to the Service chromedriver


  遇到问题:

  提示 Can not connect to the Service chromedriver


  原因:


  chromedriver未被调用。


  解决方法:


  ①python根目录存放chromedriver。


  ②hrome版本号与chromedriver版本号 要匹配。


  ③chromedriver追加到环境变量(Path)。


  ④运行脚本调用chromedriver。


  ⑤Firewalls 允许chromedriver运行。




  2.12 文件路径配置


  读取数据文件,尽量使用参数化,即 调用os模块:

import os


data_dir = os.path.dirname(os.path.abspath(__file__))


file_path = os.path.join(data_dir,'data1.txt')




2.13 文件改名与复制


  python对文件进行"改名"和"复制":

#引入os模块


import os


data_dir = os.path.dirname(os.path.abspath(__file__))


old_file = os.path.join(data_dir,'data.txt')


new_file = os.path.join(data_dir,'new_data.txt')


#改名


os.rename(old_file,new_file)


#复制


os.system(f"copy {old_file},{new_file}")



2.14 调用脚本小技巧


  技巧一


  运行自动化脚本时,将鼠标放到屏幕中间或者下方,(有可能切换窗口时定位不到)。

  大量脚本运行,一般我们都是在后台运行。


  代码示例:


options = webdriver.ChromeOptions()


options.add_argument('headless')


driver = webdriver.Chrome(options=options)


技巧二


  cmd窗口,直接把结果写入文本:

#测试报告


python allrun.py >>replor.html


#log


nohup python my.py >> ../python/logfile/run.log 2>&1


参数说明

  nuhup:


  是no hang up的缩写,即不挂断运行。


  2>&1:


  0 表示stdin标准输入,用户键盘输入的内容。


  1 表示stdout标准输出,输出到显示屏的内容。


  2 表示stderr标准错误,报错内容。



















欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2