1. 程式人生 > >Selenuim+Python之元素定位總結及例項說明

Selenuim+Python之元素定位總結及例項說明

    網頁自動化最基本的要求就是要定位到各個元素,然後才能對該元素進行各種操作(輸入,點選,清除,提交等),所以筆者今天來總結下Selenuim+Python最基本的幾種定位方式及例項說明,希望能幫助到大家。

目錄

以百度搜索輸入框為例,具體說明各個定位方式的用法:

(通過chrome瀏覽器檢視元素或者搜狐瀏覽器的firebug檢視,即可看到html原始碼)

注意點:第三行的元素是灰色的,該元素是不可定位到的,下方會說明。

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

1.通過id定位元素

如果id不是動態的,一個頁面的id是唯一的。最簡單的定位方式。

使用:find_element_by_id("id_vaule")

例項:find_element_by_id("kw")

注意點:有些id值是動態變化的,則不能使用該方法定位。如下:id就是動態的,每次進入頁面,該id都會改變。

<label style="display: block;" id="auto-id-1469758879170"
class="u-label f-dn">郵箱帳號或手機號</label>

2.通過class_name定位元素

classname有可能重複哦。 

使用:find_element_by_class_name("class_name_vaule")

例項:find_element_by_class_name("s_ipt")

3.通過tag_name定位元素

標籤名字最容易重複,不過,當定位一組資料時,可使用。

使用:find_element_by_tag_name("tag_name_vaule")

例項:find_element_by_tag_name("input")

注意點:當定位一組元素時:可勾選一組複選框。如下:

find_element_by_tag_name("input")

<body>
<h3>checkbox</h3>
<div  class="well">
<form class="form-horizontal">
 
<div  class="control-group">
<label class="control-label" for="c1">checkbox1</label>
<div  class="controls">
<input  type="checkbox" id="c1"/>
 </div>
 </div>
 
<div  class="control-group">
<label class="control-label"for="c2">checkbox2</label>
<div  class="controls">
<input  type="checkbox"id="c2"/>
 </div>
 </div>
 
<div  class="control-group">
<label class="control-label"for="c3">checkbox3</label>
<div  class="controls">
<input  type="checkbox"id="c3"/>
 </div>
 </div>
 
 </form>
 </div>
 
 </body>

4.通過name定位元素

name有可能會重複哦。 

使用:find_element_by_name("name_vaule")

例項:find_element_by_name("wd")

5.通過link文字精確定位元素

<a onclick="return false;" class="lb" name="tj_login" href="https://passport.baidu.com/v2/?login&amp;tpl=mn&amp;u=http%3A%2F%2Fwww.baidu.com%2F">登入</a>

使用:find_element_by_link_text("text_vaule")

例項:find_element_by_link_text("登入")

6.通過link文字模糊定位元素

使用:find_element_by_partial_link_text("部分text_vaule")

例項:find_element_by_partial_link_text("")

7.通過CSS定位元素

可檢視我的另外一篇博文:w3school之CSS學習筆記 學習css知識,更加有助於定位。

CSS(Cascading Style Sheets)是一種語言,它用來描述HTML和XML文件的表現。CSS可以較為靈活的選擇控制元件的任意屬性,一般情況下會比XPath快。且語法也比較簡潔。

不過CSS對於初學者而言比較複雜。

使用:find_element_by_css_selector("CSS")

例項:

7.1通過id屬性定位元素

#號表示通過id屬性來定位元素

find_element_by_css_selector("#kw")

7.2通過class屬性定位元素

.號表示通過class屬性來定位元素

find_element_by_css_selector(".s_ipt")

7.3通過標籤名定位元素

find_element_by_css_selector("input")

7.4通過屬性定位元素(挺常用的)

find_element_by_css_selector("[name='wd']")

find_element_by_css_selector("[maxlength='255']")

屬性值包含某個值

屬性值包含wd:適用於由空格分隔的屬性值。

find_element_by_css_selector("[name~='wd']")

7.5父子定位元素

查詢有父親元素的標籤名為span,它的所有標籤名叫input的子元素

find_element_by_css_selector("span>input") 

7.6組合定位元素

標籤名#id屬性值:指的是該input標籤下id屬性為kw的元素

find_element_by_css_selector("input#kw")

標籤名.class屬性值:指的是該input標籤下class屬性為s_ipt的元素

find_element_by_css_selector("input.s_ipt")

標籤名[屬性=’屬性值‘]:指的是該input標籤下name屬性為wd的元素

find_element_by_css_selector("input[name='wd']")

父元素標籤名>標籤名.class屬性值:指的是span下的input標籤下class屬性為s_ipt的元素

find_element_by_css_selector("span>input.s_ipt")

多個屬性組合定位元素(挺常用的)

指的是input標籤下id屬性為kw且name屬性為wd的元素

find_element_by_css_selector("input.s_ipt[name='wd']")

指的是input標籤下name屬性為wdmaxlength為255的元素

find_element_by_css_selector("input[name='wd'][maxlength='255']")

比較複雜的CSS定位可檢視

http://www.360doc.com/content/13/1105/10/11675837_326750173.shtml

http://www.360doc.com/content/13/1105/10/11675837_326750240.shtml

比較懶惰的方法:

使用搜狐瀏覽器的firebug工具,複製CSS路徑,不過這種方式對層級要求高,到時候自己再修改下。

8.通過XPath定位元素

XPath是一種XML文件中定位元素的語言。該定位方式也是比較常用的定位方式。

使用:find_element_by_xpath("XPath")

例項:

8.1通過屬性定位元素

find_element_by_xpath("//標籤名[@屬性='屬性值']")

id屬性:

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

class屬性:

find_element_by_xpath("//input[@class='s_ipt']")

name屬性:

find_element_by_xpath("//input[@name='wd']")

maxlength屬性:

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

8.2通過標籤名定位元素

指所有input標籤元素

find_element_by_xpath("//input")

8.3父子定位元素

查詢有父親元素的標籤名為span,它的所有標籤名叫input的子元素

find_element_by_xpath("//span/input") 

8.4根據元素內容定位元素(非常實用)

find_element_by_xpath("//p[contains(text(),'京公網')]") 

<p id="jgwab">
<i class="c-icon-jgwablogo"></i>
京公網安備11000002000001號
</p>

注:contains的另一種用法

//input[contains(@class,'s')]

說明class屬性包含s的元素。

8.5組合定位元素

//父元素標籤名/標籤名的屬性值:指的是span下的input標籤下class屬性為s_ipt的元素

find_element_by_xpath("//span/input[@class='s_ipt']")

多個屬性組合定位(挺常用的)

指的是input標籤下id屬性為kw且name屬性為wd的元素

find_element_by_xpath("//input[@class='s_ipt' and @name='wd']")

指的是p標籤下內容包含“京公網”且id屬性為jgwab的元素

find_element_by_xpath("//p[contains(text(),'京公網') and @id='jgwab']") 

比較懶惰的方法:

使用搜狐瀏覽器的firebug工具,複製XPath路徑,不過這種方式對層級要求高,到時候自己再修改下。

9.通過By定位元素

使用:find_element(定位的型別,具體定位方式)

定位的型別包括By.ID,By.NAME,By.CLASS_NAME,By.TAG_NAME,By.LINK_TEXT,By.PARTIAL_LINK_TEXT,By.XPATH,By.CSS_SELECTOR

具體定位方式參考上方1-8的說明。

例項:find_element(By.ID,'kw')

注意:使用By定位方式,需先匯入By類。

from selenium.webdriver.common.by import By

10.具體例項說明

下方例子是登陸126郵件,然後傳送郵件。

 1 # coding=utf-8
 2 '''
 3 Created on 2016-7-27
 4 @author: Jennifer
 5 Project:傳送郵件
 6 '''
 7 from selenium import webdriver
 8 import time
 9 
10 from test_5_2_public import Login  #由於公共模組檔案命名為test_5_2_public
11 driver=webdriver.Firefox()
12 driver.implicitly_wait(30)
13 driver.get(r'http://www.126.com/')  #字串加r,防止轉義。
14 time.sleep(3)
15 driver.switch_to.frame('x-URS-iframe')
16 #呼叫登入模組
17 Login().user_login(driver)
18 time.sleep(10)
19 #傳送郵件
20 #點擊發件箱
21 #_mail_component_61_61是動態id,所以不能用於定位
22 #driver.find_element_by_css_selector('#_mail_component_61_61>span.oz0').click()
23 #不能加u"//span[contains(text(),u'寫 信')]",否則定位不到。
24 #以下定位是查詢span標籤有個文字(text)包含(contains)'寫 信' 的元素,該定位方法重要
25 driver.find_element_by_xpath("//span[contains(text(),'寫 信')]").click()
26 #填寫收件人
27 #driver.find_element_by_class_name('nui-editableAddr-ipt').send_keys(r'[email protected]')
28 driver.find_element_by_class_name('nui-editableAddr-ipt').send_keys(r'[email protected]')
29 #填寫主題
30 #通過and連線更多的屬性來唯一地標誌一個元素
31 driver.find_element_by_xpath("//input[@class='nui-ipt-input' and @maxlength='256']").send_keys(u'自動化測試')
32 #填寫正文
33 #通過switch_to_frame()將當前定位切換到frame/iframe表單的內嵌頁面中
34 driver.switch_to_frame(driver.find_element_by_class_name('APP-editor-iframe'))
35 #在內嵌頁面中定位郵件內容位置
36 emailcontext=driver.find_element_by_class_name('nui-scroll')
37 #填寫郵件內容
38 emailcontext.send_keys(u'這是第一封自動化測試郵件')
39 #通過switch_to().default_content()跳回最外層的頁面
40 #注:不要寫成switch_to().default_content(),否則報AttributeError: SwitchTo instance has no __call__ method
41 driver.switch_to.default_content()
42 #driver.switch_to.parent_frame()
43 #點擊發送
44 time.sleep(3)
45 #有可能存在元素不可見(檢視元素是灰色的),會報ElementNotVisibleException錯誤
46 #包含傳送二字的元素很多,所以還得再加上其他限制
47 #sendemails=driver.find_element_by_xpath("//span[contains(text(),'傳送')]")
48 sendemails=driver.find_element_by_xpath("//span[contains(text(),'傳送') and @class='nui-btn-text']")
49 time.sleep(3)
50 
51 #校驗郵件是否傳送成功
52 try:
53     assert '傳送成功' in driver.page_source
54 except AssertionError:
55     print '郵件傳送成功'
56 else:
57     print '郵件傳送失敗'
58 
59 #呼叫退出模組    
60 Login().user_logout(driver)

元素定位說明:
1.程式碼22行,定位不到是因為id是動態的,所以需採取其他方式定位元素。

2.程式碼25行,是根據元素內容來定位的,具體用法詳看8.4.

3.程式碼28行,是根據class名來定位元素的,由於該值在該頁面上是唯一的,所以可以用它來定位。

4.程式碼31行,是使用邏輯運算子and連線更多的屬性從而唯一的標誌一個元素,具體用法詳看8.5.

5.程式碼34行,由於使用內嵌的iframe框架,所以需要先使用switch_to_frame()移到該表單上,才能定位該表單上的元素,非常重要,否則無論怎麼定位都會報“NoSuchElementException”,找不到該元素。

6.程式碼41行,跳出iframe框架,當框架內的動作操作完畢後,需要使用switch_to.default_content跳出iframe框架,非常重要。

7.程式碼47行,由於內容包括“傳送”的元素中包含不可見元素(html檢視元素可以看到此行是灰色的),這樣有可能定位到不可見元素,會報“ElementNotVisibleException”。

8.程式碼48行,是使用邏輯運算子and連線更多的屬性從而唯一的標誌一個元素,具體用法詳看8.5.這樣可以排除掉那個不可見元素。

(尊重筆者的勞動哦,轉載請說明出處哦。)

相關推薦

Selenuim+Python元素定位總結例項說明

    網頁自動化最基本的要求就是要定位到各個元素,然後才能對該元素進行各種操作(輸入,點選,清除,提交等),所以筆者今天來總結下Selenuim+Python最基本的幾種定位方式及例項說明,希望能幫助到大家。 目錄 以百度搜索輸入框為例,具體說明各個定位方式的用法: (通過chrome

selenium+python元素定位方式介紹

組合 ima box switcher 關鍵字 NPU span 獲取 今天 網頁自動化測試最基本的要求就是要定位到各個元素,然後才能對該元素進行各種操作(輸入,點擊,清除,提交等),所以今天來總結下Selenuim+Python最基本的幾種定位方式及實例說明,

Appium+Python元素定位和操作

一、常用識別元素的工具 uiautomatorviewer:Android SDK自帶的一個工具,在tools目錄下     二、元素定位   1.格式:find_element_by_定位方式(value) &nb

python自動發郵件總結例項說明

python發郵件需要掌握兩個模組的用法,smtplib和email,這倆模組是python自帶的,只需import即可使用。smtplib模組主要負責傳送郵件,email模組主要負責構造郵件。 smtplib模組主要負責傳送郵件:是一個傳送郵件的動作,連線郵箱伺服器,登入郵箱,傳送郵件(有發件人,收信人,

python介面自動化(三十三)-python自動發郵件總結例項說明番外篇——下(詳解)

簡介   發郵件前我們需要了解的是郵件是怎麼一個形式去傳送到對方手上的,通俗點來說就是你寫好一封信,然後裝進信封,寫上地址,貼上郵票,然後就近找個郵局,把信仍進去,其他的就不關心了,只是關心時間,而電子郵件不像日常傳送郵件的按天算,時間都是按 秒算的。 電子郵件的傳送流程: 1、你使用某款電子

Selenuim+Python關聯推薦彈出框元素定位

第一種:百度搜索彈出框; 1.在百度輸入杭州時下面會彈出4個推薦選項: 2.如果按照正常的定位方法去定位是找不到的,因為你只要點選F12裡面的檢查,百度那裡的彈窗就會自動關閉; 3.這時候你可以使用在彈出框哪裡右鍵點選檢查; 4.在F12除錯工具裡面就可以看到他的位

【轉載】【selenium+Python WebDriver】元素定位

driver 轉載 ref tails selenium html http url 定位 總結: 感謝“煜妃”《Selenuim+Python之元素定位總結及實例說明》和“Huilaojia123”《selenium WebDriver定位元素學習總結》的文章【轉載】【s

三、Appium-python-UI自動化元素定位uiautomatorviewer

uiautomatorviewer是android-sdk自帶的一個元素定位工具,非常簡單好用,使用uiautomatorviewer,可以檢查一個應用的UI來檢視應用的佈局和元件以及相關的屬性。   一、執行uiautomatorviewer.bat   1.開啟F:\Android\and

python發郵件總結例項說明,中文亂碼已解決(在最後一個模組)

python發郵件需要掌握兩個模組的用法,smtplib和email,這倆模組是python自帶的,只需import即可使用。smtplib模組主要負責傳送郵件,email模組主要負責構造郵件。 smtplib模組主要負責傳送郵件:是一個傳送郵件的動作,連線郵箱伺服器,登入郵箱,傳送郵件(有發件

六.python+selenium元素定位tag_name二次定位

tag_name是使用標籤進行定位 這裡用自己寫了一個HTML來進行演示,請點選下載HTML中的lizi.html  密碼:ww8k 首先定位到lizi中的選項下拉框標籤,就是點選一下Volvo定位該元素: 該元素是屬於select+option構成,那麼先根據tag_

Appium-Python各種元素定位操作方法解析

元素定位方法 # /site-packages/selenium/webdriver/remote/webdriver.py 通過id定位元素 12 find_element_by_id(self, id_) # Usage: driver.find_e

【基於Python的Selenium2自動化測試】02 -Webdriver元素定位

文章目錄 2.1 id定位 2.2 name定位 2.3 class定位 2.4 tag定位 2.5 link定位 2.6 partial link定位 2.7 XPath定位 2.8 CSS定位

what's the python基本運算符字符串、列表、元祖、集合、字典的內置方法

back 原理 pop mat 要點 log 程序 eric none   計算機可以進行的運算有很多種,運算按種類可分為算數運算、比較運算、邏輯運算、賦值運算、成員運算、身份運算。字符串和列表的算數運算只能用+和*,字典沒有順序,所以不能進行算數運算和比較運算。比較運算中

web自動化2-selenium基本操作元素定位

main .com blog text lin div spa wid 操作 id driver.find_elenment_by_id("kw") name driver.find_element_by_name("kw") class name diver.find

Python Appium 元素定位方法簡單介紹

用例 ios mage andro ont self 測試 pytho col Python Appium 元素定位 常用的八種定位方法(與selenium通用) # id定位 driver.find_element_by_id() # name定位

Python叠代器生成器

滿足 subclass 毛線 總結 繼續 異常處理 instance 好處 應該 一. 叠代器 1.1 什麽是可叠代對象 字符串、列表、元組、字典、集合 都可以被for循環,說明他們都是可叠代的。 我們怎麽來證明這一點呢? from collections im

pythonpandas簡單介紹使用(一)

dad all 就會 能夠 簡單的 兩種 first 模型 自己 python之pandas簡單介紹及使用(一) 一、  Pandas簡介1、Python Data Analysis Library 或 pandas 是基於NumPy 的一種工具,該工具是為了解決數據分析任

Selenium 自動化測試元素定位

#coding = utf8 from selenium import webdriver driver=webdriver.Chrome()   ###谷歌瀏覽器 driver.get(url) ###簡單元素定位 #by  id driver.find_eleme

IO流學習筆記(二)BufferedWriter與BufferedReader例項Demo

在之前的學習筆記(http://blog.csdn.net/megustas_jjc/article/details/72853059)中,FileWriter與FileReader的Demo使用的中轉資料buf實際就是緩衝區,是由我們自己建立的。 緩衝區可以提高效率,Java對緩衝區進行了封裝,封裝成了物

python3 + selenium 元素定位

8種定位方式 定位一個元素 webdriver提供了一系列的物件定位方法,常用的有以下幾種 driver.find_element_by_name()——最常用,簡單 driver.find_element_by_id()——最常用,簡單 driver.fi