元素定位:對於對於 Web 自動化測試來說,就是操作頁面上的各種元素,在操作元素之間需要先找到元素,換句話說就是定位元素
Selenium常見的定位元素的8種方法:Id,Name,Classname,LinkText,PartialLinkText,CSSSelector,Xpath。
重點是xpath定位元素和Tagname定位元素,其他 的自己百度一下
Tagname定位元素
agname,通過標簽名稱定位
例如:用戶名輸入框的標簽為input
driver.find_element_by_tag_name('input').send_keys('1763798976')
但是用戶名和密碼輸入框的標簽都是input,
我們就需要用到find_elements,而不是find_element方法
1.它先返回一個list,表示這個頁面有多少個input標簽
2.你再根據list的索引去操作這個元素
注意:其它的元素定位方法也是同樣的道理,如果定位到多個,用find_elements
input=driver.find_elements_by_tag_name('input') #返回一個list,因為用戶名和密碼都是input標簽
input[1].send_keys('1763') #list[1] 表示在第二個標簽輸入
Xpath定位元素
xpath:path就是路徑,類似文件夾Desktop/classnotes/
絕對路徑定位:copy xpath (借助谷歌瀏覽器)
缺點:當頁面元素父級元素發生改變,頁面元素的位置發生改變時,都需要修改
相對路徑定位:以 //開頭+標簽名 (自己寫xpath)
優點:長度和標簽開始的位置並不受限制,穩定且萬能
看看一些符號的定義
// :表示相對路徑 (所以xpath的寫法是:以//開頭+標簽名 )
/.. :表示找上級
/ :表示找下級
@:標簽屬性定位
() :text的值
* :標簽名任意
屬性定位:
比如上面"用戶名"的文本框的id為:username
寫相對路徑xpath://input[@id="username"] //input是標簽名 @id="username"是標簽屬性的名稱
或者標簽名任意://*[@id="username"]
文本定位:
比如登錄按鈕的text文本為:登錄
寫相對路徑xpath://button[text()="登錄"] //button是標簽名,text()="登錄"是文本內容
或者標簽名任意://*[text()="登錄"]
模糊查詢:starts-with
//+標簽名[starts-with(@什么屬性,'以什么開始')]
//input[starts-with(@type,'pass')]
模糊查詢: contains():
表示該元素的屬性的值,包含了什么東西
//+標簽名[contains(@什么屬性,'包含了什么值')]
//input[contains(@type,'ord')] //input是標簽名,@type是屬性,ord 是包含的值
'''特殊的元素定位:svg,frame'''
'''SVG 指可伸縮矢量圖形 (Scalable Vector Graphics)
需要xpath里面的name()方法:*[name()='svg']'''
'''frame:
frame標簽有frameset、frame、iframe三種,
frameset跟其他普通標簽沒有區別,不會影響到正常的定位,
而frame與iframe需要切換進去才能定位到其中的元素
看例子:'''

driver=webdriver.Chrome()
driver.get("http://www.kuaidi100.com/")
driver.find_element_by_xpath('//*[@id="uDeskTarget"]').click() #點擊客服聊天按鈕
#切換至frame
driver.switch_to_frame(driver.find_element_by_xpath('udesk_iframe')) #用frame的id來切換
#driver.switch_to.frame(driver.find_element_by_xpath('//*[@id="udesk_iframe"]')) #如果frame沒有id和name,用它的xpath來切換
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.126.com")
driver.switch_to.frame('x-URS-iframe')
driver.find_element_by_name("email").clear()
driver.find_element_by_name("email").send_keys("username")
driver.find_element_by_name("password").clear()
driver.find_element_by_name("password").send_keys("password")
driver.find_element_by_id("dologin").click()
driver.switch_to.default_content()
driver.quit()
switch_to.frame() 默認可以直接取表單的id 或name屬性。如果iframe沒有可用的id和name屬性,則可以通過下面的方式進行定位。
除此之外,在進入多級表單的情況下,還可以通過switch_to.default_content()跳回最外層的頁面。