前言
這webUI自動自動化測試中比較困難的是元素定位樊零,比如一個頁面中存在iframe酣难,那么直接使用copy到的定位元素?zé)o法定位到相應(yīng)的元素拖叙,若iframe又沒有name屬性诅炉,id又是變化的蜡歹,那么使用copy到的定位元素永遠(yuǎn)也無法定位到
一、xpath語法講解
XPath 使用路徑表達(dá)式來選取 XML 文檔中的節(jié)點或節(jié)點集涕烧。節(jié)點是通過沿著路徑 (path) 或者步 (steps) 來選取的月而。
本節(jié)來自:w3cschool
1.選取節(jié)點
表達(dá)式 | 描述 | 說明 |
---|---|---|
nodename | 選取此節(jié)點的所有子節(jié)點。 | 選取所有相同的標(biāo)簽名 |
/ | 從根節(jié)點選取议纯。 | 查看根節(jié)點下的標(biāo)簽名父款,下面的子標(biāo)簽名不查找 |
// | 從匹配選擇的當(dāng)前節(jié)點選擇文檔中的節(jié)點,而不考慮它們的位置瞻凤。 | 一般用這個铛漓,配合其他的查找語法使用 |
. | 選取當(dāng)前節(jié)點。 | 這兩個用的很少 |
.. | 選取當(dāng)前節(jié)點的父節(jié)點鲫构。 | |
@ | 選取屬性。 | 一般配合//使用 |
. | 接類名玫坛,可以直接查找同類的名 |
2.謂語(查找特定節(jié)點结笨,或者查找指定屬性的節(jié)點)
謂語用來查找某個特定的節(jié)點或者包含某個指定的值的節(jié)點。謂語被嵌在方括號中湿镀。
以下為常用的路徑表達(dá)式:
路徑表達(dá)式 | 結(jié)果 |
---|---|
/bookstore/book[1] | 選取屬于 bookstore 子元素的第一個 book 元素炕吸。 |
/bookstore/book[last()] | 選取屬于 bookstore 子元素的最后一個 book 元素。 |
/bookstore/book[last()-1] | 選取屬于 bookstore 子元素的倒數(shù)第二個 book 元素勉痴。 |
/bookstore/book[position()<3] | 選取最前面的兩個屬于 bookstore 元素的子元素的 book 元素赫模。 |
//title[@lang] | 選取所有擁有名為 lang 的屬性的 title 元素。 |
//title[@lang='eng'] | 選取所有 title 元素蒸矛,且這些元素?fù)碛兄禐?eng 的 lang 屬性瀑罗。 |
/bookstore/book[price>35.00] | 選取 bookstore 元素的所有 book 元素,且其中的 price 元素的值須大于 35.00雏掠。 |
/bookstore/book[price>35.00]/title | 選取 bookstore 元素中的 book 元素的所有 title 元素斩祭,且其中的 price 元素的值須大于 35.00。 |
3.(*)通配符選取未知節(jié)點
一般與謂語表達(dá)式連用
標(biāo)識符 | 含義 |
---|---|
* | 匹配任何元素節(jié)點乡话。 |
@* | 匹配任何屬性節(jié)點摧玫。 |
node() | 匹配任何類型的節(jié)點。 |
路徑表達(dá)式 | 結(jié)果 |
---|---|
/bookstore/* | 選取 bookstore 元素的所有子元素绑青。 |
//* | 選取文檔中的所有元素诬像。 |
//title[@*] | 選取所有帶有屬性的 title 元素屋群。 |
“|”運(yùn)算符選取多個不同表達(dá)式路徑
路徑表達(dá)式 | 結(jié)果 |
---|---|
//book/title | //book/price | 選取 book 元素的所有 title 和 price 元素。 |
//title | //price | 選取文檔中的所有 title 和 price 元素坏挠。 |
/bookstore/book/title | //price | 選取屬于 bookstore 元素的 book 元素的所有 title 元素芍躏,以及文檔中所有的 price 元素。 |
4.模糊匹配
模糊匹配是進(jìn)行動態(tài)匹配的核心癞揉,需要自己編寫xpath表達(dá)式纸肉。
以下代碼來自:https://www.cnblogs.com/xufengnian/p/10788195.html
模糊匹配
//div[contains(@class,'f1')] div的class屬性帶有f1的所有標(biāo)簽
//body/* body下面所有的元素
//div[@*] 只要有用屬性的div元素
//div[@id='footer'] //div 帶有id='footer'屬性的div下的所有div元素
//div[@class='job_bt'] //dd[@class='job-advantage']
二、iframe切換
1.基本方法
通過switch_to方法喊熟,可以看到柏肪,其與iframe相關(guān)的方法有三個:
driver=webdriver.Chrome()
- driver.switch_to.frame() ????切換iframe
- driver.switch_to.parent_frame()????切換到此iframe的上級iframe,若是在根html下的iframe芥牌,則返回根html
- driver.switch_to.default_content()????切換到默認(rèn)未進(jìn)入iframe的狀態(tài)
最重要的是:switch_to.frame()
2.switch_to.frame()使用實例
2.1不同方式定位靜態(tài)iframe內(nèi)的元素
本例為菜鳥教程內(nèi)的頁面烦味,iframe沒有name屬性
from selenium import webdriver
import time
driver=webdriver.Chrome()
driver.get('https://www.runoob.com/try/try.php?filename=tryhtml_basic_link')
time.sleep(5)
#通過xpath定位到靜態(tài)iframe
# driver.switch_to.frame(driver.find_element_by_xpath('//*[@id="iframeResult"]'))
#通過索引定位,這個頁面內(nèi)只有一個iframe
driver.switch_to.frame(0)
text=driver.find_element_by_xpath('/html/body/a').text
print(text)
三壁拉、動態(tài)元素的xpath定位
以下界面的登錄窗口采用了iframe及動態(tài)id技術(shù)谬俄,每一次iframe的id名都會變化,但又無name屬性弃理,這種情況下只能通過iframe索引切換以及寫xpath的模糊匹配表達(dá)式切換
from selenium import webdriver
import time
driver=webdriver.Chrome()
driver.get('https://mail.126.com/')
time.sleep(5)
#xpath的模糊匹配表達(dá)式
driver.switch_to.frame(driver.find_element_by_xpath("http://iframe[starts-with(@id, 'x-URS-iframe')]"))
#iframe索引
#driver.switch_to.frame(0)
driver.find_element_by_name('email').send_keys(1314)
# driver.switch_to.parent_frame()
driver.switch_to.default_content()
text=driver.find_element_by_xpath('//*[@id="normalLoginTab"]/h2').text
print(text)
四溃论、JS定位切換iframe
嘗試中……后續(xù)繼續(xù)更新