1.selenium獲取斷言信息
獲取到的斷言信息就是實際結(jié)果
預(yù)期結(jié)果使我們確定的,直接寫在代碼中的
而實際結(jié)果是無法確定的,所以需要用一些方法去獲取
代碼示例
"""
獲取到的斷言信息就是實際結(jié)果
預(yù)期結(jié)果使我們確定的,直接寫在代碼中的
而實際結(jié)果是無法確定的,所以需要用一些方法去獲取
"""
from selenium import webdriver
# 創(chuàng)建瀏覽器驅(qū)動對象,這里是打開瀏覽器
driver = webdriver.Chrome("E:\憤怒吧小鳥\chromedriver-win64\chromedriver.exe")
#這種寫法是在配置了chromedriver環(huán)境變量之后,可不寫chromedriver的路徑
# driver=webdriver.Chrome()
# 訪問網(wǎng)址
driver.get('http://www.baidu.com')
#獲取頁面的標題
print(driver.title) #百度一下,你就知道
# 獲取當前頁面的 URL
print(driver.current_url) #https://www.baidu.com/
# 獲取標簽對(html的標簽對)之間的文本信息
# 1、標簽元素如果不展示在頁面上(比如:鼠標懸停才會有內(nèi)容顯示的情況),獲取結(jié)果為空
# 2、如果標簽對中間沒有值,獲取到的結(jié)果也是空的
# 3、如 input 之類的單標簽,獲取結(jié)果也是空的
print(driver.find_element_by_class_name("title-text").text) #百度熱榜
# 獲取元素的某個屬性
ele = driver.find_element_by_id("kw")
print(ele.get_attribute("class")) #s_ipt
driver.quit()
2.設(shè)置元素等待
場景:當我們加載頁面的時候,一些元素是需要時間的
就有可能發(fā)生,代碼執(zhí)行到了,而元素沒有被加載出來
此時就會出現(xiàn)找不到元素的情況,所以就要元素等待
元素等待大家首先都會想到time.sleep(),但是這個效率低;比如你等待1s,程序在0.3s就已經(jīng)加載完成了,那就是在浪費時間;已經(jīng)知道了 為什么 time.sleep 不好,所以不用;
此問題的解決方案就是,在元素定位之前,進行等待,等到元素出現(xiàn)
所以webdriver 提供了兩種等待類型:顯示等待、隱式等待
2.1顯示等待
- 顯示等待,若等到元素,就不會再等了
- 若想使用顯示等待,則必須對元素定位進行修改
- 也就是說,顯示等待必須對具體的某個元素定位,去主動聲明
舉例子,再微博地址為【https://m.weibo.cn/】做一些動作
(1)點擊大家都在搜
(2)點擊微博熱搜榜
代碼示例
from selenium import webdriver
# 創(chuàng)建瀏覽器驅(qū)動對象,這里是打開瀏覽器
driver = webdriver.Chrome("E:\憤怒吧小鳥\chromedriver-win64\chromedriver.exe")
# 訪問網(wǎng)址
driver.get("https://m.weibo.cn/")
# 點擊大家都在搜
driver.find_element_by_xpath("/html/body/div/div/div/div/a//div").click()
# 點擊微博熱搜榜
ele=driver.find_element_by_css_selector("#app > div:nth-child(1) > div:nth-child(1) > div.card.m-panel.card16.m-col-2 > div > div > div:nth-child(10) > div > div > h4")
ele.click()
運行結(jié)果報錯
那么我們來檢驗代碼里的元素定位是否正確
原因(就是前文提到的):
當我們加載頁面的時候,一些元素是需要時間的
就有可能發(fā)生,代碼執(zhí)行到了,而元素沒有被加載出來
此時就會出現(xiàn)找不到元素的情況
利用顯示等待,優(yōu)化代碼
from selenium import webdriver
from selenium.webdriver.common.by import By # 設(shè)置元素定位使用哪種方法的
from selenium.webdriver.support.ui import WebDriverWait # 元素等待類
from selenium.webdriver.support import expected_conditions as EC # 提供條件判斷函數(shù)
# 創(chuàng)建瀏覽器驅(qū)動對象,這里是打開瀏覽器
driver = webdriver.Chrome("E:\憤怒吧小鳥\chromedriver-win64\chromedriver.exe")
# 訪問網(wǎng)址
driver.get("https://m.weibo.cn/")
# 點擊大家都在搜
driver.find_element_by_xpath("/html/body/div/div/div/div/a//div").click()
# 點擊微博熱搜榜
# ele=driver.find_element_by_css_selector("#app > div:nth-child(1) > div:nth-child(1) > div.card.m-panel.card16.m-col-2 > div > div > div:nth-child(10) > div > div > h4")
# 顯示等待,若等到元素,就不會再等了
# 若想使用顯示等待,則必須對元素定位進行修改
# 也就是說,顯示等待必須對具體的某個元素定位,去主動聲明
# 每隔 0.5s 檢查一次元素是否存在,最多等待 5 s
# 若在最大超時時間內(nèi),找到元素,就不等了,繼續(xù)往下執(zhí)行
# 若最大超時時間還找不到元素,就報錯
ele = WebDriverWait(driver, 5, 0.5).until( # 每隔 0.5s 檢查一次元素是否存在,最多等待 5 s
EC.visibility_of_element_located( #visibility_of_element_located()是一個函數(shù),并且()里的對象是元組,檢查元素是否被加載出來
(By.CSS_SELECTOR,
"#app > div:nth-child(1) > div:nth-child(1) > div.card.m-panel.card16.m-col-2 > div > div > div:nth-child(10) > div > div > h4")
)
)
ele.click()
運行結(jié)果(顯示出微博熱搜界面)
可給顯示等待用一個函數(shù)封裝起來,要用的時候直接調(diào)用即可
新建一個waitLib.py模塊
from selenium.webdriver.support.ui import WebDriverWait # 元素等待類
from selenium.webdriver.support import expected_conditions as EC # 提供條件判斷函數(shù)
# 將顯示等待封裝成了函數(shù)
def waitEle(driver, timeout, poll_frequency, findType, findStr):
ele = WebDriverWait(driver, timeout, poll_frequency).until(
EC.visibility_of_element_located(
(findType, findStr)
)
)
return ele
2.2隱式等待
為什么有顯示等待,還有隱式等待,是因為顯示等待的代碼比較繁瑣(復(fù)雜)
(顯示等待對每一個元素都要聲明,但是隱式等待只需要聲明一次就可以)
隱式等待默認參數(shù)是秒 當腳本執(zhí)行到某個元素定位的時候,能定位就繼續(xù)執(zhí)行 如果不能定位,以輪詢的方式(0.5s 檢查一次)不斷的判斷元素是否能被定位 假設(shè),在第 x(x<=最大超時時間) 秒定位到元素了,就不等了,繼續(xù)往下執(zhí)行 若直到最大時長還沒定位成功,就拋出異常
注意:聲明隱式等待后,只有聲明之后的元素定位才有隱式等待,聲明之前的元素定位是沒有隱式等待的
顯示等待和隱式等待的功能是一樣的,基本上用了顯示等待就不要用隱式等待,用了隱式等待就不要用顯示等待,顯示等待的好處:比隱式等待更節(jié)約時間(根據(jù)自己的需求選擇)
代碼示例
from selenium import webdriver
# 創(chuàng)建瀏覽器驅(qū)動對象,這里是打開瀏覽器
driver = webdriver.Chrome("E:\憤怒吧小鳥\chromedriver-win64\chromedriver.exe")
# 隱式等待默認參數(shù)是秒,如下代碼,最大超時時間為 5 秒
# 當腳本執(zhí)行到某個元素定位的時候,能定位就繼續(xù)執(zhí)行
# 如果不能定位,以輪詢的方式(0.5s 檢查一次)不斷的判斷元素是否能被定位
# 假設(shè),在第 x(x<=最大超時時間) 秒定位到元素了,就不等了,繼續(xù)往下執(zhí)行
# 若直到最大時長還沒定位成功,就拋出異常
#聲明隱式等待
driver.implicitly_wait(5) # 聲明隱式等待后,只有聲明之后的元素定位才有隱式等待,聲明之前的元素定位是沒有隱式等待的
# 訪問網(wǎng)址
driver.get("https://m.weibo.cn/")
# 點擊大家都在搜
driver.find_element_by_xpath("/html/body/div/div/div/div/a//div").click()
# 點擊微博熱搜榜
driver.find_element_by_css_selector("#app > div:nth-child(1) > div:nth-child(1) > div.card.m-panel.card16.m-col-2 > div > div > div:nth-child(10) > div > div > h4").click()
3.xpath高級語法
xpath 使用路徑表達式來選取 xml 文檔或者HTML文檔上的節(jié)點或節(jié)點集
這些路徑表達式和我們常規(guī)電腦上的文件路徑表達式很像
xpath的最頂層是一個/
一層一層的寫是絕對路徑(用絕對路徑寫太繁瑣)
相對路徑是//
(/只能匹配到兒子,//能匹配到所有的后代)
用微博熱搜舉例
微博熱搜 (weibo.cn)
//div[@class="m-container-max"] ? 匹配 class 屬性為 "m-container-max" 的div標簽
也可以不指定標簽類型
//*[@class="m-container-max"]
(上述的*是通配符)
上述xpath 匹配任意類型的標簽,且標簽的 class 屬性為 m-container-max
//*[@class]
上述表達式匹配所有具備class 屬性的任意標簽
//div[@id="app" and @class="m-container-max"]
用 and 可以拼接多個屬性
在xpath中,一個點表示自己/.,兩個點表示父元素/..
//span[text()="要聞"]
上述表達式根據(jù)標簽對中間的文本值定位(不需要加@)
可以不指定標簽類型
//*[text()="要聞"]
也可以匹配所有有文本的
//span[text()]
//span[contains(text(), "要聞")]
上述表達式可以模糊匹配文本文章來源:http://www.zghlxwxcb.cn/news/detail-796146.html
代碼示例可在資源綁定中自行下載,如有疑問,可在評論區(qū)下留言文章來源地址http://www.zghlxwxcb.cn/news/detail-796146.html
到了這里,關(guān)于web自動化之基礎(chǔ)內(nèi)容二(全網(wǎng)最詳細,selenium獲取斷言信息,顯示等待和隱式等待,xpath高級語法)-第二天的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!