3 回答
TA贡献1883条经验 获得超3个赞
WebDriverWait.until期望可调用对象。这是来自其来源的实际片段:
while True:
try:
value = method(self._driver)
if value:
return value
所有expected_contiditions 都是可调用对象。因此,在这种情况下,您需要编写它们,如下所示应该可以工作。
class composed_expected_conditions:
def __init__(self, expected_conditions):
self.expected_conditions = expected_conditions
def __call__(self, driver):
for expected_condition in self.expected_conditions:
if not expected_condition(driver):
return False
return True
并将其传递给until
conditions = [
expected_conditions.presence_of_element_located((By.CSS_SELECTOR, CSSSelector1_toWaitOn)),
expected_conditions.presence_of_element_located((By.CSS_SELECTOR, CSSSelector2_toWaitOn)),
expected_conditions.presence_of_element_located((By.CSS_SELECTOR, CSSSelector3_toWaitOn)),
expected_conditions.presence_of_element_located((By.CSS_SELECTOR, CSSSelector4_toWaitOn)),
]
WebDriverWait(browser, browser_delay).until(composed_expected_conditions(conditions))
TA贡献1776条经验 获得超12个赞
该方法presence_of_element_located(locator)
仅检查元素是否存在于 DOM 中。这并不意味着元素可以交互。此外,搜索过程找到给定的所有元素locator
并返回第一个。
请检查该元素是否有效、可用且具体。如果列表中有多个元素,请确保您的定位器足够具体以找到单个元素。
TA贡献1862条经验 获得超7个赞
与其尝试将它们全部组合成一个等待,不如为每个单独等待。
...
try:
wait = WebDriverWait(browser, browser_delay)
wait.until(expected_conditions.visibility_of_element_located((By.CSS_SELECTOR, CSSSelector1_toWaitOn))
wait.until(expected_conditions.visibility_of_element_located((By.CSS_SELECTOR, CSSSelector2_toWaitOn))
wait.until(expected_conditions.visibility_of_element_located((By.CSS_SELECTOR, CSSSelector3_toWaitOn))
wait.until(expected_conditions.visibility_of_element_located((By.CSS_SELECTOR, CSSSelector4_toWaitOn))))
except TimeoutException:
print("Selenium timeout")
请注意,Selenium 中有 3 个级别的元素交互:
present - 元素在 DOM 中。如果您尝试单击或从现有(但不可见)元素等获取文本,
ElementNotInteractable
则会引发异常。可见 - 元素在 DOM 中并且可见(例如不是不可见,显示:无等)
clickable - 元素可见且已启用。在大多数情况下,这只是……它是可见的吗?特殊情况是标记为禁用的 INPUT 按钮等元素。使用 CSS 设置为禁用(灰显)的元素不被视为禁用。
添加回答
举报