selenium.webdriver.support.wait.WebDriverWait
"""
参数
ignored_exceptions=None
"""
def until(self, method, message=''):
"""Calls the method provided with the driver as an argument until the
return value does not evaluate to ``False``.
:param method: callable(WebDriver)
:param message: optional message for :exc:`TimeoutException`
:returns: the result of the last call to `method`
:raises: :exc:`selenium.common.exceptions.TimeoutException` if timeout occurs
"""
screen = None
stacktrace = None
end_time = time.time() + self._timeout
while True:
try:
value = method(self._driver)
if value:
return value
except InvalidSelectorException as e:
raise e
except self._ignored_exceptions as exc:
screen = getattr(exc, 'screen', None)
stacktrace = getattr(exc, 'stacktrace', None)
time.sleep(self._poll)
if time.time() > end_time:
break
raise TimeoutException(message, screen, stacktrace)
ignored_exceptions:默认值是 NoSuchElementException,当存在此异常时,会忽略,直到达到设置的 timeout超时时间
这里有一个弊端,当达到超时时间后,会抛出 TimeoutException,并且message只能打印传入值,不会打印实际 NoSuchElementException的值,没有参考价值
运行日志:
Traceback (most recent call last):
File "D:web_keys_datadriverweb_keyskeys.py", line 106, in locate
return self.web_el_wait(name, value)
File "D:web_keys_datadriverweb_keyskeys.py", line 82, in web_el_wait
EC.visibility_of_element_located((name, value)), "web_el_wait方法定位元素异常:")
File "D:web_keys_datadriverweb_keysweb_wait.py", line 42, in until
raise TimeoutException(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message: web_el_wait方法定位元素异常:
Stacktrace:
可以重写WebDriverWait,代码如下
class WebDriverWaitExtend(WebDriverWait):
def __init__(self, driver, timeout, poll_frequency=POLL_FREQUENCY, ignored_exceptions=None):
super(WebDriverWaitExtend, self).__init__(driver, timeout, poll_frequency, ignored_exceptions)
def until(self, method, message=None):
"""Calls the method provided with the driver as an argument until the
return value does not evaluate to ``False``.
:param method: callable(WebDriver)
:param message: optional message for :exc:`TimeoutException`
:returns: the result of the last call to `method`
:raises: :exc:`selenium.common.exceptions.TimeoutException` if timeout occurs
"""
screen = None
stacktrace = None
end_time = time.time() + self._timeout
while True:
try:
value = method(self._driver)
if value:
return value
except InvalidSelectorException as e:
raise e
except self._ignored_exceptions as exc:
# screen = getattr(exc, 'screen', None)
# stacktrace = getattr(exc, 'stacktrace', None)
# 新增错误异常信息
message += getattr(exc, 'msg', None)
time.sleep(self._poll)
if time.time() > end_time:
break
raise TimeoutException(message, screen, stacktrace)
运行日志:
Traceback (most recent call last):
File "D:web_keys_datadriverweb_keyskeys.py", line 106, in locate
return self.web_el_wait(name, value)
File "D:web_keys_datadriverweb_keyskeys.py", line 82, in web_el_wait
EC.visibility_of_element_located((name, value)), "web_el_wait方法定位元素异常:")
File "D:web_keys_datadriverweb_keysweb_wait.py", line 42, in until
raise TimeoutException(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message: web_el_wait方法定位元素异常:Unable to locate element{"method""css selector","selector""[name="accounts1"]"}(Session infochrome=71.0.3578.
98)