Selenium定位元素操作示例
本文實(shí)例講述了Selenium定位元素操作。分享給大家供大家參考,具體如下:
Selenium是一個(gè)用于Web應(yīng)用程序測(cè)試的工具。Selenium測(cè)試直接運(yùn)行在瀏覽器中,就像真正的用戶在操作一樣。支持的瀏覽器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。這個(gè)工具的主要功能包括:測(cè)試與瀏覽器的兼容性——測(cè)試你的應(yīng)用程序看是否能夠很好得工作在不同瀏覽器和操作系統(tǒng)之上。測(cè)試系統(tǒng)功能——?jiǎng)?chuàng)建回歸測(cè)試檢驗(yàn)軟件功能和用戶需求。支持自動(dòng)錄制動(dòng)作和自動(dòng)生成 .Net、Java、Perl等不同語言的測(cè)試腳本。
在前面一篇《Selenium基本用法》中簡(jiǎn)單記錄了Selenium的使用,接下來記錄一下元素的定位,Selenium提供了多種策略來定位頁面中的元素,Selenium提供了以下方法來定位頁面中元素,你可以根據(jù)自己的喜好來進(jìn)行選擇:
- find_element_by_id:通過ID進(jìn)行匹配查找,只返回匹配到的一個(gè)元素
- find_element_by_name:通過name進(jìn)行匹配查找,只返回匹配到的一個(gè)元素
- find_element_by_xpath:通過xpath進(jìn)行匹配查找,只返回匹配到的一個(gè)元素
- find_element_by_link_text:通過鏈接內(nèi)容進(jìn)行匹配查找,只返回匹配到的一個(gè)元素
- find_element_by_partical_link_text:通過部分鏈接內(nèi)容進(jìn)行匹配查找,只返回匹配到的一個(gè)元素
- find_element_by_tag_name:通過標(biāo)簽名稱進(jìn)行匹配查找,只返回匹配到的一個(gè)元素
- find_element_by_class_name:通過class名稱進(jìn)行匹配查找,只返回匹配到的一個(gè)元素
- find_element_by_css_selector:通過CSS選擇器進(jìn)行匹配查找,只返回匹配到的一個(gè)元素
值得注意的是,上面方法只會(huì)匹配查找只會(huì)獲取第一個(gè)元素。除了上面這些查找單個(gè)元素的方法之外,Selenium還定義查找多個(gè)元素的方法:
- find_elements_by_name:通過name進(jìn)行匹配查找,返回所有匹配到的元素列表
- find_elements_by_xpath:通過xpath進(jìn)行匹配查找,返回所有匹配到的元素列表
- find_elements_by_link_text:通過鏈接內(nèi)容進(jìn)行匹配查找,返回所有匹配到的元素列表
- find_elements_by_partical_link_text:通過部分鏈接內(nèi)容進(jìn)行匹配查找,返回所有匹配到的元素列表
- find_elements_by_tag_name:通過標(biāo)簽名稱進(jìn)行匹配查找,返回所有匹配到的元素列表
- find_elements_by_class_name:通過class名稱進(jìn)行匹配查找,返回所有匹配到的元素列表
- find_elements_by_css_selector:通過CSS選擇器進(jìn)行匹配查找,返回所有匹配到的元素列表
除了上面給出的公有方法之外,Selenium還提供了兩種私有方法可能對(duì)頁面對(duì)象中的定位器有用,這兩個(gè)私有方法是:find_element
和find_elements
:
from selenium.webdriver.common.by import By element = driver.find_element(By.XPATH,'//*[@id="su"]') elements = driver.find_elements(By.XPATH,'//button')
下面是By
可用的屬性:
ID = 'id' NAME = 'name' XPATH = 'xpath' LINK_TEXT = '鏈接內(nèi)容' PARTIAL_LINK_TEXT = '部分鏈接內(nèi)容' TAG_NAME = '標(biāo)簽名稱' CLASS_NAME = '類名' CSS_SELECTOR = 'CSS選擇器'
通過ID定位
當(dāng)你知道元素的ID屬性時(shí),你可以使用它,使用此策略,將返回ID屬性值與該匹配的第一個(gè)元素。如果沒有元素匹配到此ID屬性,將會(huì)引發(fā)NoSuchElementException錯(cuò)誤,舉個(gè)栗子,有這樣一個(gè)數(shù)據(jù)源:
<input id="login_id" type="text"/>
我們知道了這個(gè)元素的ID,我們可以這樣進(jìn)行定位:
element = driver.find_element_by_id('login_id')
通過name定位
當(dāng)你知道元素的name屬性時(shí),你可以使用它,使用此策略,將返回name屬性值與該匹配的第一個(gè)元素。如果沒有元素匹配到此name屬性,將會(huì)引發(fā)NoSuchElementException錯(cuò)誤,舉個(gè)栗子,有這樣一個(gè)數(shù)據(jù)源:
<input name="login" type="text"/>
我們知道了這個(gè)元素的name,我們可以這樣進(jìn)行定位:
element = driver.find_element_by_name('login')
通過XPath定位
XPath是用于在XML文檔中查找節(jié)點(diǎn)的語言,由于XML可以是HTML的實(shí)現(xiàn),因此Selenium用戶可以利用這種強(qiáng)大的語言來定位其Web應(yīng)用程序中的元素。XPath擴(kuò)展了通過id和name屬性定位的簡(jiǎn)單方法,并打開了各種新的可能性,例如在頁面中查找第三個(gè)復(fù)選框。舉個(gè)栗子,有這樣一個(gè)數(shù)據(jù)源:
<html> <body> <form id="loginForm"> <input name="username" type="text" /> <input name="password" type="password" /> <input name="continue" type="submit" value="Login" /> <input name="continue" type="button" value="Clear" /> </form> </body> <html>
我們可以這樣進(jìn)行定位:
user_element = driver.find_element_by_xpath("/html/body/form/input[@name='username']")
或者
user_element = driver.find_element_by_xpath("/html/body/form/input")
或者
user_element = driver.find_element_by_xpath('//input[1]')
或者
user_element = driver.find_element_by_xpath("http://input[@name='username'][@type='text']")
通過鏈接內(nèi)容定位
當(dāng)你知道鏈接元素的內(nèi)容時(shí),你可以使用它,使用此策略,將返回鏈接內(nèi)容與該匹配到的第一個(gè)元素。如果沒有元素匹配到此鏈接內(nèi)容,將會(huì)引發(fā)NoSuchElementException錯(cuò)誤,舉個(gè)栗子,有這樣一個(gè)數(shù)據(jù)源:
<html> <body> <p>Are you sure you want to do this?</p> <a href="continue.html" rel="external nofollow" rel="external nofollow" >Continue</a> <a href="cancel.html" rel="external nofollow" >Cancel</a> </body> <html>
其中<a href="continue.html" rel="external nofollow" rel="external nofollow" >Continue</a>
元素可以這樣定位:
element = driver.find_element_by_link_text('Continue')
或者
element = driver.find_element_by_partical_link_text('Con')
通過標(biāo)簽名稱定位
當(dāng)你知道標(biāo)簽的名稱時(shí),你可以使用它,使用此策略,將返回標(biāo)簽名稱與該匹配到的第一個(gè)元素。如果沒有元素匹配到此標(biāo)簽名稱時(shí),將會(huì)引發(fā)NoSuchElementException錯(cuò)誤,舉個(gè)栗子,有這樣一個(gè)數(shù)據(jù)源:
<html> <body> <h1>Welcome</h1> <p>Site content goes here.</p> </body> <html>
我們可以這樣對(duì)<p>
元素進(jìn)行定位:
element = driver.find_element_by_tag_name("p")
通過類名進(jìn)行定位
當(dāng)你知道類名的時(shí)候,你可以使用它,使用此策略,將返回類名與該匹配到的第一個(gè)元素。如果沒有元素匹配到此類名稱時(shí),將會(huì)引發(fā)NoSuchElementException錯(cuò)誤,舉個(gè)栗子,有這樣一個(gè)數(shù)據(jù)源:
<html> <body> <p class="content">Site content goes here.</p> </body> <html>
我們可以這樣對(duì)<p>
元素進(jìn)行定位:
element = driver.find_element_by_class_name('content')
通過CSS選擇器進(jìn)行定位
當(dāng)你想通過CSS選擇器語法找到一個(gè)元素時(shí),你可以使用它,使用此策略,將返回匹配CSS選擇器的第一個(gè)元素。如果沒有元素匹配到此CSS選擇器時(shí),將會(huì)引發(fā)NoSuchElementException錯(cuò)誤,舉個(gè)栗子,有這樣一個(gè)數(shù)據(jù)源:
<html> <body> <p class="content">Site content goes here.</p> </body> <html>
我們可以這樣對(duì)<p>
元素進(jìn)行定位:
element = driver.find_element_by_css_selector('body p')
更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python Socket編程技巧總結(jié)》、《Python URL操作技巧總結(jié)》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》及《Python入門與進(jìn)階經(jīng)典教程》
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
相關(guān)文章
Django之無名分組和有名分組的實(shí)現(xiàn)
這篇文章主要介紹了Django之無名分組和有名分組,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-04-04python pip如何手動(dòng)安裝二進(jìn)制包
這篇文章主要介紹了python pip如何手動(dòng)安裝二進(jìn)制包,幫助大家更好的進(jìn)行python開發(fā),感興趣的朋友可以了解下2020-09-09Python中執(zhí)行存儲(chǔ)過程及獲取存儲(chǔ)過程返回值的方法
這篇文章主要介紹了Python中執(zhí)行存儲(chǔ)過程及獲取存儲(chǔ)過程返回值的方法,結(jié)合實(shí)例形式總結(jié)分析了Python調(diào)用存儲(chǔ)過程的常用方法與相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2017-10-10python使用正則表達(dá)式去除中文文本多余空格,保留英文之間空格方法詳解
這篇文章主要介紹了python使用正則表達(dá)式去除中文文本多余空格,保留英文之間空格方法詳解,需要的朋友可以參考下2020-02-02Python進(jìn)階-函數(shù)默認(rèn)參數(shù)(詳解)
下面小編就為大家?guī)硪黄狿ython進(jìn)階-函數(shù)默認(rèn)參數(shù)(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-05-05通俗的講解深度學(xué)習(xí)中CUDA,cudatookit,cudnn和pytorch的關(guān)系
有些剛?cè)胄械呐笥芽偸歉悴磺宄﨏UDA,cudatookit,cudnn和pytorch的關(guān)系,那么今天這篇文章用通俗易懂的話講解了他們之間的關(guān)系,需要的朋友可以參考下,相信會(huì)對(duì)你有所幫助2023-03-03