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 設置為禁用(灰顯)的元素不被視為禁用。
添加回答
舉報