WebDriver API元素定位


[TOC]

元素的定位和操作是自動化測試的核心部分,其中操作又是建立在定位的基礎上的。 舉例:一個對象就是一個人,我們可以通過身份證號、姓名或者他的住址找到這個人。那么web對象也是一樣的,我們可以通過唯一區別於其它元素的屬性來定位這個元素。

元素識別

一、利用Chrome瀏覽器開發者工具 1)打開Chrome瀏覽器,按F12或依次點擊菜單——更多工具——開發者工具 2)切換到Elements頁簽,在Elements下點擊左上方小箭頭可以指定頁面元素,查看對應代碼

二、利用火狐瀏覽器開發者工具 1)打開火狐瀏覽器,按F12或點擊菜單——web開發者——查看器 2)進入到查看器頁簽,在查看器下點擊左上方小箭頭可以指定頁面元素,查看對應代碼

基本元素定位API使用

#通過id定位元素
driver.find_element_by_id("id_value")

#通過name定位元素
driver.find_element_by_name("name_value")

#通過class_name定位元素
driver.find_element_by_class_name("class_name")

#通過tag_name定位元素
driver.find_element_by_tag_name("tag_name_value")
#備注:tag_name是所有定位方式中最不靠譜的一種,因為在一個頁面上相同tag_name的元素極容易出現

#通過link定位
driver.find_element_by_link_text("text_value")
driver.find_element_by_partial_link_text("text_value")
#當一個文字很長的鏈接時,我們可以只取其中的部分,只要取的部分可以唯一標識元素

#通過xpath定位元素
driver.find_element_by_xpath("xpath_syntax")

#通過css定位元素
driver.find_element_by_css_selector("css_syntax")

示例

from selenium import webdriver
driver=webdriver.Chrome()
driver.get("http://www.baidu.com")

#通過id定位元素
driver.find_element_by_id("kw").send_keys("海賊王")

#通過name定位元素
driver.find_element_by_name("wd").send_keys("海賊王")

#通過class_name定位元素
driver.find_element_by_class_name("s_ipt").send_keys("海賊王")

#通過link定位
driver.find_element_by_link_text("新聞").click()
driver.find_element_by_partial_link_text("hao").click()

XPATH

XPATH是一門在XML文檔中查找信息的語言,XPATH可用來在XML文檔中對元素和屬性進行遍歷,主流的瀏覽器都支持XPATH,因為HTML頁面在DOM中表示為XHTML文檔。

Xpath常用6種定位元素的方法

  • 絕對路徑
  • 相對路徑
  • 元素屬性
  • 元素屬性值
  • 元素索引
  • 元素文本

通過絕對路徑定位

絕對路徑的開頭是一個斜線(/),從網頁的根節點html開始,逐層去查找需要定位的元素。 此方法缺點顯而易見,當頁面元素位置發生改變時,都需要修改,因此,並不推薦使用。

舉例:百度搜索框絕對路徑定位

driver.find_element_by_xpath('/html/body/div[1]/div[1]/div/div[1]/div/form/span[1]/input').send_keys("海賊王")
#當同一層次有多個相同的元素時,使用下標區分,下標從1開始

通過相對路徑定位

相對路徑的開頭是兩個斜線(//),表示文件中所有符合模式的元素都會被選出來,即使是處於樹中不同層級也會被選出來。

舉例:百度搜索框相對路徑定位

driver.find_element_by_xpath('//span[1]/input').send_keys("海賊王")
driver.find_element_by_xpath('//form/span[1]/input').send_keys("海賊王")
#以上都可以定位到百度搜索框,相對路徑的長度和開始位置並不受限制,可以采用從后往前逐級定位的方式去定位

使用元素屬性定位

元素屬性定位要求屬性能夠定位到唯一一個元素,如果存在多個相同條件的標簽,默認定位第一個。 具體格式://標簽名[@屬性="屬性值"] 支持使用and和or關鍵字,多個屬性一起定位元素。

driver.find_element_by_xpath("//a[@name='tj_trnews']").click()
driver.find_element_by_xpath("//a[@name='tj_trnews' and @class='mnav']").click()
driver.find_element_by_xpath("//a[@name='tj_trnews' or @class='mnav']").click()

Xpath支持通配符*號,通過屬性定位還可以如下寫法:

driver.find_element_by_xpath("//*[@name='tj_trnews']").click()

使用部分屬性值匹配(也稱為模糊方法定位)

屬性值如果太長或網頁中的元素屬性動態變化,可以使用此方法

元素屬性值開頭包含內容:starts-with()

driver.find_element_by_xpath("//a[starts-with(@name,'tj_trhao')]").click()

元素屬性值結尾包含內容:substring()

driver.find_element_by_xpath("//a[substring(@name,6)='map']").click()

元素屬性值包含內容:contains()

driver.find_element_by_xpath("//a[contains(@name,'hao')]").click()

通過元素索引定位

遇到同層級相同標簽元素時,可以使用索引(下標)表示,索引的初始值為1

舉例:定位百度hao123鏈接

driver.find_element_by_xpath('//div[3]/a[2]').click()
driver.find_element_by_xpath('//div[@id='ul']/a[2]').click()

使用元素文本定位

元素文本在xpath中可以通過text()函數獲取,也可以用其來進行元素定位。

driver.find_element_by_xpath("//a[text()='新聞']").click()
driver.find_element_by_xpath("//a[contains(text(),'新')]").click()

Css_selector

CSS是一個被用來描述如何在屏幕等處渲染HTML和XML文檔的語言。 CSS使用選擇器來為文檔中的元素綁定樣式屬性。 選擇器(selector)是用來在樹中匹配元素的模式,選擇器對HTML和XML進行了優化,被設計用來在注重性能的代碼中執行。

Css_selector常用6種定位元素的方法

  • 絕對路徑
  • 相對路徑
  • 元素屬性
  • 元素屬性值
  • 查詢子元素
  • 查詢兄弟元素

通過絕對路徑定位

當同一層級有多個相同的元素時,使用id或class區分,遇到id用#號,遇到class用.號

driver.find_element_by_css_selector("html body div div div div div form span input").send_keys("海賊王")

driver.find_element_by_css_selector("html>body>div>div>div>div>div>form>span>input").send_keys("海賊王")

通過id(#)或者class(.)定位

可以和標簽名組合使用。

driver.find_element_by_css_selector("#kw").send_keys("海賊王")

driver.find_element_by_css_selector(".s_ipt").send_keys("海賊王")

driver.find_element_by_css_selector("input#kw").send_keys("海賊王")

driver.find_element_by_css_selector("input.s_ipt").send_keys("海賊王")

使用元素屬性定位

具體格式:標簽名[屬性="屬性值"] 支持使用多個屬性一起定位元素。

driver.find_element_by_css_selector("input[autocomplete='off']").send_keys("海賊王")

driver.find_element_by_css_selector("input[autocomplete='off'][id='kw']").send_keys("海賊王")

使用部分屬性值匹配(也稱為模糊方法定位)

  • 元素屬性值開頭包含內容:^=
  • 元素屬性值結尾包含內容:$=
  • 元素屬性值結尾包含內容:*=

舉例:

driver.find_element_by_css_selector("input[autocomplete^='of']").send_keys("海賊王")

driver.find_element_by_css_selector("input[autocomplete$='ff']").send_keys("海賊王")

driver.find_element_by_css_selector("input[autocomplete*='of']").send_keys("海賊王")

通過子元素定位(類似xpath中的索引的方法)

  • 子元素:A>B
  • 后代元素:A B(類似>)
  • 第一個后代元素:first-child
  • 最后一個后代元素:last-child
  • 第n個子元素:nth-child(N)[類同:nth-of-type(N)]

示例:

driver.find_element_by_css_selector("div#u1 a:first-child").click()

driver.find_element_by_css_selector("div#u1 a:last-child").click()

driver.find_element_by_css_selector("div#u1 a:nth-child(2)").click()

查找兄弟元素

1)同層級下一個元素:+ 2)選擇同層級多個相同標簽的元素:~

備注: +號可以多次使用 ~號一般返回的是多個元素,要用find_elements接收

定位元素代碼形式:

from selenium.webdriver.common.by import By

示例:

driver.find_element_by_css_selector("div#u1 a +a +a").click()

總結

定位元素的方式有8種,寫法有兩種

#driver.find_element_by_id()
driver.find_element(By.ID,"")

#driver.find_element_by_name()
driver.find_element(By.NAME,"")

#driver.find_element_by_class_name()
driver.find_element(By.CLASS_NAME,"")

#driver.find_element_by_tag_name()
driver.find_element(By.TAG_NAME,"")

#driver.find_element_by_partial_link_text()
driver.find_element(By.LINK_TEXT,"")

#driver.find_element_by_partial_link_text()
driver.find_element(By.PARTIAL_LINK_TEXT,"")

driver.find_element_by_xpath()
driver.find_element(By.XPATH,"")

driver.find_element_by_css_selector()
driver.find_element(By.CSS_SELECTOR,"")


免責聲明!

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



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