Selenium 八大定位,滾雪球?qū)W Python 番外系列

今天是持續(xù)寫作的第 <font color="red">24</font> / 100 天。
如果你有想要交流的想法、技術(shù),歡迎在評(píng)論區(qū)留言。

今天學(xué)點(diǎn)簡(jiǎn)單又單調(diào)了,Selenium 八大定位。

橡皮擦有幾個(gè)朋友在群里說:唉,橡皮擦,你咋又寫基礎(chǔ)的東西了。橡皮擦想了想答道:這不廢話么,你叫一個(gè)做產(chǎn)品的天天寫技術(shù),合適么。

Selenium 八大定位

每次寫八大定位的時(shí)候,總產(chǎn)生一種要寫武俠小說的感覺,面前出現(xiàn)八個(gè)銅人。

在 Selenium 中根據(jù) HTML 頁面元素的標(biāo)簽或者屬性來定位,用測(cè)試的語言描述就是。

  1. 定位網(wǎng)頁上的頁面元素,并獲取元素對(duì)象;
  2. 對(duì)元素對(duì)象實(shí)施點(diǎn)擊,拖拽,輸入等操作。

Selenium 提供了 8 種基本定位方法,分別為 id,name,class name,tag name,link_text,partial link text,css selector,xpath。

通過 id 進(jìn)行定位

HTML 網(wǎng)頁中任意一個(gè)標(biāo)簽或元素都可以設(shè)置一個(gè)唯一的 ID,所以在任意頁面中通過 ID 都可以定位到一個(gè)元素,前提是存在這樣一個(gè) ID 的標(biāo)簽。

通過 ID 進(jìn)行定位的方法為 find_element_by_id,看名字起得就非常好,查找標(biāo)簽依靠 ID,這一系列的方法后文會(huì)學(xué)習(xí)到,都長(zhǎng)的差不多,具體代碼如下。

from selenium import webdriver
import time

driver = webdriver.Firefox()
# open_driver = webdriver.Chrome()
# open_driver = webdriver.PhantomJS()
# 打開百度圖片
driver.get('https://image.baidu.com/')

# 找到輸入框,輸入模特
driver.find_element_by_id("kw").send_keys("模特")

# driver.close()

上述代碼中的 .find_element_by_id("kw") 就是在通過 ID 尋找標(biāo)簽。

20201214204435895[1].png

代碼運(yùn)行完畢,打開瀏覽器會(huì)自動(dòng)輸入 模特。

20201214204319256[1].png

通過 name 進(jìn)行定位

name 也是 HTML 網(wǎng)頁元素的一個(gè)屬性,你可以在網(wǎng)頁源碼中檢索一下 name= 看一下都有哪些位置包含,如果對(duì)網(wǎng)頁十分了解的同學(xué),這個(gè)步驟也可以忽略。

通過 name 進(jìn)行定位使用到的方法是 find_element_by_name。在百度圖片網(wǎng)頁中發(fā)現(xiàn)輸入框也攜帶 name 屬性。通過下述代碼可以進(jìn)行與 ID 相同的操作。

20201214204649959[1].png
from selenium import webdriver
import time

driver = webdriver.Firefox()
# open_driver = webdriver.Chrome()
# open_driver = webdriver.PhantomJS()
# 打開百度圖片
driver.get('https://image.baidu.com/')

# 通過ID找到輸入框,輸入模特
# driver.find_element_by_id("kw").send_keys("模特")
# 通過name找到輸入框,輸入模特
driver.find_element_by_name("word").send_keys("小女生")

# driver.close()

特別注意用 name 定位網(wǎng)頁元素,需要保證 name 在待定位的網(wǎng)頁中唯一。

通過 class 進(jìn)行定位

該定位方法為 find_element_by_class_name,方法名比較長(zhǎng),但是使用方式和上文一致。

# 通過 class name 進(jìn)行定位
driver.find_element_by_class_name("s_ipt").send_keys("帥哥")

通過 link_text 進(jìn)行定位

該定位方法是通過超鏈接標(biāo)簽的文字進(jìn)行匹配定位的,例如下圖中紅框區(qū)域的超鏈接。實(shí)現(xiàn)打開百度圖片,點(diǎn)擊高清動(dòng)漫。

20201214205345224[1].png
# 找到鏈接之后,還可以跳轉(zhuǎn),注意超鏈接文本要寫完整,即完整匹配。
driver.find_element_by_link_text("高清動(dòng)漫").click()

圖好看

Selenium 八大定位,滾雪球?qū)W Python 番外系列

通過 partial_link_text 進(jìn)行定位是 link_text 的一個(gè)子級(jí),類似模糊匹配,代碼可以寫成。

# 找到鏈接之后,還可以跳轉(zhuǎn)
driver.find_element_by_partial_link_text("高清").click()

通過 tag_name 進(jìn)行定位

tag_name 即標(biāo)簽名,也就是通過 HTML 網(wǎng)頁中的標(biāo)簽名進(jìn)行定位。

# 通過標(biāo)簽名進(jìn)行定位,該方法使用較少
form_div = driver.find_element_by_tag_name("form")
print(form_div)

在網(wǎng)頁中由于標(biāo)簽名重復(fù)的概率很高,故此方法使用極少。

通過 CSS 進(jìn)行定位

CSS 定位的優(yōu)點(diǎn)是速度快、語法簡(jiǎn)單。難點(diǎn)是你需要對(duì) CSS 選擇器非常熟悉,否則需要補(bǔ)充 HTML+CSS 的相關(guān)知識(shí)。后文中我們核心使用的方法是 css_selector,例如修改第一段代碼,通過 CSS 里面的 id選擇器 進(jìn)行定位。

# id 選擇器
driver.find_element_by_css_selector("#kw").send_keys("小朋友")
# class 選擇器
driver.find_element_by_css_selector(".s_ipt").send_keys("小朋友")
# name選擇器
driver.find_element_by_css_selector("input[name='word']").send_keys("小朋友")

通過 XPath 進(jìn)行定位

XPath 定位更加好用,但是麻煩的是你又需要學(xué)習(xí)一個(gè)額外的語法了,相對(duì)于 CSS 定位來說,該方式定位具備更大的靈活性,但是速度略微比 CSS 慢了一些(當(dāng)然一般情況下也看不出來)。

driver.find_element_by_xpath("http://*[@name='word']").send_keys("大朋友")

對(duì)于 XPath 語法,本系列博客不進(jìn)行講解,堅(jiān)持不跑題,堅(jiān)持你自己可以搞定的理念。

寫在后面

本篇博客主要介紹了 Selenium 中的八大定位,掌握方法即可,后文大量依賴這些定位方式,所以不用擔(dān)心學(xué)不會(huì)噠。


如果你想跟博主建立親密關(guān)系,可以關(guān)注同名公眾號(hào) <font color="red">夢(mèng)想橡皮擦</font>,近距離接觸一個(gè)逗趣的互聯(lián)網(wǎng)高級(jí)網(wǎng)蟲。
博主 ID:夢(mèng)想橡皮擦,希望大家<font color="red">點(diǎn)贊</font>、<font color="red">評(píng)論</font>、<font color="red">收藏</font>。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容