亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何讓硒等待多個元素加載

如何讓硒等待多個元素加載

慕村225694 2022-06-14 10:50:22
在繼續屏幕抓取之前,我正在使用以下代碼等待加載所有 4 個元素;但是,代碼并沒有等待所有 4 個,也沒有拋出超時錯誤——它只是繼續,我在尚未加載的元素上收到錯誤。我缺少什么讓 Selenium 等到所有四個元素都存在后再繼續?        CSSSelector1_toWaitOn = "#div1 table tbody tr td"        CSSSelector2_toWaitOn = "#div2 table tbody tr:nth-child(5) td"        CSSSelector3_toWaitOn = "#div3 table tbody tr:nth-child(5) td"        CSSSelector4_toWaitOn = "#div4 table tbody tr td"        browser.get(url)        browser_delay = 15  # seconds        try:            WebDriverWait(browser, browser_delay).until(expected_conditions and (                expected_conditions.presence_of_element_located((By.CSS_SELECTOR, CSSSelector1_toWaitOn)) and                expected_conditions.presence_of_element_located((By.CSS_SELECTOR, CSSSelector2_toWaitOn)) and                expected_conditions.presence_of_element_located((By.CSS_SELECTOR, CSSSelector3_toWaitOn)) and                expected_conditions.presence_of_element_located((By.CSS_SELECTOR, CSSSelector4_toWaitOn))))        except TimeoutException:            print("Selenium timeout")```
查看完整描述

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))



查看完整回答
反對 回復 2022-06-14
?
叮當貓咪

TA貢獻1776條經驗 獲得超12個贊

該方法presence_of_element_located(locator)僅檢查元素是否存在于 DOM 中。這并不意味著元素可以交互。此外,搜索過程找到給定的所有元素locator并返回第一個。

請檢查該元素是否有效、可用且具體。如果列表中有多個元素,請確保您的定位器足夠具體以找到單個元素。


查看完整回答
反對 回復 2022-06-14
?
牧羊人nacy

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 個級別的元素交互:

  1. present - 元素在 DOM 中。如果您嘗試單擊或從現有(但不可見)元素等獲取文本,ElementNotInteractable則會引發異常。

  2. 可見 - 元素在 DOM 中并且可見(例如不是不可見,顯示:無等)

  3. clickable - 元素可見且已啟用。在大多數情況下,這只是……它是可見的嗎?特殊情況是標記為禁用的 INPUT 按鈕等元素。使用 CSS 設置為禁用(灰顯)的元素不被視為禁用。


查看完整回答
反對 回復 2022-06-14
  • 3 回答
  • 0 關注
  • 131 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號