歡迎您光臨本站 註冊首頁

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

←手機掃碼閱讀     niceskyabc @ 2020-05-12 , reply:0

Selenium對網頁的控制是基於各種前端元素的,在使用過程中,對於元素的定位是基礎,只有準去抓取到對應元素才能進行後續的自動化控制,我在這裡將對各種元素定位方式進行總結歸納一下。
這裡將統一使用百度首頁(www.baidu.com)進行示例,f12可以檢視具體前端程式碼。
WebDriver8種基本元素定位方式
find_element_by_id()
採用id屬性進行定位。例如在百度頁面中輸入關鍵字 Selenium 進行搜尋。百度部分關鍵原始碼如下:
可以看到輸入框和百度一下的按鈕都有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()
根據name元素和class的名字進行定位,這兩種定位方式和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的一種實現方式,所以xpath是一種非常強大的定位方式。xpath也分幾種不同型別的定位方法。
一種是絕對路徑定位。這種定位方式是利用html標籤名的層級關係來定位元素的絕對路徑,一般從標籤開始依次往下進行查詢。如百度搜索框的絕對路徑xpath定位可以是這樣的: find_element_by_xpath("/html/body/div[1]/div[1]/div/div[1]/div/form/span[1]/input")
還有一種是利用元素屬性來進行xpath定位,搜尋框還可以利用id和name屬性去定位:
find_element_by_xpath("//input[@id='kw']") find_element_by_xpath("//*[@name='wd']")
其中的標籤名input也可以用*來代替,而且只要是在該標籤內,任意屬性都可以,比如搜尋框的maxlength屬性:
find_element_by_xpath("//input[@maxlength='255']")
有的時候我們會發現絕對路徑定位路徑太長,而且光憑路徑完全不可以猜測到其指向的具體頁面元素,如果只有單純的元素屬性不一定可以每次查詢的元素都可以又唯一的屬性去方便定位,這個時候我們可以將這兩種定位方式結合起來使用。
比如查詢搜尋框的時候發現其上級元素form又唯一的id方便定位,就可以先查詢到form元素然後依次往下寫路徑:
find_element_by_xpath("//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基礎的話就應該可以看懂,一般class是用.標記,id是用#標記,標籤名直接寫具體標籤名就好了。
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標籤,在這個標籤下面有一個id為su的input標籤,這樣就定位到了。
值得注意的是,在css裡面下級標籤元素用>連線,如果class裡面有空格,空格用.進行連線。
find_element_by_tag_name ()
透過標籤名去定位的方式一般是這樣的: find_element_by_tag_name("input")
可見僅僅透過標籤名去定位時,一般一種標籤在一個頁面裡面會出現不止一次甚至大量出現,這種定位方式的作用不是很大,所以用的也就比較少。
find_element_by_link_text()
find_element_by_partial_link_text()
這兩種定位方式是專門用於定位超連結的,也就是對應html頁面中的標籤,括號裡傳的值就是a標籤中的超連結文字,兩者的區別在於一個是完整的超連結文字,一個是可以只寫部分超連結文字。
比如點選百度首頁中右上角的新聞超連結,可以這樣去定位:
driver.find_element_by_link_text("新聞").click() driver.find_element_by_partial_link_text("聞").click()
By定位
透過對上面8種基本元素定位方式的學習,在使用過程種可以根據實際的情況去選擇對應的的定位方式,我們可以用By來設定定位策略,具體語法如下:
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,"//*[@class='bg s_btn']") find_element(By.CSS_SELECTOR,"span.bg s_btn_wr>input#su")
上面這些使用的前提是需要匯入By類:from selenium.webdriver.common.by import By
最簡單粗暴卻失傳已久的8種定位
據說這種定位方式在江湖上都快要失傳了,實在想不通為什麼,明明寫起來最簡單粗暴啊~
driver.find_element("name","wd").send_keys("Selenium2") driver.find_element("id","su").click()
相信透過上面的兩隻栗子,大家一定會和我一樣覺得這種方式的定位實在是太省事了~只要寫find_element就好啦,下面我們來總結一下這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複數定位
在上面的例舉的八中基本定位方式種,都有對應的複數形式,分別是下面這些:
id複數定位find_elements_by_id()
name複數定位find_elements_by_name()
class複數定位find_elements_by_class_name()
tag複數定位find_elements_by_tag_name()
link複數定位find_elements_by_link_text()
partial_link複數定位find_elements_by_partial_link_text()
xpath複數定位find_elements_by_xpath()
css複數定位find_elements_by_css_selector()
這些複數定位方式每次取到的都是具有相同型別屬性的一組元素,所以返回的是一個list佇列,我們也可以利用這個去定位單個的元素。比如百度首頁種,右上角有新聞、影片、地圖、貼吧等一些連結,我們透過f12檢視原始碼可以發現,這些連結都有共同的class, 。
舉個例子,比如定位排在第六個的學術,可以這樣定位:driver.find_elements_by_class_name("mnav")[5].click()
還可以透過css的複數定位寫法:driver.find_elements("css selector",".mnav")[6].click()
當然,也可以藉助pop()函式,一般pop()或pop(-1)表示獲取元素種的最後一個,pop(2)表示第三個:
driver.find_elements("css selector",".mnav").pop().click()
JS的5種定位方式總結
其實看到這裡,上面的定位方式應該就基本夠用了,但是有的時候就是會出現一些詭異的定位失效或者定位到了點選失效的問題,這個時候如果用js進行直接執行該事件,往往就可以解決那些詭異的事情~
id定位:document.getElementById()
name定位:document.getElementsByName()
tag定位:document.getElementsByTagName()
class定位:document.getElementsByClassName()
css定位:document.querySelectorAll()
其中只有id物件用的是Element返回是單個物件,其他都是Elements返回的是一個list這點千萬要注意,具體用法和上面的webdriver基礎定位一樣。先寫好對應的js語句,可以先賦值給一個變數,然後後呼叫execute_script進行執行一下js就好了,下面還是結合那個百度搜索的栗子,我寫的指令碼,可以對應學習實驗一下:
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)
以上分別結合常用的四種js定位方式寫了四條js語句,然後要執行的就execute_script一下就好啦~
超神的jQuery定位
據說會jQuery定位的在定位的路上就是披襟斬棘,所向披靡~如此超神的定位,還是可以瞭解一下的~
jQuery語法是為HTML元素的選取編制的,可以對元素執行一些具體的操作
基礎語法是$(selector).action()
$符號定義jQuery,selector選擇器用來查詢具體的HTML元素,透過action()來執行對元素的具體操作。
其中我們經常用到的action()在jq中有這麼幾種:
$(selector).val('input_value') 其中input_value表示要輸入的文字的值
$(selector).val('') 如果為空,則執行後是清空的意思
$(selector).click() 行為也是肯定有的
讓我們結合百度的栗子看一下,用jQuery的寫法和js有一點點的類似,但明顯簡潔多了:
search_jq = "$('#kw').val('selenium')" button_jq = "$('.s_btn').click()" driver.execute_script(search_jq) driver.execute_script(button_jq)
以上就是對webdriver的一些基本定位方式總結,我們再來回顧一下:
分別是……
8種webdriver的基本地位方式,還有對應的8種複數定位,js有5中定位方式,還有超神的jQuery定位,當然,不要忘了快要失傳的那8種定位,一共是30種,在實際應用中,總有一種適合你。


[niceskyabc ] Selenium元素定位的30種方式(史上最全)已經有394次圍觀

http://coctec.com/docs/python/shhow-post-234085.html