『心善淵』Selenium3.0基礎 — 4、Selenium元素定位詳解


1、什么是元素定位

  • 元素定位就是查找HTML元素的過程。
  • HTML元素指的是從開始標簽(start tag)到結束標簽(end tag)的所有代碼。
  • 操作頁面元素之前,首先要對元素進行定位,所以定位是自動化腳本編寫的開始。
  • 通常使用find_elementfind_elements 方法來定位元素。
    • find_element使用給定的方法定位和查找一個元素
    • find_elements使用給定的方法定位和查找所有元素,並以列表(list)的形式返回。

2、Selenium元素定位常用API

(1)By_id 定位

說明

當所定位的元素具有id屬性的時候我們可以通過by_id來定位該元素。

例如:打開百度首頁,定位搜索框。

image

搜索框頁面源代碼:屬性id值為kw

<input type="text" class="s_ipt" name="wd" id="kw" maxlength="255" autocomplete="off">

示例

"""
1.學習目標
    必須掌握selenium中元素定位方法,id定位方法
2.操作步驟(語法)通過元素id屬性定位
    driver.find_element_by_id(id屬性的值)
3.需求
    在百度頁面中使用id屬性定位百度輸入框
"""
# 1.導入selenium
from selenium import webdriver
from time import sleep

# 2.打開瀏覽器(獲取瀏覽器對象)
driver = webdriver.Chrome()

# 3.輸入網址
url = "http://www.baidu.com"
driver.get(url)
sleep(2)

# 4.元素定位(id定位方法),百度輸入框
"""
注意:
如果有多個相同屬性值的元素,單數形式,定位第一個.
"""
srk = driver.find_element_by_id("kw")
# 打印srk對象
print(srk)

# 查看元素對應的源碼
print(srk.get_attribute("outerHTML"))

# 5.關團瀏覽器
driver.quit()

"""
輸出結果:
 <selenium.webdriver.remote.webelement.WebElement 
 (session="6fbad6d63614e1cae6cd346153a7105e", 
 element="0dd374b6-74ed-4f4c-b610-5c772fd8c366")>
 
 我們可以看到srk是一個WebElement類型的對象。
 查看元素對應的源碼如下:
 <input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">
 
 說明我們已經把百度首頁的輸入框獲取到了。
"""

復數形式

"""
學習目標
    復數形式
        復數定位形式:driver.find_elements_XXX
        復數定位,返回的列表類型數據<list>
        遍歷列表操作具體元素
"""
# 1.導入selenium
from selenium import webdriver
from time import sleep

# 2.打開瀏覽器
driver = webdriver.Chrome()
# 3.輸入網址
url = "http://www.baidu.com"
driver.get(url)
sleep(2)

# 4.通過by_id復數定位
srk = driver.find_elements_by_id("kw")
# 5.查看返回結果數據類型
print("結果數據類型", type(srk))
print("元素個數", len(srk))

# 6.遍歷結果,查看源碼
for i in srk:
    # 查看元素對應的源碼
    print(i.get_attribute("outerHTML"))

# 7.關團瀏覽器
driver.quit()

"""
結果數據類型 <class 'list'>
元素個數 1
<input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">
"""

異常總結

異常1:
AttributeError:'list' object has no attribute 'get_attribute' :
表示定位元素返回的是一個列表格式,原因:使用復數定位方式 find_elements獲取的定位

異常2
NoSuchElementException :
表示元素沒找到元素,原因是定位方式出現問題,有一種情況是屬性值寫錯了。

(2)by_name 定位

說明

當所定位的元素具有name屬性的時候,我們可以通過by_name來定位該元素。

如上圖中的百度搜索頁面,搜索框頁面源代碼:屬性name值為wd

<input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">

示例

使用name屬性定位百度搜索框。

"""
1.學習目標:
    必須掌握selenium的元素定位方法by_name
2.語法
    name定位
    driver.find_element_by_name(name屬性的值)
3.需求
    使用name屬性定位百度搜索框
4.總結
    當元素中有name屬性時才能使用上述定位方法
"""
# 1.導入selenium
from selenium import webdriver
from time import sleep

# 2.打開瀏覽器(獲取瀏覽器對象)
driver = webdriver.Chrome()

# 3.輸入網址
url = "http://www.baidu.com"
driver.get(url)
sleep(2)

# 4. 使用name定位百度搜索框
"""
注意:
如果有多個相同屬性值的元素,單數形式,定位第一個.
"""
srk = driver.find_element_by_name("wd")
# 打印srk對象
print(srk)

# 打印定位元素所在行的源碼
print(srk.get_attribute("outerHTML"))

# 5.關閉瀏覽器
driver.quit()

"""
輸出結果:
<selenium.webdriver.remote.webelement.WebElement 
(session="3149d334336f0eab9e4d8d394e4efd72",
 element="0.1359081202533734-1")>
 
<input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">
"""

復數形式

"""
學習目標
    復數形式
        復數定位形式:driver.find_elements_XXX
        復數定位,返回的列表類型數據<list>
        遍歷列表操作具體元素
"""
# 1.導入selenium
from selenium import webdriver
from time import sleep

# 2.打開瀏覽器
driver = webdriver.Chrome()
# 3.輸入網址
url = "http://www.baidu.com"
driver.get(url)
sleep(2)

# 4.通過by_id復數定位
srk = driver.find_elements_by_name("wd")
# 5.查看返回結果數據類型
print("結果數據類型", type(srk))
print("元素個數", len(srk))

# 6.遍歷結果,查看源碼
for i in srk:
    # 查看元素對應的源碼
    print(i.get_attribute("outerHTML"))

# 7.關團瀏覽器
driver.quit()

"""
結果數據類型 <class 'list'>
元素個數 1
<input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">
"""

(3)by_class_name 定位

說明

當所定位的元素具有class屬性的時候,我們可以通過by_class_name來定位該元素。

搜索框頁面源代碼:屬性classname值為s_ipt

<input type="text" class="s_ipt" name="wd" id="kw" maxlength="255" autocomplete="off">

示例

使用class屬性定位百度搜索框。

"""
1.學習目標:
    必須掌握selenium的元素定位方法by_class_name
2.語法
    classname定位
    driver.find_element_by_class_name(class屬性值)
3.需求
    使用class屬性定位百度搜索框
4.總結
    當元素中有class屬性時才能使用上述定位方法
"""
# 1.導入selenium
from selenium import webdriver
from time import sleep

# 2.打開瀏覽器(獲取瀏覽器對象)
driver = webdriver.Chrome()

# 3.輸入網址
url = "http://www.baidu.com"
driver.get(url)
sleep(2)

# 4. 使用name定位百度搜索框
"""
注意:
如果有多個相同屬性值的元素,單數形式,定位第一個.
"""
srk = driver.find_element_by_class_name("s_ipt")
# 打印srk對象
print(srk)

# 查看元素對應的源碼
print(srk.get_attribute("outerHTML"))

# 5.關閉瀏覽器
driver.quit()

"""
輸出結果:
<selenium.webdriver.remote.webelement.WebElement 
(session="e4f97a48e7f113e681950b62c7789966", 
element="0.5782514739919584-1")>

<input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">
"""

復數形式

"""
學習目標
    復數形式
        復數定位形式:driver.find_elements_XXX
        復數定位,返回的列表類型數據<list>
        遍歷列表操作具體元素
"""
# 1.導入selenium
from selenium import webdriver
from time import sleep

# 2.打開瀏覽器
driver = webdriver.Chrome()

# 3.輸入網址
url = "http://www.baidu.com"
driver.get(url)
sleep(2)

# 4.通過by_id復數定位
srk = driver.find_elements_by_class_name("s_ipt")
# 5.查看返回結果數據類型
print("結果數據類型", type(srk))
print("元素個數", len(srk))

# 6.遍歷結果,查看源碼
for i in srk:
    # 查看元素對應的源碼
    print(i.get_attribute("outerHTML"))

# 7.關團瀏覽器
driver.quit()

"""
結果數據類型 <class 'list'>
元素個數 1
<input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">
"""

(4)by_tag_name 定位

說明

by_tag_name方法可以通過元素的標簽名來查找元素。由於搜索到的標簽名通常不止一個,所以一般結合使用find_elements方法來使用。

假設頁面中有一個button按鈕。

<button type="submitA" value="注冊A" title="加入會員A">注冊用戶A</button>

示例

"""
1.學習目標:
    必須掌握selenium中tag_name定位方法
2.語法
    driver.find_element_by_tag_name(標簽名)  # 單數形式
    driver.find_elements_by_tag_name(標簽名)  # 定位一組標簽名相同的元素
3.需求
    在頁面中,使用tag_name對按鈕注冊用戶A定位
"""
# 1.導入selenium
from selenium import webdriver
from time import sleep
import os

# 2.打開瀏覽器(獲取瀏覽器對象)
driver = webdriver.Chrome()

# 3.打開注冊A頁面
url = "file:///" + os.path.abspath("./練習頁面/注冊A.html")
driver.get(url)
sleep(2)

# 4.使用tag_name定位按鈕
"""
注意:
如果有多個相同標簽的元素,單數形式,定位第一個.
"""
button = driver.find_element_by_tag_name("input")
print(button.get_attribute("outerHTML"))

# 5.關閉瀏覽器
sleep(2)
driver.quit()

"""
輸出結果:
<input type="textA" name="userA" id="userA" placeholder="賬號A" required="" value="">
"""

復數形式

"""
1.學習目標:
    必須掌握selenium中tag_name定位方法
2.語法
    driver.find_element_by_tag_name(標簽名)  # 單數形式
    driver.find_elements_by_tag_name(標簽名)  # 定位一組標簽名相同的元素
3.需求
    在頁面中,使用tag_name復數形式定位 input標簽
"""
# 1.導入selenium
from selenium import webdriver
from time import sleep
import os

# 2.打開瀏覽器
driver = webdriver.Chrome()

# 3.打開注冊A頁面
url = "file:///" + os.path.abspath("./練習頁面/注冊A.html")
driver.get(url)
sleep(2)

# 4.使用tag_name復數形式定位 input標簽
input_elements = driver.find_elements_by_tag_name("input")
# 查看結果類型
print(type(input_elements))
print(len(input_elements))

# 5.遍歷列表打印每個元素的源碼
for element in input_elements:
    print(element.get_attribute("outerHTML"))

# 6.關閉瀏覽器
driver.quit()

"""
輸出結果:
<class 'list'>
16
<input type="textA" name="userA" id="userA" placeholder="賬號A" required="" value="">
<input type="password" name="passwordA" id="passwordA" placeholder="密碼A" value="">
<input type="telA" name="telA" id="telA" placeholder="電話A" class="telA" value="">
<input type="emailA" name="emailA" id="emailA" placeholder="電子郵箱A" value="">
......等等
"""

總結

tag_name定位:

  • 單數形式
    當頁面中如果定位的標簽是唯一的,可以直接使用tag_name方法定位。
    如果所定位的標簽在頁面中的索引位置是第一個,也可以用tag_name方法定位。
  • 復數形式
    復數定位形式:driver.find_elements_XXX
    復數定位,返回的列表類型數據。
    遍歷列表操作具體元素。

說明

by_link_text通過超文本鏈接上的文字信息來定位元素,這種方式一般專門用於定位頁面上的超文本鏈接。

例如打開百度首頁,定位點擊超鏈接地圖。

超鏈接地圖源代碼:

<a class="mnav" name="tj_trmap" href="http://map.baidu.com">地圖</a>

示例

腳本代碼需求:使用link_text定位百度首頁地圖鏈接。

"""
1.學習目標:
    必須掌握selenium中超鏈接的定位方法
2.語法
    link_text  # 需要鏈接的全部文本
    driver.find_element_by_link_text(全部文本)
3.需求
    在頁面中,使用定位連接的方法,訪問百度網站,定位點擊超鏈接地圖。
"""
# 1.導入selenium
from selenium import webdriver
from time import sleep
import os

# 2.打開瀏覽器
driver = webdriver.Chrome()

# 3.打開頁面
url = "http://www.baidu.com"
driver.get(url)
sleep(2)

# 4.使用link_text定位
"""
注意:
連接的全部文本,表示<a>標簽中的全部內容,有空格也要算。
如果有相同部分文本的元素,單數形式,定位第一個。
"""
linkText = driver.find_element_by_link_text("地圖")
print(linkText.get_attribute("outerHTML"))

# 5.關閉瀏覽器
driver.quit()

"""
輸出結果:
<a href="http://map.baidu.com" target="_blank" class="mnav c-font-normal c-color-t">地圖</a>
"""

復數形式

# 定位一組標超鏈接文本全部內容相同的元素,很少用到。
# 1.導入selenium
from selenium import webdriver
from time import sleep

# 2.打開瀏覽器
driver = webdriver.Chrome()

# 3.打開頁面
url = "http://www.baidu.com"
driver.get(url)
sleep(2)

# 4.使用link_text定位
"""
注意:
連接的全部文本,表示<a>標簽中的全部內容,有空格也要寫。
"""
linkText = driver.find_elements_by_link_text("地圖")

# 5.遍歷列表打印每個元素的源碼
for element in linkText:
    print(element.get_attribute("outerHTML"))

# 6.關閉瀏覽器
driver.quit()

"""
輸出結果:
<a href="http://map.baidu.com" target="_blank" class="mnav c-font-normal c-color-t">地圖</a>
"""

說明

當你不能准確知道超鏈接上的文本信息或者只想通過一些關鍵字進行匹配時,可以使用by_partial_link_text這個方法來通過部分鏈接文字進行匹配。

例如打開百度首頁,定位點擊超鏈接<hao123>

超鏈接地圖源代碼:在代碼里用”ao1”進行匹配

<a href="https://www.hao123.com" target="_blank" class="mnav c-font-normal c-color-t">hao123</a>

示例

腳本代碼:使用partial_link_text方法定位百度首頁<hao123>鏈接

"""
1.學習目標:
    必須掌握selenium中超鏈接的定位方法
2.語法
    partial_link_text  # 需要連接部分文本
    driver.find_element_by_partial_link_text(部分文本)
        部分文本必須是連續的文字(中可包含空格)
3.需求
    在頁面中,使用定位連接的方法,訪問百度網站,定位點擊超鏈接<hao123>。
"""
# 1.導入selenium
from selenium import webdriver
from time import sleep

# 2.打開瀏覽器
driver = webdriver.Chrome()

# 3.打開頁面
url = "http://www.baidu.com"
driver.get(url)
sleep(2)

# 4.使用by_partial_link_text定位
"""
注意:
連接的部分文本,表示<a>標簽中的連續的部分內容,之中有空格也要算。
如果有相同部分文本的元素,單數形式,定位第一個。
"""
pLinkText = driver.find_element_by_partial_link_text("ao1")
print(pLinkText.get_attribute("outerHTML"))

# 6.關閉瀏覽器
sleep(2)
driver.quit()

"""
輸出結果:
<a href="https://www.hao123.com" target="_blank" class="mnav c-font-normal c-color-t">hao123</a>
"""

復數形式

# 定位一組標超鏈接文本目標內容相同的元素,很少用到。
# 1.導入selenium
from selenium import webdriver
from time import sleep

# 2.打開瀏覽器
driver = webdriver.Chrome()

# 3.打開頁面
url = "http://www.baidu.com"
driver.get(url)
sleep(2)

# 4.使用by_partial_link_text定位
"""
注意:
連接的部分文本,表示<a>標簽中的連續的部分內容,之中有空格也要算。
"""
pLinkText = driver.find_elements_by_partial_link_text("ao1")

# 5.遍歷列表打印每個元素的源碼
for element in pLinkText:
    print(element.get_attribute("outerHTML"))

# 6.關閉瀏覽器
driver.quit()

"""
輸出結果:
<a href="https://www.hao123.com" target="_blank" class="mnav c-font-normal c-color-t">hao123</a>
"""

以上就是Selenium中基礎元素定位的常用API。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM