比較好用的一些元素定位
一、Xpath
1嘹害、基本常用
頁面上
<input type="text" value="" name="IDCard" id="iptIDCard" maxlength="18" autocomplete="off" placeholder="請輸入">
selenium + python 獲取元素
driver.find_element_by_xpath('//*[@id="iptIDCard"]').send_keys(idcard) #輸入身份證號碼
2旋圆、確定頁面上顯示元素的文字
element = driver.find_element_by_xpath('//*[@id="app"]/div/div/div/div[2]/div/div/div[2]/div[4]/a').text
print("element的值是:",element )
3、直接通過頁面上顯示的文字來獲取元素
頁面上
<div unselectable="unselectable" class="ant-select-selection__placeholder" style="display: none; user-select: none;">請選擇</div>
selenium + python 獲取元素
driver.find_element_by_xpath('//div[contains(text(),"請選擇")]').click()
# 當不確定是什么標簽時
driver.find_element_by_xpath('//*[contains(text(),"請選擇")]').click()
4只恨、通過多個標簽關聯(lián)译仗,查找出想要的元素
頁面上
<input type="text" value="哇哈哈" placeholder="身份證姓名">
selenium + python 獲取元素
driver.find_element_by_xpath("http://input[@type='text'][@value='哇哈哈']").clear() # 調(diào)用clear()方法去清除名字
# 或者是通過 placeholder=“文字”進行刪除
# placeholder 是當輸入框什么都沒有輸入時顯示的內(nèi)容,value 是顯示輸入框中輸入的文字內(nèi)容
driver.find_element_by_xpath("http://input[@type='text'][@placeholder='身份證姓名']").clear()
5官觅、找出當前標簽下的兄弟標簽
頁面上
<div style="display: flex; box-sizing: border-box; width: 100%; height: 100%; align-items: center; justify-content: center; flex-direction: column;">
<img src="/supplychain/main//images/add.png" style="height: 38px; width: auto;">
<div style="display: flex; box-sizing: border-box; align-items: center; justify-content: center; font-size: 10px; color: rgb(179, 179, 179); margin-top: 8px;">我的照片</div>
<input type="file" style="display: none;">
<canvas style="display: none;"></canvas>
</div>
selenium + python 獲取元素
# 通過頁面上的文字找到元素纵菌,但由于上傳照片需要input,所以利用 following-sibling::input休涤,找到input元素
driver.find_element_by_xpath('//*[contains(text(),"我的照片")]/following-sibling::input').send_keys('H:\\哇哈哈\\photo.jpg')
二咱圆、class_name
1、基本常用
頁面上
<a class="code-btn ">獲取驗證碼</a>
selenium + python 獲取元素
driver.find_element_by_class_name('code-btn ').click() # 點擊 獲取驗證碼
三功氨、元素獲取超時
如果發(fā)現(xiàn)A元素時序苏,執(zhí)行test01;如果沒有發(fā)現(xiàn)A元素時捷凄,執(zhí)行test02
from selenium.common.exceptions import NoSuchElementException, TimeoutException
class Tool(object):
def __init__(self, driver):
self.driver = driver # 這里不能再文件頂部導入webdriver杠览,不然之后會有沖突
def is_element_exit(self, identifyBy, c):
'''
Determine whether elements exist
Usage:
isElement(By.XPATH,"http://a")
'''
flag = None
try:
if identifyBy == "xpath":
# self.driver.find_element_by_xpath(c)
wait = WebDriverWait(self.driver, 3)
wait.until(EC.presence_of_element_located((By.XPATH, c))) # 等待該xpath元素最多3s,找到則返回元素纵势,否則拋異常
# WebDriverWait(self.driver, 3, 0.8).until(lambda x: x.find_element_by_xpath(c)) # 等待XPATH元素可見
elif identifyBy == "id":
self.driver.implicitly_wait(60)
self.driver.find_element_by_id(c)
self.driver.find_element_by_id(c).click()
elif identifyBy == "name":
self.driver.find_element_by_name(c)
self.driver.find_element_by_name(c).click()
flag = True
print("can find: ", c)
# except NoSuchElementException as e:
except TimeoutException as e:
flag = False
print("獲取元素超時因為{}踱阿,無法找到{}元素", format(e, c))
print("can't find: %s" % c)
finally:
return flag
調(diào)用這個方法
from common.tool import Tool
class TestEdrain(unittest.TestCase):
def test_Flow(self):
driver = self.driver
driver.get(self.base_url)
tool = Tool(driver)
if tool.is_element_exit("xpath", '//*[@id="iptIDCard"]'):
print("開始注冊")
edrain.test01()
else:
print("開始登錄")
edrain.test02()
TimeoutException:獲取元素超時
NoSuchElementException:找不到該元素
等異常均會被捕捉。
小tip:
# 最長的等待時間取決于兩者之間的大者钦铁。
# 如果隱性等待時間 > 顯性等待時間软舌,則該句代碼的最長等待時間等于隱性等待時間。
"""
implicitly_wait():隱式等待
當使用了隱式等待執(zhí)行測試的時候牛曹,如果 WebDriver沒有在 DOM中找到元素佛点,將繼續(xù)等待,超出設定時間后則拋出找不到元素的異常黎比。換句話說超营,當查找元素或元素并沒有立即出現(xiàn)的時候,隱式等待將等待一段時間再查找 DOM阅虫,默認的時間是0
一旦設置了隱式等待演闭,則它存在整個 WebDriver 對象實例的聲明周期中,隱式等待會讓一個正常響應的應用的測試變慢颓帝,它將會在尋找每個元素的時候都進行等待米碰,這樣會增加整個測試執(zhí)行的時間。
所以:::隱式等待 慎用购城。
"""
---------
driver.implicitly_wait(30) # 隱式等待
--------
wait = WebDriverWait(self.driver, 3)
wait.until(EC.presence_of_element_located((By.XPATH, c))) # 顯示等待
四吕座、斷言
1、包含關系assertIn(A, B)------B 中包含 A
ele_string = driver.find_element_by_xpath('//*[@id="app"]/div/div/div[2]/div/div/div[1]/p[1]').text
assertIn(u"系統(tǒng)正在審批您提交的申請", ele_string)
2瘪板、相等關系assertEqual(A, B)------A和B相等
assertEqual(a,b,msg=msg) #判斷a與.b是否一致吴趴,msg類似備注,可以為空