所謂模擬瀏覽器基本就是下面的流程:
請求
顯示頁面
查找元素
點擊可點擊元素
所以如何使用selenium找到頁面中的標簽,進而觸發標簽事件,就會變的尤為重要。
1. selenium選擇器
要想定位頁面的元素,selenium也提供了一系列的方法。
1.通過標簽id屬性進行定位
browser.find_element_by_id('kw') # 其中kw便是頁面中某個元素的id值
2.通過標簽name屬性進行定位
# 兩種方式是一樣的
browser.find_element_by_name("wd") # 其中wd是頁面中某個元素的name值
3.通過標簽名進行定位
browser.find_element_by_tag_name("img") # img參數表示的就是圖片標簽img
4.通過CSS查找方式進行定位
browser.find_elements_by_css_selector("#kw") # 根據選擇器進行定位查找,其中#kw表示的是id選擇器名稱是kw的
5.通過xpath方式定位
browser.find_element_by_xpath('//*[@id="kw"]') # 參數即是xpath的語法
6.通過搜索 頁面中 鏈接進行定位
有時候不是一個輸入框也不是一個按鈕,而是一個文字鏈接,我們可以通過link
browser.find_element_by_link_text("設置")
通過搜索 頁面中 鏈接進行定位 ,可以支持模糊匹配**
browser.find_element_by_partial_link_text("百度") # 查找頁面所有的含有百度的文字鏈接
2.selenium顯示等待和隱式等待
顯示等待:就是明確要等到某個元素的出現或者是某個元素的可點擊等條件,等不到,就一直等,除非在規定的時間之內都沒找到,就會跳出異常Exception
操作格式:WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
WebDriverWait()一般由until()或 untilnot()方法配合使用
until(method, message=' '):調用該方法提供的驅動程序作為一個參數,直到返回值為True
`untilnot(method, message=' ')`:調用該方法提供的驅動程序作為一個參數,直到返回值為False
from selenium import webdriver
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()
driver.get('http://www.baidu.com')
element = WebDriverWait(driver, 5, 0.5).until(EC.presence_of_element_located((By.ID, "kw")))
element.send_keys('selenium')
隱式等待:就是在創建driver時,為瀏覽器對象創建一個等待時間,這個方法是得不到某個元素就等待一段時間,直到拿到某個元素位置。
注意:在使用隱式等待的時候,實際上瀏覽器會在你自己設定的時間內部斷的刷新頁面去尋找我們需要的元素
driver.implicitly_wait() 默認設置為0
例如: driver.implicitly_wait(10) 。如果元素在10s內定位到了,繼續執行。如果定位不到,將以循環方式判斷元素是否被定位到。如果在10s內沒有定位到,則拋出異常
from selenium import webdriver
driver = webdriver.chrome()
driver.get('http://www.baidu.com')
# 隱式等待10秒
driver.implicitly_wait(10)
另外還有一種就是我們常用的sleep,我們稱為:強制等待。
有時候我們希望腳本在執行到某一位置時暫停一段時間等待頁面加載,這時可以使用sleep()方法。sleep()方法會固定休眠一定的時長,然后再繼續執行。sleep()方法默認參數以秒為單位。
from time import sleep
from selenium import webdriver
driver = webdriver.chrome()
driver.get('http://www.baidu.com')
# 強制休眠2秒
sleep(2)
driver.find_element_by_id("kw").send_keys("selenium")