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