• 1
  • 4
分享

1、引言

在撸码过程中,99.1%的大佬,都不敢说自己的撸出来的代码,是不需要debug的。

换句话说,码农在撸码过程中,最痛苦的,莫过于撸出来的代码,又…

20201216091132673.gif

为了能避坑,小鱼也是在撸码过程中,总结的一点避坑方法,

请各位大佬笑纳

2、避坑内容总结

2.1无法定位到元素

遇到问题:

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

解决方法:

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

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

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

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

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

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

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

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

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

 - 针对于9和8这两种情况,修改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、页面元素封装时候,定位方式一定要写对,否则报错

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

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

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

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

# -*- coding: utf-8 -*-
"""
@ auth : Carl_奕然
@ time : 2022-02-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_奕然
@ time : 2022-02-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_奕然
@ time : 2022-02-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标准错误,报错内容

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •       Prometheus      配置说明      在istio网格中,每个组件都会暴露一个提供metrics的endpoint。Prometheus可以从这些endpoints上抓取metrics(通过Prometheus配置文件来设置scraping,端口以及TLS等)。      为了采集整个网格的metrics,需要配置Prometheus scraping组件:控制面(istiod deployment)ingress和eg...
            0 0 1508
            分享
          •   第一,凭证测试用例的方式评估其品质,主要搜罗:  1)测试用例与需要规格剖析中需要条款的可追溯性,好比:咱们要求每一个需要条款至少有1个测试用例与之对于应。目的是为了评估测试的需要拆穿困绕率,以及合成需要爆发变更的时候,对于测试更正使命的影响水平。  2)测试用例有无清晰的期望服从。个别来说,测试用例的每一个实施步骤,都理当清晰形貌期望的服从,以保障测试职员可能与测试实际服从妨碍比力,并合成是否需要提交缺陷陈说,概况更正测试用例。  3)是否知足公司外部界说的测试用例模板。好比:每一个公司都可能界说了测试用例模板,好比界说了“测试规范”,要求每一个测试用例以及测试规范妨碍分割关联,并要求每...
            0 0 248
            分享
          •   TestCase系统简介:  TestCase系统是一款根据业务需要的轻量级测试用例管理系统,以Case管理为核心,以测试数据持久化,用例资产化,测试产出标准化来规划测试管理;使用标准用例模板输入输出,更有利于思维发散的脑图格式展现用例,通过高质量、可复用的公共case库提升case编写效率,降低新人指导成本;同时通过对外接口对接其他系统,关联JDTest质量管理系统-用例管理-自动化测试平台-持续交付流水线-缺陷管理等要素,生成多维度交叉的测试统计数据嵌入各阶段测试报告中,助您客观评估测试进度、产品质量,有效把控产品风险。  TestCase的优势  ·它支持业务条线,项目,系统,模块等...
            8 8 1955
            分享
          •   混沌工程的概念由Netflix最先提出,指“在分布式系统上进行实验的学科,目的是建立对系统承受生产环境中湍流条件能力的信心”。随着分布式系统的建设,单体应用迁移到分布式架构中,对系统的可靠性和容错性提出了更高的要求。为防止服务因为微小故障而产生雪崩效应,引发系统大面积崩溃,通过在分布式系统上进行受控实验,观察系统行为并及时发现问题,提升系统健壮程度。  Chaosblade是由阿里巴巴研发的开源混沌工程工具,用于模拟常见的故障场景。本文使用Ubuntu虚拟机和docker探索该工具的准备过程及部分常见故障的使用方法。  一、工具获取  Chaosblade工具有两种获取方法,可以从Gith...
            12 12 1707
            分享
          • 动态关联提取cookie业务场景:有时候下一个接口需要用到上一个接口的参数,我们必须按照业务逻辑进行动态关联。一般做接口测试时候,尤其碰到某个接口需要用到上一个接口的数据,那我们就需要用到提取器来提取我们需要的数据,然后为下一个接口所用,其实就是在动态关联的时候需要用到。一定要理清楚接口的业务逻辑搞清楚当前这个接口需要用到哪些接口的哪些数据?搞清楚你需要提取的数据,在哪里,是在body中,还是在响应头中?根据不同的返回格式,需要选择不同的提取器:json提取器边界提取器正则提取器Xpath提取器1.同一线程组里的请求之间进行动态关联多个http请求处于同一个线程组内,可以通过正则表达式提取数据...
            0 0 622
            分享
      • 51testing软件测试圈微信