测试人社区

关于课上PO 企业微信实战base类find 封装代码逻辑的疑问

def find(self, locator, value: str = None):
        logging.info(locator)
        logging.info(value)
        element: WebElement
        try:
            element = self._driver.find_element(*locator) if isinstance(locator, tuple) else self._driver.find_element(
                locator, value)
            # if isinstance(locator, tuple):
            #     element =  self._driver.find_element(*locator)
            # else:
            #     element = self._driver.find_element(locator,value)
            # 找到之前 _error_num 归0
            self._error_num = 0
            # 隐式等待回复原来的等待,
            self._driver.implicitly_wait(10)
            return element
        except Exception as e:
            # 出现异常, 将隐式等待设置小一点,快速的处理弹框
            self._driver.implicitly_wait(1)
            # 判断异常处理次数
            if self._error_num > self._max_num:
                raise e
            self._error_num += 1
            # 处理黑名单里面的弹框
            for ele in self._black_list:
                logging.info(ele)
                elelist = self._driver.find_elements(*ele)
                if len(elelist) > 0:
                    elelist[0].click()
                    # 处理完弹框,再将去查找目标元素
                    return self.find(locator, value)

            raise e

我觉得应该将self._error_num = 0去掉,否则_error_num的值永远不会超过1,那么设置_max_num也没有意义了。
我理解代码逻辑是如果没有找到目标元素,就会进行一次黑名单遍历(for循环):

  1. 如果也没找到黑名单中的元素,直接执行最后一个raise e抛出异常,结束find()函数。
  2. 如果找到了黑名单中的元素,则点击处理,再调find()本身。再次执行try时,如果还是没有找到目标元素,则_error_num又恢复为0,再执行except,_error_num又变成1。如此循环_error_num只会是0和1。

如果没有找到黑名单元素,则会调用find方法,find方法去找目标元素的时候仍然没有找到,则会抛出异常,继续捕获-找黑名单-调用find。。。。就变成死循环了

try:
    element = self._driver.find_element(*locator) if isinstance(locator, tuple) else self._driver.find_element(locator, value)
    # 如果上面出现错误,就不会将错误次数归0
    self._error_num = 0
    return element
except Exception as e:
    ...

这个 try 里面的如果出现错误是会立马调到下面的 except 结构里的。我想这个应该没啥问题。

对的,这点我理解错了。。。