【发布时间】:2019-01-09 12:18:12
【问题描述】:
基于How to wait until the page is loaded with Selenium for Python? 的答案,我正在尝试创建一种方法,该方法允许使用预期条件轮询多个元素是否存在。
我在包含以下内容的行收到错误'bool' object is not callable:wait.until(any(expectations))。
考虑的过程是允许多个 Xpaths 作为预期条件传递,然后使用any(),以类似于此基于 java 的答案 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
【问题讨论】:
-
额外研究发现我可以执行节点联合并将 Xpath 地址与 |到一个 Xpath 中。 stackoverflow.com/questions/5350666/…。仍在研究解决方案。
标签: python selenium web-scraping expected-condition