以答案为基础如何使用 Selenium for Python 等待页面加载? https://stackoverflow.com/questions/26566799/how-to-wait-until-the-page-is-loaded-with-selenium-for-python#40037216我正在尝试创建一种方法,允许使用预期条件轮询多个元素是否存在。
我收到错误“bool”对象不可调用在包含以下内容的行上:wait.until(any(expectations))。
思考过程是允许许多 Xpath 按预期条件传递,然后使用any() https://docs.python.org/3/library/functions.html#any,以类似于这个基于java的答案的方式,尝试使用 selenium xpath 等待页面中的两个元素之一 https://stackoverflow.com/questions/45166181/trying-to-wait-for-one-of-two-elements-in-the-page-using-selenium-xpath,检查是否存在任何条件。
在这种情况下使用any()的正确方法是什么?或者更好的是,需要做什么才能使该方法发挥作用?
假设 Selenium .get('url') 已在调用此方法之前立即执行。
def wait_with_xpath_expectation(self, search_elements, timeout=6, max_attempts=3):
"""
Selenium wait for an element(s) designated by Xpath to become available in the DOM. Useful for javascript AJAXy
loading pages where content may be be rendered dynamically on the client side after page load appears complete.
search_elements may be one Xpath as a string or many as a list. This allows for any of multiple elements on a
page or pages to be determined to have loaded based on expectations.
:param search_elements: string or list (strings converted to lists), Xpath(s)
:param timeout: int, seconds
:param max_attempts: int, time to wait before giving up on page loading
:return: Boolean, True if page has loaded, False if all attempts have failed
"""
# Page is not loaded yet
loaded = False
# Initialize attempt count
attempt = 0
# If only one element has been passed, ensure it is encapsulated by a list
if type(search_elements) is str:
search_elements = [search_elements]
# Begin the polling loop
while attempt < max_attempts:
try:
while loaded is False:
# Create a list of expected elements using list comprehension
expectations = [EC.presence_of_element_located((By.XPATH, element)) for element in search_elements]
# Define wait
wait = WebDriverWait(self.browser, timeout)
# Execute
wait.until(any(expectations))
# Acknowledge load
loaded = True
print("Success: Page loaded based on expectations")
# Exit returning True for load
return loaded
except TimeoutException as e:
# Increment attempts
attempt += 1
# Check again if max attempts has not been exceeded
while attempt < max_attempts:
# Increase timeout by 20%
timeout *= .2
# Try again
continue
# Print an error if max attempts is exceeded
print("Error: Max load with expectations attempts exceeded,", e)
# Exit returning False for load
return loaded