POM设计模式踩坑经历

1、报错提示未找到元素。

报错信息:selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//*[@id="TANGRAM__PSP_11__footerULoginBtn"]"}
  (Session info: chrome=91.0.4472.164)

分析原因:元素定位没有错误,导致错误的是因为查找该元素代码在弹框页面还没有刷新出来之前就已经执行了。

解决方法:在这一个语句前面增加sleep等待时间,以便页面刷新完成之后再去执行查找元素的语句。

#增加sleep等待语句,等待3秒钟
sleep(3)
#待执行语句,如果不增加上面的等待语句就会出现找不到元素报错
self.click_(self.login_button_02)

 2、报错信息:TypeError: __init__() takes 2 positional arguments but 3 were given

错误代码:

#元素定位
    def locator(self,loc):
        ele = WebDriverWait(self.driver,10,0.5).until(EC.visibility_of_element_located(*loc))
        return ele

解决方法:

将不定长度的 *loc  改为 loc 即可解决问题。

3、报错信息:PytestCollectionWarning: cannot collect test class 'Test_login_case' because it has a __init__ constructor (from: test_cases/test_login.py)
    class Test_login_case(Login):

原因分析:pytest测试类中不能有构造方法,且继承的类中也不能没有    __init__  方法。

解决方法:

#错误代码:
class Base:
    # 虚构一个对象
    def __init__(self):
        driver = webdriver.Chrome()
    # 打开网站
    def visit(self, url):
        self.driver.get(url)



#改为:
class Base:
    # 虚构一个对象
    driver = webdriver.Chrome()
    
    # 打开网站
    def visit(self, url):
        self.driver.get(url)

4、报错信息:

=================================== ERRORS ====================================
________________ ERROR at setup of Test_login_case.test_login _________________

item = <Function test_login> 

    def pytest_runtest_setup(item):
    
>       remote_data = item.get_marker('remote_data')
E       AttributeError: 'Function' object has no attribute 'get_marker'

D:\Anaconda3\lib\site-packages\pytest_remotedata\plugin.py:64: AttributeError
============================== 1 error in 8.59s 

原因分析:

 原因是因为pytest_remotedata的版本问题,在网上查看相关资料发现在pytest3.x的版本是没有这个错误的,在pytest4.6.1时候改进了pytest之后出现这个问题,所以我们直接更新一下pytest_remotedata就可以了。

解决方法:

 进入cmd,输入升级命令:pip install -U pytest_remotedata

5、报错信息:

    print('datas_name',datas['username'])
TypeError: list indices must be integers or slices, not str
datas [{'case_name': 1, 'username': 'name_01', 'password': 'pwd_01'}, {'case_name': 2, 'username': 'name_02', 'password': 'pwd_02'}, {'case_name': 3, 'username': 'name_03', 'password': 'pwd_03'}]

#login_data.yaml文件内容
-
  case_name: 01
  username: name_01
  password: pwd_01

-
  case_name: 02
  username: name_02
  password: pwd_02

-
  case_name: 03
  username: name_03
  password: pwd_03

#load_yaml.py文件内容
import yaml


def load_yaml(path):
    with open(path, 'r', encoding='utf-8') as f:
        return yaml.load(f, Loader=yaml.FullLoader)


if __name__ == '__main__':
    datas = load_yaml('../data/login_data.yaml')
    print('datas',datas)
    print('datas_name',datas['username'])


#输出结果为:
    print('datas_name',datas['username'])
TypeError: list indices must be integers or slices, not str
datas [{'case_name': 1, 'username': 'name_01', 'password': 'pwd_01'}, {'case_name': 2, 'username': 'name_02', 'password': 'pwd_02'}, {'case_name': 3, 'username': 'name_03', 'password': 'pwd_03'}]

 原因分析:由于获取到的datas是一个列表,所以必须先定位字典在列表中的位置后再去字典中取值。

解决方法:使用for循环进行循环读取列表长度范围内的位置,在获取到位置后进行字典取值操作。

#修改load_yaml.py文件内容为,增加for循环读取列表位置:
import yaml


def load_yaml(path):
    with open(path, 'r', encoding='utf-8') as f:
        return yaml.load(f, Loader=yaml.FullLoader)


if __name__ == '__main__':
    datas = load_yaml('../data/login_data.yaml')
    print('datas',datas)
    for n in range(len(datas)):
        print('datas_name',datas[n]['username'])
        print('datas_name',datas[n]['password'])


#输出结果为:
datas [{'case_name': 1, 'username': 'name_01', 'password': 'pwd_01'}, {'case_name': 2, 'username': 'name_02', 'password': 'pwd_02'}, {'case_name': 3, 'username': 'name_03', 'password': 'pwd_03'}]
datas_name name_01
datas_name pwd_01
datas_name name_02
datas_name pwd_02
datas_name name_03
datas_name pwd_03

5、断言报错

'''
assert断言时可以通过取出页面元素的值和预计的值进行对比判断。
下面是取出元素中 text,title,url 的值
'''

# 获取text
def util_element_text(self, locate):
    return self.elements(locate).text

# 获取title
def util_element_title(self):
    return self.driver.title

# 获取url
def util_element_url(self):
    return self.driver.current_url

6、判断UI元素是否存在

'''
自定义一个方法,使用元素定位方法来进行断定,使用try...except...来判断存在则返回True,否则抛出异常返回False
'''
#1.在base共同方法中定义

# 元素定位
def elements(self, locate):
    # 显示等待
    ele = WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located(locate))
    # 隐式等待,定义全局等待时间
    # ele = self.driver.implicity_wait(10)

    return ele

    # return self.driver.find_element(*ele)

# 判断元素是否存在
def isElementsExitst(self,locate):
    try:
        self.elements(locate)
        return True
    except:
        return False


#2.在用例中进行判断(PS:一般用在断言校验中)

# 获取返回页面中的元素
mesg_01 = (By.XPATH, '//*[@id="TANGRAM__PSP_11__error"]')
mesg_02 = (By.XPATH, '//*[@id="s-top-username"]/span[2]')

# 判断页面元素为01是否存在,不存在则跳转到02
if self.isElementsExitst(mesg_01):
    mesg_01_01 = self.util_element_text(mesg_01)
    print('mesg_01_01', mesg_01_01)
    assert msg == mesg_01_01
else:
    mesg_02_02 = self.util_element_text(mesg_02)
    print('mesg_02_02', mesg_02_02)
    assert msg == mesg_02_02

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值