<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                [TOC] ## **4.7 設置元素等待** WebDriver 提供了兩種類型的元素等待:顯式等待和隱式等待。 ### **4.7.1 顯式等待** 顯式等待是 WebDriver 等待某個條件成立則繼續執行,否則在達到最大時長時拋出超時異常(TimeoutException)。 ``` from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Chrome() driver.get("http://www.baidu.com") element = WebDriverWait(driver, 5, 0.5).until( EC.visibility_of_element_located((By.ID, "kw")) ) element.send_keys('selenium') driver.quit() ``` WebDriverWait 類是 WebDriver 提供的等待方法。在設置時間內,默認每隔一段時間檢測一次當前頁面元素是否存在,如果超過設置時間仍檢測不到,則拋出異常。具體格式如下。 ``` WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None) ``` * driver:瀏覽器驅動。 * timeout:最長超時時間,默認以秒為單位。 * poll_frequency:檢測的間隔(步長)時間,默認為 0.5s * ignored_exceptions:超時后的異常信息,默認情況下拋出 NoSuchElementException異常。 WebDriverWait()一般與 until()或 until_not()方法配合使用,下面是 until()和 until_not()方法的說明。 ``` until(method, message=″) ``` 調用該方法提供的驅動程序作為一個參數,直到返回值為 True。 ``` until_not(method, message=″) ``` 調用該方法提供的驅動程序作為一個參數,直到返回值為 False。 在本例中,通過 as 關鍵字將 expected_conditions 重命名為 EC,并調用 presence_of_element_located()方法判斷元素是否存在。 expected_conditions 類提供的預期條件判斷方法如表 4-2 所示。 ![](https://img.kancloud.cn/b7/b7/b7b70107bdfc9cfc0f4a9f2e1a61eb55_794x629.png) 除 expected_conditions 類提供的豐富的預期條件判斷方法外,還可以利用前面學過的is_displayed()方法自己實現元素顯示等待。 ``` from time import sleep, ctime from selenium import webdriver driver = webdriver.Chrome() driver.get("http://www.baidu.com") print(ctime()) for i in range(10): try: el = driver.find_element_by_id("kw22") if el.is_displayed(): break except: pass sleep(1) else: print("time out") print(ctime()) driver.quit() ``` 相對來說,這種方式更容易理解。首先 for 循環 10 次,然后通過 is_displayed()方法循環判斷元素是否可見。如果為 True,則說明元素可見,執行 break 跳出循環;否則執行 sleep()休眠 1s 后繼續循環判斷。10 次循環結束后,如果沒有執行 break,則執行 for 循環對應的else 語句,打印“time out”信息。 這里故意將 id 定位設置為“kw22”,定位失敗,執行結果如下。 ``` Mon Sep 27 15:19:31 2021 time out Mon Sep 27 15:19:42 2021 ``` <br /> ### **4.7.2 隱式等待** WebDriver 提供的 implicitly_wait()方法可用來實現隱式等待,用法相對來說要簡單得多。 ``` from time import ctime from selenium import webdriver from selenium.common.exceptions import NoSuchElementException driver = webdriver.Chrome() # 設置隱式等待為 10s driver.implicitly_wait(10) driver.get("http://www.baidu.com") try: print(ctime()) driver.find_element_by_id("kw22").send_keys('selenium') except NoSuchElementException as e: print(e) finally: print(ctime()) driver.quit() ``` implicitly_wait()的參數是時間,單位為秒,本例中設置的等待時間為 10s。首先,這10s 并非一個固定的等待時間,它并不影響腳本的執行速度。其次,它會等待頁面上的所有元素。當腳本執行到某個元素定位時,如果元素存在,則繼續執行;如果定位不到元素,則它將以輪詢的方式不斷地判斷元素是否存在。假設在第 6s 定位到了元素,則繼續執行,若直到超出設置時間(10s)還沒有定位到元素,則拋出異常。 這里同樣故意將 id 定位設置為“kw22”,定位失敗,執行結果如下。 ``` Mon Sep 27 16:08:03 2021 Message: no such element: Unable to locate element: {"method":"css selector","selector":"[id="kw22"]"} (Session info: chrome=93.0.4577.82) Mon Sep 27 16:08:13 2021 ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看