<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Selenium三大等待機制深度解析:從原理到實戰(小白也能懂)

      前言


      在Selenium自動化測試中,「元素定位失敗」是最常見的“攔路虎”。明明定位表達式正確,卻因頁面加載慢、元素未渲染等問題報錯——這時候,等待機制就是解決問題的關鍵。它能讓程序“聰明地等待”頁面就緒后再執行操作,而不是盲目執行。

      本文會詳細講解Selenium的三大等待機制(固定等待、隱式等待、顯式等待),保留核心的“深入理解”場景分析,并完整羅列所有expected_conditions方法,搭配帶逐行注釋的代碼,讓小白也能輕松掌握。

      一、為什么需要等待機制?

      瀏覽器加載頁面時,HTML、CSS、JavaScript是異步加載的(比如點擊按鈕后,新元素可能1秒加載完,也可能3秒,取決于網絡)。如果程序不等元素準備好就操作,會拋出NoSuchElementException(找不到元素)。

      等待機制的作用,就是讓程序在執行下一步前,先確認“目標元素已經準備好”,從而提高腳本穩定性。

      二、三大等待機制詳解

      1. 固定等待:time.sleep()——最簡單粗暴的等待

      time.sleep(n)是Python標準庫函數,功能是強制讓程序暫停n秒,不管元素是否加載完成,時間一到就繼續執行。

      適用場景:

      • 調試腳本時臨時添加,觀察頁面變化;
      • 已知元素加載時間固定(如本地靜態頁面)。

      代碼案例(帶詳細注釋):

      # 導入必要的庫
      from selenium import webdriver  # 導入Selenium瀏覽器驅動
      from selenium.webdriver.chrome.service import Service  # 管理Chrome驅動的服務類
      import time  # 導入時間庫,用于固定等待
      
      # 初始化Chrome瀏覽器
      # executable_path:指定Chrome驅動的本地路徑(請替換為你的驅動位置)
      driver = webdriver.Chrome(service=Service(executable_path='D:\\chromedriver.exe'))
      
      # 打開百度首頁
      driver.get('https://www.baidu.com')
      
      # 固定等待3秒
      # 注意:這是強制等待,哪怕頁面1秒加載完,也會等夠3秒
      time.sleep(3)
      
      # 定位搜索框并輸入內容(如果沒有等待,可能因頁面未加載完導致定位失?。?# 通過id定位百度搜索框(id為'kw')
      search_box = driver.find_element('id', 'kw')
      search_box.send_keys('Selenium等待機制')  # 在搜索框中輸入文字
      
      # 暫停程序,等待用戶按回車后關閉瀏覽器(方便觀察效果)
      input("按回車鍵關閉瀏覽器...")
      
      # 關閉瀏覽器(養成好習慣,避免資源占用)
      driver.quit()
      

      優缺點:

      優點 缺點
      用法簡單,適合新手入門 時間固定,網絡慢時會提前執行(導致失敗),網絡快時會浪費時間
      調試時便于觀察頁面變化 無法應對動態加載的頁面(如AJAX異步加載)

      2. 隱式等待:implicitly_wait()——全局的「佛系等待」

      隱式等待是Selenium的全局等待策略:設置一個超時時間(如10秒),當程序嘗試定位元素時,如果元素沒找到,會反復輪詢DOM(頁面文檔) 直到元素出現,或超過超時時間才拋出異常。

      適用場景:

      • 頁面元素加載速度較穩定的場景;
      • 希望簡化代碼,不想為每個元素單獨設置等待。

      代碼案例(帶詳細注釋):

      from selenium import webdriver
      from selenium.webdriver.chrome.service import Service
      from selenium.webdriver.common.by import By  # 用于指定元素定位方式(如ID、XPath等)
      
      # 初始化Chrome瀏覽器
      driver = webdriver.Chrome(service=Service(executable_path='D:\\chromedriver.exe'))
      
      # 設置隱式等待:全局生效,最長等待10秒
      # 作用:此后所有元素定位操作,若元素未立即出現,會最多等10秒(期間反復嘗試定位)
      driver.implicitly_wait(10)
      
      # 打開百度首頁
      driver.get('https://www.baidu.com')
      
      # 定位搜索框并輸入內容(依賴隱式等待:如果搜索框未加載,會等最多10秒)
      # By.ID:通過id定位;'kw'是百度搜索框的id
      search_box = driver.find_element(By.ID, 'kw')
      search_box.send_keys('隱式等待用法')
      
      # 定位搜索按鈕并點擊(同樣依賴隱式等待)
      # By.ID:'su'是百度搜索按鈕的id
      search_btn = driver.find_element(By.ID, 'su')
      search_btn.click()
      
      # 定位搜索結果的標題(百度搜索結果加載可能延遲,隱式等待會生效)
      # By.XPATH:通過XPath定位第一個結果的標題(XPath可能隨頁面更新,實際使用時需檢查)
      result_title = driver.find_element(By.XPATH, '//div[@id="content_left"]//h3/a')
      print(f"第一個搜索結果標題:{result_title.text}")
      
      # 關閉瀏覽器
      input("按回車鍵關閉瀏覽器...")
      driver.quit()
      

      關鍵特性:

      • 全局性:設置后對所有元素定位操作生效,直到driver.implicitly_wait(0)取消;
      • 輪詢機制:隱式等待期間,Selenium會不斷嘗試定位元素(輪詢間隔由瀏覽器驅動控制,無法手動設置);
      • 僅檢查元素存在:只要元素出現在DOM中就會停止等待,不關心元素是否可見或可點擊。

      3. 顯式等待:WebDriverWait——最智能的等待

      顯式等待是Selenium中最靈活的等待方式:通過WebDriverWait配合expected_conditions(預期條件),可以針對特定元素設置個性化等待條件(如“元素可見”“元素可點擊”),并指定最長等待時間和輪詢間隔。

      適用場景:

      • 動態加載的頁面(如AJAX異步加載內容);
      • 需要精確控制等待條件的場景(如“元素出現后再點擊”);
      • 頁面加載速度不穩定的情況。

      代碼案例(帶詳細注釋):

      from selenium import webdriver
      from selenium.webdriver.chrome.service import Service
      from selenium.webdriver.common.by import By
      # 導入顯式等待的核心類和預期條件
      from selenium.webdriver.support.ui import WebDriverWait  # 用于設置等待控制器
      from selenium.webdriver.support import expected_conditions as EC  # 用于定義等待條件
      
      # 初始化Chrome瀏覽器
      driver = webdriver.Chrome(service=Service(executable_path='D:\\chromedriver.exe'))
      
      # 打開百度首頁
      driver.get('https://www.baidu.com')
      
      # 1. 定位搜索框并輸入內容(這里用隱式等待簡化,也可以用顯式等待)
      driver.find_element(By.ID, 'kw').send_keys('顯式等待用法')
      driver.find_element(By.ID, 'su').click()
      
      # 2. 顯式等待:等待搜索結果加載完成(核心代碼)
      # 創建等待控制器:最長等待10秒,每0.5秒檢查一次條件(poll_frequency默認0.5秒)
      wait = WebDriverWait(driver, timeout=10, poll_frequency=0.5)
      
      # 定義等待條件:等待第一個搜索結果的標題可見(可見=出現在頁面且非隱藏)
      # EC.visibility_of_element_located():檢查元素是否可見
      # By.XPATH:定位第一個結果的標題(實際使用時需確認XPath是否有效)
      first_result = wait.until(
          EC.visibility_of_element_located((By.XPATH, '//div[@id="content_left"]//h3/a'))
      )
      
      # 3. 操作元素:點擊第一個搜索結果
      first_result.click()
      
      # 4. 顯式等待:等待新頁面標題包含關鍵詞(驗證跳轉成功)
      # EC.title_contains():檢查頁面標題是否包含指定文字
      wait.until(
          EC.title_contains('顯式等待')  # 等待標題中出現"顯式等待"
      )
      print(f"新頁面標題:{driver.title}")
      
      # 關閉瀏覽器
      input("按回車鍵關閉瀏覽器...")
      driver.quit()
      

      關鍵特性:

      • 針對性:只對設置了顯式等待的元素生效,不影響全局;
      • 多條件支持:通過expected_conditions提供幾十種等待條件(見下文完整列表);
      • 可配置性:可設置timeout(最長等待時間)和poll_frequency(輪詢間隔)。

      4. expected_conditions完整方法列表(小白必備)

      expected_conditions(通常簡寫為EC)是Selenium提供的預定義等待條件集合,覆蓋絕大多數場景。以下是完整方法說明:

      方法 作用 適用場景 示例
      EC.presence_of_element_located((By.XX, '值')) 等待元素出現在DOM中(無需可見) 檢查元素是否加載完成(如隱藏的加載標志) 等待列表數據的父容器加載:EC.presence_of_element_located((By.ID, 'list-container'))
      EC.presence_of_all_elements_located((By.XX, '值')) 等待所有匹配的元素出現在DOM中 檢查列表數據是否全部加載(如表格多行數據) 等待所有搜索結果加載:EC.presence_of_all_elements_located((By.XPATH, '//div[@class="result"]'))
      EC.visibility_of_element_located((By.XX, '值')) 等待元素可見(出現在頁面且非隱藏) 需操作可見元素(如輸入框、按鈕) 等待用戶名輸入框可見:EC.visibility_of_element_located((By.ID, 'username'))
      EC.visibility_of_all_elements_located((By.XX, '值')) 等待所有匹配的元素可見 檢查多個可見元素(如導航菜單選項) 等待所有導航按鈕可見:EC.visibility_of_all_elements_located((By.CLASS_NAME, 'nav-btn'))
      EC.invisibility_of_element_located((By.XX, '值')) 等待元素不可見(或從DOM中消失) 等待加載動畫消失 等待轉圈加載動畫消失:EC.invisibility_of_element_located((By.CLASS_NAME, 'loading-spinner'))
      EC.element_to_be_clickable((By.XX, '值')) 等待元素可點擊(可見且啟用) 需點擊按鈕、鏈接時 等待登錄按鈕可點擊:EC.element_to_be_clickable((By.ID, 'login-btn'))
      EC.element_to_be_selected(WebElement) 等待元素被選中(如復選框) 檢查復選框是否勾選 等待同意協議復選框被選中:EC.element_to_be_selected(agree_checkbox)
      EC.element_located_to_be_selected((By.XX, '值')) 等待定位到的元素被選中 同上,但通過定位表達式而非元素對象 等待同意協議復選框被選中:EC.element_located_to_be_selected((By.ID, 'agree'))
      EC.text_to_be_present_in_element((By.XX, '值'), '文字') 等待元素包含指定文字 檢查動態生成的文本(如提示信息) 等待提示框顯示“操作成功”:EC.text_to_be_present_in_element((By.CLASS_NAME, 'tip'), '操作成功')
      EC.text_to_be_present_in_element_value((By.XX, '值'), '文字') 等待元素的value屬性包含指定文字 檢查輸入框的默認值或動態填充值 等待搜索框默認顯示“請輸入關鍵詞”:EC.text_to_be_present_in_element_value((By.ID, 'kw'), '請輸入關鍵詞')
      EC.title_is('標題') 等待頁面標題完全匹配指定文字 驗證頁面跳轉是否正確(精確匹配) 等待頁面標題為“百度一下,你就知道”:EC.title_is('百度一下,你就知道')
      EC.title_contains('關鍵詞') 等待頁面標題包含指定關鍵詞 驗證頁面跳轉是否正確(模糊匹配) 等待標題包含“百度”:EC.title_contains('百度')
      EC.frame_to_be_available_and_switch_to_it((By.XX, '值')) 等待iframe加載完成并切換到該iframe 操作iframe中的元素前 等待登錄iframe加載并切換:EC.frame_to_be_available_and_switch_to_it((By.ID, 'login-iframe'))
      EC.alert_is_present() 等待alert彈窗出現 處理彈窗前的檢查 等待刪除確認彈窗出現:EC.alert_is_present()

      三、深入理解三種等待機制的實戰場景

      在實際項目中,等待機制的組合使用可能出現復雜情況。以下兩種場景是新手最容易混淆的,需要重點理解:

      場景1:三種等待機制同時存在時的相互作用

      當固定等待、隱式等待、顯式等待同時存在時,它們的執行邏輯是什么?我們通過代碼案例分析:

      from selenium import webdriver
      from selenium.webdriver.chrome.service import Service
      from selenium.webdriver.common.by import By
      from selenium.webdriver.support.ui import WebDriverWait
      from selenium.webdriver.support import expected_conditions as EC
      import time
      
      # 初始化瀏覽器
      driver = webdriver.Chrome(service=Service(executable_path='D:\\chromedriver.exe'))
      
      # 1. 設置全局隱式等待10秒:所有元素定位最多等10秒
      driver.implicitly_wait(10)
      
      # 打開目標頁面(假設是一個加載較慢的登錄頁)
      driver.get('https://www.example.com/login')
      
      # 2. 固定等待5秒:無論頁面狀態,強制暫停5秒
      time.sleep(5)
      
      # 3. 顯式等待:等待登錄按鈕可點擊,最長等待3秒
      wait = WebDriverWait(driver, timeout=3)
      login_btn = wait.until(
          EC.element_to_be_clickable((By.ID, 'login-btn'))
      )
      login_btn.click()
      
      # 關閉瀏覽器
      input("按回車鍵關閉...")
      driver.quit()
      

      關鍵結論:

      • 固定等待(time.sleep(5):優先級最高,會阻塞所有后續操作,必須等5秒結束后才執行顯式等待;
      • 隱式等待與顯式等待同時存在:Selenium會以兩者中較長的時間作為實際等待時間(上述案例中,隱式等待10秒 > 顯式等待3秒,實際最長等待10秒);
      • 建議:實際項目中盡量避免同時使用隱式和顯式等待,以免等待時間不可控。

      場景2:隱式等待和顯式等待的靈活度差異

      以“百度搜索后滾動到頁底”為例,對比兩種等待的效果:

      需求:

      在百度搜索“娃哈哈”后,滾動頁面到底部(需確保搜索結果完全加載,否則頁面高度不足,滾動無效果)。

      方案A:用隱式等待實現
      from selenium import webdriver
      from selenium.webdriver.chrome.service import Service
      
      # 初始化瀏覽器,設置隱式等待10秒
      driver = webdriver.Chrome(service=Service(executable_path='D:\\chromedriver.exe'))
      driver.implicitly_wait(10)  # 全局隱式等待
      
      # 打開百度首頁
      driver.get('https://www.baidu.com')
      
      # 輸入搜索詞并點擊搜索
      driver.find_element('name', 'wd').send_keys('娃哈哈')
      driver.find_element('id', 'su').click()
      
      # 隱式等待:檢查搜索結果的父元素是否存在(認為父元素存在=結果加載完成)
      driver.find_element('xpath', '//*[@id="content_left"]')  # 父元素XPath
      
      # 滾動到頁底
      driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
      
      input("按回車關閉...")
      driver.quit()
      

      問題:

      隱式等待僅檢查“父元素是否在DOM中”,但百度搜索結果是異步加載的——父元素可能已存在,但內容未完全渲染(頁面高度仍為1屏),導致滾動無效果。

      方案B:用顯式等待實現
      from selenium import webdriver
      from selenium.webdriver.chrome.service import Service
      from selenium.webdriver.support.ui import WebDriverWait
      from selenium.webdriver.support import expected_conditions as EC
      from selenium.webdriver.common.by import By
      
      # 初始化瀏覽器
      driver = webdriver.Chrome(service=Service(executable_path='D:\\chromedriver.exe'))
      
      # 打開百度首頁
      driver.get('https://www.baidu.com')
      
      # 輸入搜索詞并點擊搜索
      driver.find_element('name', 'wd').send_keys('娃哈哈')
      driver.find_element('id', 'su').click()
      
      # 顯式等待:等待至少1條搜索結果可見(確保內容已渲染)
      wait = WebDriverWait(driver, timeout=10)
      wait.until(
          EC.visibility_of_element_located((By.XPATH, '//*[@id="content_left"]//h3/a'))
      )
      
      # 滾動到頁底(此時頁面高度足夠,滾動有效)
      driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
      
      input("按回車關閉...")
      driver.quit()
      

      優勢:

      顯式等待通過EC.visibility_of_element_located檢查“結果可見”,確保內容已渲染(頁面高度足夠),滾動效果穩定。

      結論:

      • 隱式等待:適合簡單場景,僅能判斷“元素是否存在于DOM”;
      • 顯式等待:適合復雜場景,可判斷“元素可見/可點擊”等狀態,更貼合實際操作需求。

      四、三大等待機制對比與最佳實踐

      1. 核心區別對比表

      等待方式 語法 生效范圍 等待條件 適用場景 效率
      固定等待 time.sleep(n) 局部(僅當前行) 固定n秒 調試、已知固定加載時間 低(可能等待過長)
      隱式等待 driver.implicitly_wait(n) 全局(所有定位) 元素出現在DOM中 頁面加載穩定的場景
      顯式等待 WebDriverWait(...).until(EC.XX) 局部(指定元素) 自定義條件(可見、可點擊等) 動態頁面、復雜場景 高(按需等待)

      2. 最佳實踐建議

      • 優先用顯式等待:針對關鍵操作(如登錄、提交表單),用顯式等待確保元素狀態正確(如element_to_be_clickable);
      • 輔助用隱式等待:對整個腳本設置短時間隱式等待(如3秒),減少簡單場景的代碼量(如靜態元素定位);
      • 少用固定等待:僅在調試或特殊場景(如等待彈窗消失)時臨時使用,避免硬編碼時間;
      • 捕獲超時異常:顯式等待超時后會拋出TimeoutException,實際項目中應捕獲異常并處理(如重試、截圖)。

      結語



      親愛的朋友:
      希望本文中描述的問題以及解決方案,可以幫助到您。當然,我們深知,問題和挑戰總是層出不窮,新的情況也在不斷涌現。如果讀者朋友您有更好的方案,或者在實際應用中發現了文中的不足之處,請不吝分享您的寶貴建議。誠摯地邀請每一位讀者加入我們的行列,共同完善這份教程。
      感謝您的閱讀與支持!

      Dear friends,
      We hope that the questions and solutions presented in this article can be of assistance to you. Of course, we are fully aware that problems and challenges are always emerging in an endless stream, and new situations are constantly arising. If you, our readers, have better solutions or have discovered any deficiencies in this article through practical application, please do not hesitate to share your valuable suggestions with us. We sincerely invite every reader to join us in continuously improving this tutorial.
      Thank you for your reading and support!
      See you, Parting is for better meeting!

      posted @ 2025-08-10 21:41  xiaodi888  閱讀(162)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 国产va免费精品观看| 91偷自国产一区二区三区| 乌拉特前旗| 国产一区二区三区精品自拍 | 曰本丰满熟妇xxxx性| 午夜夜福利一区二区三区| 国产精品中文字幕久久| 国产二区三区不卡免费| 色猫咪av在线观看| 有码中文字幕一区三区| 亚洲精品专区永久免费区| 西西444www高清大胆| 亚洲粉嫩av一区二区黑人| 国产喷水1区2区3区咪咪爱AV| 熟妇无码熟妇毛片| 小婕子伦流澡到高潮h| 国产毛片精品av一区二区| 成人性生交大片免费看| 国产亚洲一区二区三区四区| 四虎在线成人免费观看| 日韩V欧美V中文在线| 久章草在线毛片视频播放| 丁香婷婷色综合激情五月| 无码人妻一区二区三区线| 双腿张开被5个男人调教电影| 亚洲性一交一乱一伦视频| 亚洲欧洲日产国码久在线| 国产最新AV在线播放不卡| 农村欧美丰满熟妇xxxx| 久久―日本道色综合久久| 久久人妻av无码中文专区| 精品一区二区三区四区激情| 丰满无码人妻热妇无码区| 亚洲av成人无码精品电影在线| 最新精品露脸国产在线| 国内视频偷拍一区,二区,三区| 成人网站av亚洲国产| 98精品全国免费观看视频| 国产福利精品一区二区| 黑山县| caoporn成人免费公开|