一、元素的概念
元素:由標(biāo)簽頭 + 標(biāo)簽尾 + 標(biāo)簽頭和標(biāo)簽尾包括的文本內(nèi)容;
元素的信息就是指元素的標(biāo)簽名及元素的屬性;
元素的層級(jí)結(jié)構(gòu)就是指元素之間相互嵌套的層級(jí)結(jié)構(gòu);
元素定位最終就是通過(guò)元素的信息或者元素的層級(jí)結(jié)構(gòu)來(lái)進(jìn)行元素定位;
二、元素定位方法
webdriver 提供了一系列的對(duì)象定位方法,常用的有以下8種:
定位一個(gè)元素 | 定位多個(gè)元素 | 含義 |
---|---|---|
find_element(By.ID,value) | find_elements(By.ID,value) | 通過(guò)元素id定位 |
find_element(By.NAME,value) | find_elements(By.NAME,value) | 通過(guò)元素name定位 |
find_element(By.XPATH,value) | find_elements(By.XPATH,value) | 通過(guò)xpath表達(dá)式定位 |
find_element(By.LINK_TEXT,value) | find_elements(By.LINK_TEXT,value) | 通過(guò)完整超鏈接定位 |
find_element(By.PARTIAL_LINK_TEXT,value) | find_elements(By.PARTIAL_LINK_TEXT,value) | 通過(guò)部分鏈接定位 |
find_element(By.TAG_NAME,value) | find_elements(By.TAG_NAME,value) | 通過(guò)標(biāo)簽定位 |
find_element(By.CLASS_NAME,value) | find_elements(By.CLASS_NAME,value) | 通過(guò)類名進(jìn)行定位 |
find_element(By.CSS_SELECTOR,value) | find_elements(By.CSS_SELECTOR,value) | 通過(guò)css選擇器進(jìn)行定位 |
(一)根據(jù)id定位
在HTML當(dāng)中,id屬性是唯一標(biāo)識(shí)一個(gè)元素的屬性,因此在selenium當(dāng)中,通過(guò)id來(lái)進(jìn)行元素的定位也較為常用。
百度搜索框的元素如圖所示:
百度搜索框元素html結(jié)構(gòu):
<input type="text" class="s_ipt" name="wd" id="kw" maxlength="100" autocomplete="off">
元素定位(下面有代碼詳細(xì),此處僅簡(jiǎn)單展示方法):
element = web.find_element(By.ID, "kw")
(二)根據(jù)name定位
在HTML當(dāng)中,name屬性和id屬性的功能基本相同,只是name屬性并不是唯一的,如果遇到?jīng)]有id標(biāo)簽的時(shí)候,我們可以考慮通過(guò)name標(biāo)簽來(lái)進(jìn)行定位。
百度搜索框元素html結(jié)構(gòu):文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-461728.html
<input type="text" class="s_ipt" name="wd" id="kw" maxlength="100" autocomplete="off">
元素定位(下面有代碼詳細(xì),此處僅簡(jiǎn)單展示方法):
element = web.find_elements(By.NAME,"wd")
(三)根據(jù)class name定位
我們也可以基于class屬性來(lái)定位元素。通常當(dāng)我們看到有多個(gè)并列的元素如list表單,class用的都是共用同一個(gè)。
百度搜索框元素html結(jié)構(gòu):
<input type="text" class="s_ipt" name="wd" id="kw" maxlength="100" autocomplete="off">
元素定位(下面有代碼詳細(xì),此處僅簡(jiǎn)單展示方法):
element = web.find_element(By.CLASS_NAME,"s_ipt")
(四)根據(jù)tag定位
HTML是通過(guò)tag來(lái)定義一類功能的,比如input是輸入,table是表格,tbody是表格主體等。每個(gè)元素其實(shí)就是一個(gè)tag,由于一個(gè)tag用來(lái)定義一類功能,一個(gè)網(wǎng)頁(yè)往往有很多同類tag,所以很難通過(guò)tag去區(qū)分不同的元素。
百度搜索框元素html結(jié)構(gòu):
<input type="text" class="s_ipt" name="wd" id="kw" maxlength="100" autocomplete="off">
元素定位(下面有代碼詳細(xì),此處僅簡(jiǎn)單展示方法):
element = web.find_elements(By.TAG_NAME,"input")
由于百度首頁(yè)有很多標(biāo)簽名字都是”input",因此上述代碼只會(huì)定位到網(wǎng)頁(yè)的第一個(gè)“input”標(biāo)簽。
(五)根據(jù)link text定位
通過(guò)超鏈接的文本定位元素。
百度上方超鏈接”新聞“元素如圖所示:
百度上方超鏈接”新聞“元素元素html結(jié)構(gòu):
<a href="http://news.baidu.com" target="_blank" class="mnav c-font-normal c-color-t">新聞</a>
元素定位(下面有代碼詳細(xì),此處僅簡(jiǎn)單展示方法):
element = web.find_element(By.LINK_TEXT,"新聞")
(六)根據(jù)partial link text定位
有時(shí)候一個(gè)超鏈接的文本很長(zhǎng),我們?nèi)绻枯斎?,既麻煩,又顯得代碼很不美觀,這時(shí)候我們就可以只截取一部分字符串,進(jìn)行模糊匹配。
百度上方超鏈接”新聞“元素html結(jié)構(gòu):
<a href="http://news.baidu.com" target="_blank" class="mnav c-font-normal c-color-t">新聞</a>
元素定位(下面有代碼詳細(xì),此處僅簡(jiǎn)單展示方法):
element = web.find_element(By.LINK_TEXT,"新")
(七)根據(jù)XPath定位
Xpath是一種在XML和HTML文檔中查找信息的語(yǔ)言,通過(guò)Xpath路徑來(lái)定位元素的時(shí)候也是分絕對(duì)路徑和相對(duì)路徑。
XPath比較復(fù)雜,但十分好用,具體可看小編的另一篇文章:
百度搜索框元素html結(jié)構(gòu):
<input type="text" class="s_ipt" name="wd" id="kw" maxlength="100" autocomplete="off">
xpath定位表達(dá)式:
//*[@id="kw"]
Python通過(guò)xpath定位語(yǔ)句:
element = web.find_element(By.XPATH,'//*[@id="kw"]')
(八)根據(jù)css selector定位
css selector可以通過(guò)很多方式定位元素
ID:
element = web.find_element(By.CSS_SELECTOR,"#kw")
class name:
element = web.find_element(By.CLASS_NAME,"s_ipt")
屬性選擇器:
根據(jù)標(biāo)簽中的屬性來(lái)定位元素, 格式: [屬性名=”屬性值”],或標(biāo)簽名[屬性名=屬性值]。如果屬性是唯一的,那么標(biāo)簽名可以不用寫(xiě)。
百度搜索框元素html結(jié)構(gòu):
<input type="text" class="s_ipt" name="wd" id="kw" maxlength="100" autocomplete="off">
元素定位:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-461728.html
element = web.find_element_by_css_selector('[id="kw"]')
element = web.find_element_by_css_selector('input[id="kw"]')
三、代碼示例
"""
元素定位:
ID = "id" 通過(guò)id元素定位
XPATH = "xpath" 通過(guò)xpath定位
LINK_TEXT = "link text" 通過(guò)鏈接文本定位
PARTIAL_LINK_TEXT = "partial link text" 通過(guò)部分鏈接文本定位
NAME = "name" 通過(guò)標(biāo)簽名稱定位
TAG_NAME = "tag name" 通過(guò)標(biāo)簽名稱定位
CLASS_NAME = "class name" 通過(guò)css class定位
CSS_SELECTOR = "css selector" 通過(guò)css選擇器
"""
from time import sleep
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
class TestCase(object):
def setup(self):
"""
Service: 傳入 chromedriver 的路徑
driver: 創(chuàng)建會(huì)話 session 和 將后續(xù)的代碼傳入到 chromedriver 并且執(zhí)行
:return:
"""
service = Service(executable_path=ChromeDriverManager().install())
self.driver = webdriver.Chrome(service=service)
self.driver.get("https://www.baidu.com/")
self.driver.maximize_window()
def teardown(self):
self.driver.quit() #在case執(zhí)行完后關(guān)閉瀏覽器
# todo 通過(guò)id元素定位 id 是唯一的
def test_id(self):
# 1 對(duì)象 driver 2 element
element = self.driver.find_element(By.ID, "kw") #kw為ID內(nèi)容,通過(guò)抓包取得,此條為搜索框
element.send_keys("任意內(nèi)容") #填入搜索框的內(nèi)容
print(dir(element))
print(type(element))
# <class 'selenium.webdriver.remote.webelement.WebElement'>#element類型
self.driver.find_element(By.ID, "su").click()
sleep(2) #頁(yè)面展示兩秒,可根據(jù)需求自行調(diào)節(jié)
# todo 通過(guò)標(biāo)簽名稱定位 name 方法可能定位到多個(gè)元素,返回第一個(gè)
def test_name(self):
ele = self.driver.find_elements(By.NAME,"wd") #wd為name內(nèi)容,通過(guò)抓包取得,此條為搜索框
print(ele)
ele[0].send_keys("任意內(nèi)容") #填入搜索框的內(nèi)容
self.driver.find_element(By.ID,"su").click()
sleep(3)
# todo 通過(guò)鏈接文本定位
def test_link_text(self):
sleep(4)
self.driver.find_element(By.LINK_TEXT,"登錄").click()
sleep(4)
# todo 通過(guò)部分鏈接文本定位
def test_partial_link_text(self):
self.driver.find_element(By.PARTIAL_LINK_TEXT,"登").click()
sleep(3)
# todo 通過(guò)標(biāo)簽名稱定位 返回一個(gè)標(biāo)簽列表 通過(guò)下表可以取值
def test_tag_name(self):
input = self.driver.find_elements(By.TAG_NAME,"input")
print(input)
sleep(3)
#todo 通過(guò)xpath定位 路徑
def test_xpath(self):
sleep(2)
self.driver.find_element(By.XPATH,'//a[span="4"]').click()
sleep(3)
self.driver.find_element(By.XPATH,'//ur[@class="s-hotsearch-content]/li[4]').click()
sleep(3)
#todo 通過(guò)css選擇器
def test_css_selector(self):
self.driver.find_element(By.CSS_SELECTOR,"#kw").send_keys("任意內(nèi)容")
self.driver.find_element(By.ID,"su").click()
sleep(3)
self.driver.close()
#todo 通過(guò)css class定位
def test_class_name(self):
self.driver.find_element(By.CLASS_NAME,"s_ipt").send_keys('任意內(nèi)容')
self.driver.find_element(By.CLASS_NAME,"s_btn").click()
sleep(3)
self.driver.close()
到了這里,關(guān)于Selenium元素定位——八大方法詳述的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!