最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Selenium元素定位的30種方式(史上最全)

 更新時間:2020年05月11日 14:46:37   作者:我的豬很厲害的  
這篇文章主要介紹了Selenium元素定位的30種方式,中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

Selenium對網(wǎng)頁的控制是基于各種前端元素的,在使用過程中,對于元素的定位是基礎(chǔ),只有準(zhǔn)去抓取到對應(yīng)元素才能進(jìn)行后續(xù)的自動化控制,我在這里將對各種元素定位方式進(jìn)行總結(jié)歸納一下。

這里將統(tǒng)一使用百度首頁(www.baidu.com)進(jìn)行示例,f12可以查看具體前端代碼。

WebDriver8種基本元素定位方式

find_element_by_id()

采用id屬性進(jìn)行定位。例如在百度頁面中輸入關(guān)鍵字 Selenium 進(jìn)行搜索。百度部分關(guān)鍵源碼如下:

<span class="bg s_ipt_wr quickdelete-wrap">
    <span class="soutu-btn"></span>
    <input id="kw" class="s_ipt" autocomplete="off" maxlength="255" value="" name="wd">
    <a id="quickdelete" class="quickdelete" href="javascript:;" rel="external nofollow" title="清空" style="top: 0px; right: 0px; display: none;"></a>
</span>
<span class="bg s_btn_wr">
    <input id="su" class="bg s_btn" type="submit" value="百度一下">
</span>

可以看到輸入框和百度一下的按鈕都有id,那么定位代碼如下:

#coding=utf-8
from selenium import webdriver
import time
from selenium.webdriver.common.by import By
 
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get("http://www.baidu.com")
 
driver.find_element_by_id("kw").send_keys("Selenium")
driver.find_element_by_id("su").click()
 
time.sleep(2)
driver.quit()

find_element_by_name()

 find_element_by_class_name() 

根據(jù)name元素和class的名字進(jìn)行定位,這兩種定位方式和id定位相似,在前端代碼中,id、name和class一般都至少會有其中的一種,比如百度的搜索框具有name屬性,我們可以用name定位搜索款,class定位百度一下的按鈕:

driver.find_element_by_name("wd").send_keys("Python")
driver.find_element_by_class_name("s_btn").click()

find_element_by_xpath() 

xpath是XML路徑語言,它可以用來確定xml文檔中的元素位置,通過元素的路徑來完成對元素的查找。HTML就是XML的一種實(shí)現(xiàn)方式,所以xpath是一種非常強(qiáng)大的定位方式。xpath也分幾種不同類型的定位方法。

一種是絕對路徑定位。這種定位方式是利用html標(biāo)簽名的層級關(guān)系來定位元素的絕對路徑,一般從<html>標(biāo)簽開始依次往下進(jìn)行查找。如百度搜索框的絕對路徑xpath定位可以是這樣的:find_element_by_xpath("/html/body/div[1]/div[1]/div/div[1]/div/form/span[1]/input")

還有一種是利用元素屬性來進(jìn)行xpath定位,搜索框還可以利用id和name屬性去定位:

find_element_by_xpath("http://input[@id='kw']")

find_element_by_xpath("http://*[@name='wd']")

其中的標(biāo)簽名input也可以用*來代替,而且只要是在該標(biāo)簽內(nèi),任意屬性都可以,比如搜索框的maxlength屬性:

find_element_by_xpath("http://input[@maxlength='255']")

有的時候我們會發(fā)現(xiàn)絕對路徑定位路徑太長,而且光憑路徑完全不可以猜測到其指向的具體頁面元素,如果只有單純的元素屬性不一定可以每次查找的元素都可以又唯一的屬性去方便定位,這個時候我們可以將這兩種定位方式結(jié)合起來使用。

比如查找搜索框的時候發(fā)現(xiàn)其上級元素form又唯一的id方便定位,就可以先查找到form元素然后依次往下寫路徑:

find_element_by_xpath("http://form[@id='form']/span/input")

這種定位方式的使用過程中,如果元素的單個屬性無法確定其唯一性,可以用and連接多個屬性去確定。

find_element_by_css_selector()

CSS屬性定位可以比較靈活地選擇控件的任意屬性,定位方式也會比xpath快。

同樣是那個百度搜索的例子,可以試一下:

driver.find_element_by_css_selector(".s_ipt").send_keys("selenium")
driver.find_element_by_css_selector("#su").click()

如果有css基礎(chǔ)的話就應(yīng)該可以看懂,一般class是用.標(biāo)記,id是用#標(biāo)記,標(biāo)簽名直接寫具體標(biāo)簽名就好了。

css定位里面也可以通過屬性或者組合方式定位:

driver.find_element_by_css_selector("input[autocomplete='off']").send_keys("Python")
driver.find_element_by_css_selector("span.bg.s_btn_wr>input#su").click()

具體說一下百度一下那個按鈕的組合定位方式,這樣寫的定位順序是這樣的,先定位到一個class名為bg s_btn_wr的span標(biāo)簽,在這個標(biāo)簽下面有一個id為su的input標(biāo)簽,這樣就定位到了。

值得注意的是,在css里面下級標(biāo)簽元素用>連接,如果class里面有空格,空格用.進(jìn)行連接。

find_element_by_tag_name ()

通過標(biāo)簽名去定位的方式一般是這樣的:find_element_by_tag_name("input")
可見僅僅通過標(biāo)簽名去定位時,一般一種標(biāo)簽在一個頁面里面會出現(xiàn)不止一次甚至大量出現(xiàn),這種定位方式的作用不是很大,所以用的也就比較少。

find_element_by_link_text()

find_element_by_partial_link_text()

這兩種定位方式是專門用于定位超鏈接的,也就是對應(yīng)html頁面中的<a>標(biāo)簽,括號里傳的值就是a標(biāo)簽中的超鏈接文字,兩者的區(qū)別在于一個是完整的超鏈接文字,一個是可以只寫部分超鏈接文字。

比如點(diǎn)擊百度首頁中右上角的新聞超鏈接,可以這樣去定位:

driver.find_element_by_link_text("新聞").click()
driver.find_element_by_partial_link_text("聞").click()

By定位

通過對上面8種基本元素定位方式的學(xué)習(xí),在使用過程種可以根據(jù)實(shí)際的情況去選擇對應(yīng)的的定位方式,我們可以用By來設(shè)置定位策略,具體語法如下:

find_element(By.ID,"kw")
find_element(By.NAME,"wd")
find_element(By.CLASS_NAME,"s_ipt")
find_element(By.TAG_NAME,"input")
find_element(By.LINK_TEXT,u"新聞")
find_element(By.PARTIAL_LINK_TEXT,u"新")
find_element(By.XPATH,"http://*[@class='bg s_btn']")
find_element(By.CSS_SELECTOR,"span.bg s_btn_wr>input#su") 

上面這些使用的前提是需要導(dǎo)入By類:from selenium.webdriver.common.by import By

最簡單粗暴卻失傳已久的8種定位

據(jù)說這種定位方式在江湖上都快要失傳了,實(shí)在想不通為什么,明明寫起來最簡單粗暴啊~

driver.find_element("name","wd").send_keys("Selenium2")
driver.find_element("id","su").click()

相信通過上面的兩只栗子,大家一定會和我一樣覺得這種方式的定位實(shí)在是太省事了~只要寫find_element就好啦,下面我們來總結(jié)一下這8種寫法與基本定位方法類比過來該怎么寫:

by_id -> find_element("id","")

by_xpath -> find_element("xpath","")

by_link_text -> find_element("link text","")

by_partial_text -> find_element("partial link text","")

by_name -> find_element("name","")

by_tag_name -> find_element("tag name","")

by_class_name -> find_element("class name","")

by_css_selector -> find_element("css selector","")

elements復(fù)數(shù)定位

在上面的例舉的八中基本定位方式種,都有對應(yīng)的復(fù)數(shù)形式,分別是下面這些:

id復(fù)數(shù)定位find_elements_by_id()
name復(fù)數(shù)定位find_elements_by_name()
class復(fù)數(shù)定位find_elements_by_class_name()
tag復(fù)數(shù)定位find_elements_by_tag_name()
link復(fù)數(shù)定位find_elements_by_link_text()
partial_link復(fù)數(shù)定位find_elements_by_partial_link_text()
xpath復(fù)數(shù)定位find_elements_by_xpath()
css復(fù)數(shù)定位find_elements_by_css_selector()

這些復(fù)數(shù)定位方式每次取到的都是具有相同類型屬性的一組元素,所以返回的是一個list隊列,我們也可以利用這個去定位單個的元素。比如百度首頁種,右上角有新聞、視頻、地圖、貼吧等一些鏈接,我們通過f12查看源碼可以發(fā)現(xiàn),這些鏈接都有共同的class, 。


舉個例子,比如定位排在第六個的學(xué)術(shù),可以這樣定位:driver.find_elements_by_class_name("mnav")[5].click()

還可以通過css的復(fù)數(shù)定位寫法:driver.find_elements("css selector",".mnav")[6].click()

當(dāng)然,也可以借助pop()函數(shù),一般pop()或pop(-1)表示獲取元素種的最后一個,pop(2)表示第三個:

driver.find_elements("css selector",".mnav").pop().click()

JS的5種定位方式總結(jié)

其實(shí)看到這里,上面的定位方式應(yīng)該就基本夠用了,但是有的時候就是會出現(xiàn)一些詭異的定位失效或者定位到了點(diǎn)擊失效的問題,這個時候如果用js進(jìn)行直接執(zhí)行該事件,往往就可以解決那些詭異的事情~

id定位:document.getElementById()
name定位:document.getElementsByName()
tag定位:document.getElementsByTagName()
class定位:document.getElementsByClassName()
css定位:document.querySelectorAll()

其中只有id對象用的是Element返回是單個對象,其他都是Elements返回的是一個list這點(diǎn)千萬要注意,具體用法和上面的webdriver基礎(chǔ)定位一樣。先寫好對應(yīng)的js語句,可以先賦值給一個變量,然后后調(diào)用execute_script進(jìn)行執(zhí)行一下js就好了,下面還是結(jié)合那個百度搜索的栗子,我寫的腳本,可以對應(yīng)學(xué)習(xí)實(shí)驗(yàn)一下:

search_js = "document.getElementsByName('wd')[0].value='selenium';"
search_js2 = "document.querySelectorAll('.s_ipt')[0].value='selenium';"
button_js = "document.getElementById('su').click();"
button_js2 = "document.getElementsByClassName('s_btn')[0].click()"
driver.execute_script(search_js2)
driver.execute_script(button_js2)

以上分別結(jié)合常用的四種js定位方式寫了四條js語句,然后要執(zhí)行的就execute_script一下就好啦~

超神的jQuery定位

據(jù)說會jQuery定位的在定位的路上就是披襟斬棘,所向披靡~如此超神的定位,還是可以了解一下的~

jQuery語法是為HTML元素的選取編制的,可以對元素執(zhí)行一些具體的操作

基礎(chǔ)語法是$(selector).action()

$符號定義jQuery,selector選擇器用來查詢具體的HTML元素,通過action()來執(zhí)行對元素的具體操作。

其中我們經(jīng)常用到的action()在jq中有這么幾種:

$(selector).val('input_value') 其中input_value表示要輸入的文本的值

$(selector).val('') 如果為空,則執(zhí)行后是清空的意思

$(selector).click() 行為也是肯定有的

讓我們結(jié)合百度的栗子看一下,用jQuery的寫法和js有一點(diǎn)點(diǎn)的類似,但明顯簡潔多了:

search_jq = "$('#kw').val('selenium')"
button_jq = "$('.s_btn').click()"
driver.execute_script(search_jq)
driver.execute_script(button_jq)

以上就是對webdriver的一些基本定位方式總結(jié),我們再來回顧一下:

分別是……

8種webdriver的基本地位方式,還有對應(yīng)的8種復(fù)數(shù)定位,js有5中定位方式,還有超神的jQuery定位,當(dāng)然,不要忘了快要失傳的那8種定位,一共是30種,在實(shí)際應(yīng)用中,總有一種適合你(●ˇ∀ˇ●)

到此這篇關(guān)于Selenium元素定位的30種方式(史上最全)的文章就介紹到這了,更多相關(guān)Selenium元素定位內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 只用Python就可以制作的簡單詞云

    只用Python就可以制作的簡單詞云

    今天教大家如何只用Python制作簡單詞云,文中有非常詳細(xì)的介紹及代碼示例,對正在學(xué)習(xí)python的小伙伴們很有幫助,需要的朋友可以參考下
    2021-06-06
  • Python 必須了解的5種高級特征

    Python 必須了解的5種高級特征

    Python 多好用不用多說,大家看看自己用的語言就知道了。但是 Python 隱藏的高級功能你都 get 了嗎?本文中,作者列舉了 Python 中五種略高級的特征以及它們的使用方法,快來一探究竟吧!
    2020-09-09
  • Python Excel實(shí)現(xiàn)自動添加編號

    Python Excel實(shí)現(xiàn)自動添加編號

    這篇文章主要為大家詳細(xì)介紹了如何使用Python在Excel中實(shí)現(xiàn)自動添加編號效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-03-03
  • 一小時學(xué)會TensorFlow2之自定義層

    一小時學(xué)會TensorFlow2之自定義層

    這篇文章主要介紹了TensorFlow2之自定義層,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • 詳解Python?NumPy如何使用argsort方法進(jìn)行排序

    詳解Python?NumPy如何使用argsort方法進(jìn)行排序

    NumPy提供了各種功能強(qiáng)大的數(shù)組操作方法,其中之一就是argsort方法,本文將詳細(xì)介紹argsort方法的使用,以及如何在實(shí)際項(xiàng)目中充分利用它進(jìn)行排序操作,希望對大家有所幫助
    2024-03-03
  • pandas實(shí)現(xiàn)按行遍歷dataframe的方法(itertuples,iterrows)

    pandas實(shí)現(xiàn)按行遍歷dataframe的方法(itertuples,iterrows)

    本文主要介紹了pandas實(shí)現(xiàn)按行遍歷dataframe的方法,主要介紹了兩種itertuples,iterrows,具有一定的參考價值,感興趣的可以了解一下
    2023-08-08
  • python實(shí)現(xiàn)邏輯回歸的示例

    python實(shí)現(xiàn)邏輯回歸的示例

    這篇文章主要介紹了python實(shí)現(xiàn)邏輯回歸的示例,幫助大家更好的理解和使用機(jī)器學(xué)習(xí)算法,感興趣的朋友可以了解下
    2020-10-10
  • Tensorflow 多線程設(shè)置方式

    Tensorflow 多線程設(shè)置方式

    今天小編就為大家分享一篇Tensorflow 多線程設(shè)置方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • Python自制圖像批量壓縮工具

    Python自制圖像批量壓縮工具

    這篇文章主要為大家詳細(xì)介紹了如何使用Python自制一個圖像批量壓縮工具,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-04-04
  • 詳解python的xlwings庫讀寫excel操作總結(jié)

    詳解python的xlwings庫讀寫excel操作總結(jié)

    這篇文章主要介紹了詳解python的xlwings庫讀寫excel操作總結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02

最新評論

鲁山县| 钟祥市| 茶陵县| 临潭县| 板桥市| 荆门市| 大邑县| 武汉市| 灯塔市| 宝鸡市| 新密市| 万荣县| 新邵县| 民勤县| 莫力| 怀远县| 景洪市| 普兰店市| 德昌县| 漯河市| 来宾市| 新晃| 务川| 凌海市| 神木县| 新绛县| 崇明县| 上虞市| 万年县| 庄浪县| 姜堰市| 凌云县| 加查县| 永兴县| 赞皇县| 淮阳县| 周口市| 西畴县| 盖州市| 滦平县| 宿州市|