selenium - 三種元素等待

1.sleep 休眠方法python

  • sleep()由python的time模塊提供。
  • 當執行到sleep()方法時,腳本會定時休眠所設置的時長,sleep()方法默認參數是s(秒),sleep(2) 表示休眠2s;若是設置時長小於1秒,那就直接寫sleep(0.5) 。
# coding:utf-8

# 導入time包
from time import sleep
from selenium import webdriver
driver = webdriver.Firefox()
driver.get("https://www.baidu.com")

sleep(2)
driver.find_element_by_id("kw").send_keys("selenium")

sleep(1.5)
driver.find_element_by_id("su").click()

2.隱式等待 implicitly_wait()web

  • 隱式等待是經過必定的時長等頁面元素所有加載完成(就是等待頁面左上角轉圈結束)。若是超出了設置的時長,元素尚未加載出來,那麼就會拋出異常 NoSuchElementException
  • 隱式等待是全局的,只寫一次就好了。
  • 弊端:有些網站頁面寫得很差,js報錯,一直在轉圈,那麼就會消耗時間,影響效率。
  • 頁面跳轉的時候,不知道去等第二個頁面網站

  • Implicitly_wait(10)默認參數的單位是秒,這裏10秒並非固定的等待時間,當腳本定位不到這個元素時,
    它將以輪詢的方式不斷地判斷元素是不是否被定位到,若是超過了10秒仍是定位不到元素,那麼就會拋出異常。ui

# coding:utf-8

from selenium import webdriver

driver = webdriver.Firefox()
driver.implicitly_wait(10)
driver.get("https://www.baidu.com")

driver.find_element_by_id("kw1").send_keys("python")
  • 元素定位不到,拋出異常:
    selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: {"method":"id","selector":"kw1"}

3.顯式等待 WebDriverWait()調試

  • 首先打開源碼看一下,源碼的位置
    code

  • 看一下源碼中,WebDriverWait每一個參數的意思
    utf-8

  • driver :webdriver的實例
  • timeout :超時的總時長
  • poll_frequency :循環查詢的間隔時間,默認爲0.5s
  • ignored_exceptions :忽略異常,默認忽略 NoSuchElementExceptionci

# coding:utf-8

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
driver = webdriver.Firefox()
driver.implicitly_wait(10)
driver.get("https://www.baidu.com")

element = WebDriverWait(driver, 15).until(lambda x: x.find_element_by_id("kw"))
print(element)
  • 有個很差的地方就是,找不到元素只會報一個異常 TimeoutException, 因此調試的時候仍是要先用常規的方法,先定位好,而後再封裝成顯式等待的方法
相關文章
相關標籤/搜索