有关pageobject中的黑名单问题_阶段6里面的数据驱动

pageobject提到的一个黑名单,有关代码如下:
import yaml
from appium.webdriver.webdriver import WebDriver
from selenium.webdriver.common.by import By

“”"
如果你使用find_element方法,当无法定位到元素的时候,代码会直接抛出异常,导致运行中断,这样就不符合黑名单处理的想法了。
因为黑名单中的元素是一系列可能出现的异常元素的集合,我们的设计思路就是在原本需要定位的元素无法找到的时候,再去黑名单列表中一个一个确认这些异常元素是否出现。
而使用find_elements的时候,不管是否找到,找到几个,都会如实返回而不是报错,这样就可以支持我们进行之后的处理。
如果没找到当前这个黑名单元素,那么就循环去找下一个黑名单中的元素,如果找到了,那么就进行之前设计好的操作(比如你代码中的click())

“”"
class BasePage:
_black_list = [(By.ID,“image_cancel”)]
_error_cont =0
_error_max=10
_params={}
def init(self,driver:WebDriver=None):
self._driver = driver

def find(self, by, locator=None):
    try:
        #承接元组或者非元组
        element = self._driver.find_elements(*by) if isinstance(by, tuple) else self._driver.find_element(by, locator)
        self._error_cont = 0
        return element
    except Exception as e:
        #如果没找到会陷入死循环
        self._error_cont +=1
        if self._error_cont >= self._error_max:
            raise e
        #取出弹框的元素,进行点击
        for black in self._black_list:
           elements = self._driver.find_elements(*black)
           if len(elements) > 0:
               elements[0].click()
               return self.find(by, locator)
        raise e

def send(self,value, by, locator=None):
    try:
        self.find(by, locator).send_keys(value)
        self._error_cont = 0
    except Exception as e:
        self._error_cont +=1
        if self._error_cont >= self._error_max:
            raise e
        """ 循环遍历,但是有个问题,如果弹窗没有的话就会陷入一直查找的死循环,因此需要设置一个错误次数, 这里要是没有的话len=0,就不会进入if语句中,
            就没有办法从for循环中出来"""
        for black in self._black_list:
           elements = self._driver.find_elements(*black)
           if len(elements) > 0:
               elements[0].click()
               return self.send(value, by, locator)
        raise e

def steps(self,path):
    with open(path,encoding="utf-8") as f:
        steps :list[dict] = yaml.safe_load(f)
        for step in steps:
            if 'by' in step.keys():
                element = self.find(step['by'],step['locator'])
            if 'action' in step.keys():
                if 'click' == step['action']:
                    element.click()
                if 'send' == step['action']:
                    content:str = step['value']
                    for param in self._params:
                        """self._params["value"] = value"""
                        content = content.replace("{%s}"%param, self._params[param])
                    self.send(content, step['by'], step['locator'])

其中有黑名单无限循环的问题,然后设置的几个变量,没有很明白是怎么无限循环出不来的,因为黑名单要不空,直接遍历就出来,要不就是黑名单总会遍历完然后再出来,怎么就死循环出不来还设置了参数 _error_cont =0 _error_max=10,有老师具体解答下吗,谢谢

如果黑名单内的元素找到了,但是没被成功关闭;就会死循环

黑名单里找不到元素,不是直接报错吗?怎么会死循环呢

这里你上面也说了,用的是find_elements方法,它是不会报错的,返回一个列表,没有找到就是空列表,所以后面才会去判断列表的长度,而通常这种找到的元素只会有一个

我懂你的意思了,就是弹框没被成功点击(elements[0].click()),会可能导致死循环,谢谢