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