1、什么是元素定位
根據(jù)元素的某個(gè)特征在網(wǎng)頁中找到對(duì)應(yīng)的元素,定位元素的目的是為了操作元素,在Web自動(dòng)化中,定位元素是后續(xù)一切操作的前提條件。
2、元素的八大定位方式
2.1、id : 根據(jù)標(biāo)簽/元素的id屬性值定位
一般情況下元素的id是唯一的,所以通過這個(gè)方法可以很輕松地找到元素。
eg:通過id定位百度的輸入框并發(fā)送值
# 創(chuàng)建瀏覽器對(duì)象driver
# 百度輸入框的id值為kw,需要導(dǎo)入定位選擇方式By
from selenium.webdriver.common.by import By
driver.find_element(By.ID, "kw").send_keys("python")
不能通過id定義的情況
- id是動(dòng)態(tài)變化的
- 不存在id
- id的屬性值不唯一
- id中有數(shù)字不用
2.2、name:根據(jù)標(biāo)簽/元素的name屬性值定位
一般情況下元素的名稱也是唯一的,所以通過名稱可以找到元素。
eg:通過name定位百度的輸入框并發(fā)送值
# 創(chuàng)建瀏覽器對(duì)象driver
# 百度輸入框的name值為wd,需要導(dǎo)入定位選擇方式By
from selenium.webdriver.common.by import By
driver.find_element(By.NAME, "wd").send_keys("python")
2.3、tag_name:根據(jù)標(biāo)簽/元素的tag_name屬性值定位
根據(jù)元素的標(biāo)簽名稱來定位元素,因?yàn)橐粋€(gè)頁面上往往有多個(gè)同名的標(biāo)簽,所以這種方法的局限性較大。這個(gè)方法返回值的類型是一個(gè)webelement對(duì)象。
eg:定位input標(biāo)簽
# 創(chuàng)建瀏覽器對(duì)象driver
# 定位input標(biāo)簽,需要導(dǎo)入定位選擇方式By
from selenium.webdriver.common.by import By
element_input = driver.find_element(By.TAG_NAME, 'input')
2.4、class_name:根據(jù)標(biāo)簽/元素的class_name屬性定位
根據(jù)元素的類名定位元素,需要注意的是作為定位條件的類名必須是唯一的,否則會(huì)定位不到想找的元素,當(dāng)元素有多個(gè)類名時(shí), 選擇其中一個(gè)唯一的類名來定位。
# 創(chuàng)建瀏覽器對(duì)象driver
# 通過類名來定位這個(gè)元素,并輸入Selenium WebDriver
driver.find_element(By.CLASS_NAME, "s_ipt").send_keys("python")
# 選擇其中一個(gè)唯一的類名s_btn來定位元素, 中間的空格也可用使用.代替
driver.find_element(By.CLASS_NAME, "bg.s_btn").click()
2.5、link_text:根據(jù)超鏈接的文本進(jìn)行定位
根據(jù)元素的鏈接文本來定位元素,適用于超鏈接元素,超鏈接元素的標(biāo)簽是a,在一個(gè)頁面上,超鏈接文本一般是唯一的。返回值是一個(gè)WebElement對(duì)象
# 創(chuàng)建瀏覽器對(duì)象driver
# 定位文本是新聞的超鏈接元素,并點(diǎn)擊
driver.find_element(By.LINK_NAME,"新聞").click()
2.6、partial_link_text:根據(jù)超鏈接的模糊文本進(jìn)行定位
根據(jù)元素的鏈接文本的一部分來定位元素,要注意選取的部分文本要唯一,否則定位不到需要找的元素。
# 創(chuàng)建瀏覽器對(duì)象driver
# 在京東頁面定位文本包含家用的超鏈接元素,并點(diǎn)擊
driver.find_element(By.PARTIAL_LINK_NAME,"家用").click()
2.7、xpath:根據(jù)xpath表達(dá)式定位
特殊符號(hào)表示的含義:
/ :表示根或者子節(jié)點(diǎn)
//:任意節(jié)點(diǎn)
@ :表示當(dāng)前的節(jié)點(diǎn)的對(duì)象
* :表示通配符,只針對(duì)標(biāo)簽名
[ ]:相當(dāng)于過濾器
(1)、絕對(duì)路徑
根據(jù)網(wǎng)頁中的層級(jí)目錄遞進(jìn)進(jìn)行查找對(duì)應(yīng)元素。
eg:查找百度的輸入框,并發(fā)送元素“Python”
PS:這個(gè)例子有兩個(gè)查詢結(jié)果,定位時(shí)會(huì)返回在前面的結(jié)果,這個(gè)例子不是很合適,但是我懶了。
# 創(chuàng)建瀏覽器對(duì)象driver
# 通過XPath定位用戶名輸入框
driver.find_element(By.XPATH,"/html/body/div/div/div/div/div/form/span/input").send_keys("四川")
(2)、//標(biāo)簽名[@屬性名=屬性值]
把相對(duì)路徑和屬性結(jié)合起來查找對(duì)應(yīng)元素。
# 創(chuàng)建瀏覽器對(duì)象driver
# 定位百度首頁輸入框,輸入Python
driver.find_element(By.XPATH,'//input[@id="kw"]').send_keys("Python")
# 定位百度一下按鈕,點(diǎn)擊
driver.find_element(By.XPATH,'//input[@id="su"]').click()
(3)、//標(biāo)簽名[text()=值]
如果一個(gè)標(biāo)簽有文本,并且文本在頁面中是唯一的,可以通過指定文本來定位元素。
eg:定位百度首頁中的文本為“新聞”的內(nèi)容
# 創(chuàng)建瀏覽器對(duì)象driver
# 定位文本是新聞的標(biāo)簽
driver.find_element(By.XPATH, "http://a[text()='新聞']").click()
(4)、//標(biāo)簽名[contains(@ 屬性,值)]
根據(jù)標(biāo)簽中包含的部分內(nèi)容來定位。
eg:定位標(biāo)簽中包含 "百度一下" 的標(biāo)簽
# 創(chuàng)建瀏覽器對(duì)象driver
# 定位標(biāo)簽中包含 "百度一下" 的標(biāo)簽, 并點(diǎn)擊一下
driver.find_element(By.XPATH, '//input[contains(@value,"百度一下")]').click()
(5)、//標(biāo)簽名[starts-with(@ 屬性,值)]
根據(jù)標(biāo)簽中開頭的部分內(nèi)容來定位。
eg:定位標(biāo)簽中以?"result_t" 開頭的標(biāo)簽
# 創(chuàng)建瀏覽器對(duì)象driver
# 定位標(biāo)簽中以?"result_t" 開頭的標(biāo)簽
element = driver.find_element(By.XPATH, '//*[starts-with(@id,"result_t")]')
(6)、//標(biāo)簽名[@ 屬性名1=值1 and @ 屬性名2=值2]
如果通過一個(gè)屬性不能準(zhǔn)確地定位到元素,可以使用邏輯運(yùn)算符and來指定多個(gè)屬性定位元素。
# 創(chuàng)建瀏覽器對(duì)象driver
# 定位百度輸入框,輸入Python
driver.find_element(By.XPATH,"http://input[@id='kw' and @name='wd']").send_keys("Python")
# 定位百度一下按鈕,點(diǎn)擊
driver.find_element(By.XPATH,"http://input[@id='su' and @value='百度一下']").click()
(7)、//標(biāo)簽[@ 屬性名=值]/標(biāo)簽名[n]
當(dāng)通過一個(gè)屬性不能準(zhǔn)確地定位到元素,可以使用邏輯運(yùn)算符and來指定多個(gè)屬性來定位元素。
eg:定位百度輸入框并發(fā)送值“python”
# 創(chuàng)建瀏覽器對(duì)象driver
# 定位百度輸入框,輸入Python
driver.find_element(By.XPATH,"http://input[@id='kw' and @name='wd']").send_keys("Python")
(8)、//標(biāo)簽名[ends-with(@ 屬性,值)]------已被移除
2.8、css_selector:根據(jù)樣式表達(dá)式進(jìn)行定位
(1)、#id:用元素的id屬性進(jìn)行定位
# 創(chuàng)建瀏覽器對(duì)象driver
# 定位百度一下輸入框,輸入Python
driver.find_element(By.CSS_SELECTOR, "#kw").send_keys("python")
(2)、 .class . class:以元素的類名進(jìn)行定位
如果元素有一個(gè)class屬性,就通過.class進(jìn)行定位
如果元素有多個(gè)class屬性,class類名之間用.來連接
# 創(chuàng)建瀏覽器對(duì)象driver
# 定位百度輸入框,輸入Python
driver.find_element(By.CSS_SELECTOR, ".s_ipt").send_keys("python")
#定位百度一下按鈕,這個(gè)元素有多個(gè)class值,可以指定多個(gè)類名定位,也可以選擇其中一個(gè)唯一的類名來定位
driver.find_element(By.CSS_SELECTOR, ".bg.s_btn").click()
(3)、標(biāo)簽名:以元素的標(biāo)簽的名稱進(jìn)行定位
直接寫標(biāo)簽名,前面不需要加任何符號(hào)
一般結(jié)合其他屬性使用
# 創(chuàng)建瀏覽器對(duì)象driver
# 定位百度輸入框,輸入Python
driver.find_element(By.CSS_SELECTOR, "input").send_keys("python")
(4)、標(biāo)簽名#id:以元素的標(biāo)簽名的名稱和id屬性進(jìn)行定位
# 創(chuàng)建瀏覽器對(duì)象driver
# 定位百度輸入框,輸入Python
driver.find_element(By.CSS_SELECTOR, "input#kw").send_keys("python")
(5)、標(biāo)簽名.class:以元素的標(biāo)簽名的名稱和class屬性進(jìn)行定位
# 創(chuàng)建瀏覽器對(duì)象driver
# 定位百度輸入框,輸入Python
driver.find_element(By.CSS_SELECTOR, "input.s_ipt").send_keys("python")
(6)、[屬性名=值]:以屬性的值進(jìn)行定位
# 創(chuàng)建瀏覽器對(duì)象driver
# 定位百度輸入框,輸入Python
driver.find_element(By.CSS_SELECTOR, "[name='wd']").send_keys("python")
(7)、[屬性名1=值1][屬性名2=值2]:以屬性1的值1和屬性2的值2進(jìn)行定位
# 創(chuàng)建瀏覽器對(duì)象driver
# 定位百度輸入框,輸入Python
driver.find_element(By.CSS_SELECTOR, "[name='wd']").send_keys("python")
(8)、標(biāo)簽名[屬性名=值]:以屬性等于一個(gè)值進(jìn)行定位;
標(biāo)簽名[屬性名1=值1][屬性名2=值2]:多個(gè)屬性值進(jìn)行定位
# 創(chuàng)建瀏覽器對(duì)象driver
# 標(biāo)簽和單個(gè)屬性值進(jìn)行定位,并發(fā)送值
driver.find_element(By.CSS_SELECTOR, "input[name='wd']").send_keys("python")
# 標(biāo)簽和多個(gè)屬性值進(jìn)行定位,并發(fā)送值
driver.find_element(By.CSS_SELECTOR, "input[name='wd']").send_keys("python")
(9)、標(biāo)簽名[屬性名*=值]:以屬性包含一個(gè)值進(jìn)行定位
# 創(chuàng)建瀏覽器對(duì)象driver
# 定位百度一下按鈕,點(diǎn)擊
driver.find_element(By.CSS_SELECTOR, "input[value*='百度']").click()
(10)、標(biāo)簽名[屬性名^=值]:以屬性的開始值進(jìn)行定位
# 創(chuàng)建瀏覽器對(duì)象driver
# 定位百度一下按鈕,并點(diǎn)擊
driver.find_element(By.CSS_SELECTOR, "input[value^='百度']").click()
(11)、標(biāo)簽名[屬性名$=值]:以屬性的結(jié)束值進(jìn)行定位
# 創(chuàng)建瀏覽器對(duì)象driver
# 定位百度一下按鈕,并點(diǎn)擊
driver.find_element(By.CSS_SELECTOR, "input[value$='一下']").click()
(12)、標(biāo)簽名 > 子標(biāo)簽[屬性名$=值] + 兄弟標(biāo)簽名
# 創(chuàng)建瀏覽器對(duì)象driver
driver.find_element(By.CSS_SELECTOR, '#s-top-left>a[href$="tieba.baidu.com/"] + a').click()
(13)、定義兄弟標(biāo)簽
a、標(biāo)簽名 > 子標(biāo)簽 :first-child
????????定位標(biāo)簽下該子標(biāo)簽的第一個(gè)子標(biāo)簽
# 創(chuàng)建瀏覽器對(duì)象driver
# 定位百度輸入框所在目錄下的的第一個(gè)標(biāo)簽,輸入Python
# 使用fist-child
driver.find_element(By.CSS_SELECTOR, "span#s_kw_wrap>input:first-child").send_keys("Python")
b、標(biāo)簽名 > 子標(biāo)簽 :nth-child(n)
????????定位標(biāo)簽下該子標(biāo)簽的第n個(gè)子標(biāo)簽
# 創(chuàng)建瀏覽器對(duì)象driver
# 定位百度輸入框,輸入Python
# 使用nth-child(n)
driver.find_element(By.CSS_SELECTOR, "span#s_kw_wrap>input:nth-child(2)").send_keys("Python")
c、標(biāo)簽名 > 子標(biāo)簽 :last-child文章來源:http://www.zghlxwxcb.cn/news/detail-839658.html
????????定位標(biāo)簽下該子標(biāo)簽的最后一個(gè)子標(biāo)簽-----慎用文章來源地址http://www.zghlxwxcb.cn/news/detail-839658.html
# 創(chuàng)建瀏覽器對(duì)象driver
# 定位百度輸入框,輸入Python
# 使用last-child
driver.find_element(By.CSS_SELECTOR, "span#s_kw_wrap>input:last-child").send_keys("Python")
到了這里,關(guān)于selenium的八大元素定位方式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!