selenium元素操作--判斷元素是否可點擊、可選中、是否可見
判斷元素是否可以點擊
判斷元素在頁面上是否可以點擊,WebElement對象調用 is_enabled() 方法。
is_enabled() 方法返回一個布爾值,若可點擊返回: True 。若不可點擊則返回: False
實例1:
driver = webdriver.Chrome() # 打開百度 driver.get('https://www.baidu.com/') # 定位百度首頁的地圖按鈕 elm = driver.find_element_by_xpath('//*[@id="s-top-left"]/a[3]') # 判斷元素是否可以點擊 answer = elm.is_enabled() print(answer) # 執行結果:True,故可以點擊。 time.sleep(3) driver.quit()
實例2:
在實際測試中,會遇到某些按鈕置灰的情況:
1、比如:登錄場景,只輸入用戶名或只輸入密碼時,<登錄>按鈕灰顯,不可點擊。
2、再比如:手機號碼注冊時,未輸入正確長度手機號碼時<注冊>按鈕置灰。對應代碼:
<button class="btn submit" disabled='' style="background:rgp(204,204,204);">下一步</button>
輸入正確手機號碼后,按鈕變成可點擊狀態,對應代碼:
<button class="btn submit" style="background:rgp(51, 172, 55);">下一步</button>
此時測試用例中就可以斷言未輸入正確長度手機號碼時按鈕是否置灰:
btnElm = driver.find_element_by_xpath('id') result = btnElm.is_enabled() print(result) assert not result #手機號碼未輸入正確,按鈕應該灰顯
判斷元素是否可見
判斷元素在頁面上是否可見,WebElement對象調用 is_displayed() 方法。
注意:雖然此時的元素不可見,但是元素確實可以定位到。 拓展:css實現元素隱藏和顯示的屬性有哪些? 實現屬性有: 1)display屬性,值為“none”時隱藏元素,為“block”時顯示元素;(在項目中的實現方式居多) 2)visibility屬性,值為“hidden”時隱藏元素,為“visible”時顯示元素; 3)overflow屬性; 4)opacity屬性。 1:display屬性 display: none; 隱藏對象 display: block;除了轉換為塊級元素之外,還有顯示元素的意思 注意:display隱藏元素之后,不再占有原來的位置 2:visibility屬性 visibility: visible; 元素可視 visibility: hidden; 元素隱藏 注意:visibility隱藏元素后,繼續占有原來的位置 3:overflow屬性(溢出內容的顯示與隱藏) overflow: visible | hidden | scroll | auto 屬性值具體說明見下表: 屬性值 說明 visible 不剪切內容,也不添加滾動條 hidden 隱藏超出的部分 scroll 不管內容是否超出,都顯示滾動條 auto 只有內容超出時才顯示滾動條,不超出則不顯示 4:opacity屬性 opacity: 0; 隱藏元素 opacity: 1; 顯示元素 opacity屬性的意思是檢索或設置對象的不透明度。當他的透明度為0的時候,視覺上它是消失了;但是他依然占據着那個位置,並對網頁的布局起作用。 注意:添加了opacity屬性的元素,它的背景和元素內容也是會跟着變化的。
is_displayed() 方法返回一個布爾值,若元素可見則返回:True ;若元素不可見則返回:False 。
代碼如下:
driver = webdriver.Chrome() # 打開百度 driver.get('https://www.baidu.com/') # 定位百度首頁的地圖按鈕 elm = driver.find_element_by_xpath('//*[@id="s-top-left"]/a[3]') # 判斷元素是否可見 answer = elm.is_displayed() print(answer) driver.quit()
執行結果:True,故可見。
判斷元素是否可被選中
判斷元素在頁面上是否被選中,WebElement對象調用 is_selected() 方法。
is_selected() 方法返回一個布爾值,若被選中則返回: True 。若沒被選中則返回: False 。
代碼如下:
driver = webdriver.Chrome()
# 打開百度 driver.get('https://www.baidu.com/')
# 定位百度首頁的地圖按鈕 elm = driver.find_element_by_xpath('//*[@id="s-top-left"]/a[3]')
# 判斷元素是否可選中 answer = elm.is_selected()
print(answer) driver.quit()
執行結果:False,說明未被選中。
問題:有一個選項框,本身就是選中狀態,如果再點擊一下,它就反而變成了未被選中的狀態,期望結果是該選項框處於選中狀態;當該選項框為未選中狀態時,判斷去點擊選中該選項框;當該選項框處於選中狀態時,不做任何操作。
解決思路: is_selected() 檢查是否選中該元素,一般針對單選框,復選框,返回的結果是bool 值,元素處於未選中狀態的時候返回 False,元素處於選中狀態時返回 True。
from selenium import webdriver
driver = webdriver.Chrome()
driver.maximize_window()
driver.get("https://www.baidu.com/gaoji/preferences.html")
element = driver.find_element_by_xpath("//*[text()='僅簡體中文']")
if element.is_selected(): print("元素已經被選中") else: print("元素沒有被選中")
driver.quit()
總結
1、元素若有 is_disabled 屬性,則是不可點擊,否則就是可點擊。
2、元素若有 is_display:none 屬性,則是不可見的,否則就是可見的。
3、元素若有 selected 屬性,則是已被選擇。
selenium 判斷隱藏元素是否顯示常用方法以及JavaScript對自動化的一些操作
示例:
1、隱藏前
2、點擊 visible text 按鈕后(vip客戶專屬 元素的id屬性為vip,)
對於需要點擊按鈕顯示元素的常用方法:
visible=browser.find_element_by_xpath('//*[contains(@value,"visilbe")]') # visible text按鈕的元素定位 visible.click() # 點擊visible text按鈕
判斷 vip客戶專屬 元素是否出現
1、 is_displayed 方法判斷元素是否出現
'''
第一種is_displayed判斷元素是否出現
''' vip=browser.find_element_by_id("vip") # vip客戶專屬 元素定位 if vip.is_displayed(): print("pass") else: print("fail")
2、根據元素的屬性值去判斷
''' 第二種:根據元素屬性值去判斷 get_attribute("style")獲取元素的屬性 ''' vip=browser.find_element_by_id("vip") # vip客戶專屬 元素定位 style = vip.get_attribute("style") # 獲取vip 元素的style屬性值 ("color: rgb(204, 0, 0); visibility: visible;") if "visible" in style: print("pass") else: print("fail")
3、根據元素在頁面出現的次數判斷
''' 第三種:根據元素在頁面出現的次數去判斷結果 find_elements_by_xpath ''' vip_ele_count=len(browser.find_elements_by_xpath('//*[contains(@style,"visible")]')) print(vip_ele_count) if vip_ele_count==1: print("pass") else: print("fail")
4、通過JavaScript語句使 vip客戶專屬 元素顯示
visible = browser.find_element_by_xpath('//*[contains(@value,"visilbe")]') # 點擊 visible text 按鈕 visible.click() js = 'return document.getElementById("vip").style.visibility' # 獲取vip客戶專屬 元素的style屬性的visibility屬性值 style = browser.execute_script(js) # 執行js語句 print(style)
JavaScript對自動化的一些操作
'''js:javascript:可以獲取瀏覽器提供的很多對象,並進行操作
window:瀏覽器窗口
location:當前頁面的URL對象
document:整個DOM樹形結構
打開瀏覽器-開發者工具-console控制台
'''
"設置3000毫秒后打開debugger調試台"----->頁面暫停(用來捕獲即將消失的彈窗。。。定位轉瞬即失的元素)
setTimeout(function(){debugger}, 3000)
'''window:瀏覽器窗口'''
window.open("https://www.baidu.com") 新打開一個窗口
window.innerHeight
window.innerWidth
window.outerWidth
window.scrollTo(0,10000000000) #滾動條
window.scrollTo(0,window.innerHeight)
'''location:當前頁面的URL對象'''
location.reload() 刷新頁面
location.href() 獲取當前網址
location.assign("https://wwww.baidu.com") #更改當前url
'''document:整個DOM樹形結構'''
#獲取主題:
document.title
點擊元素:
document.getElementById("testid").click()
輸入值:
document.getElementsByName("username")[0].value='12345678'
獲取文本值:
document.getElementsByClassName("testclassname")[0].textContent
更改屬性:
document.getElementById("vip").style.visibility="visible"
獲取返回值:
return +js (在robot framework框架中使用js語句的時候,同樣的語法格式)
'''窗口滾動條:'''
window.scrollTo(0,100000000)
window.scrollTo(0,document.body.scrollHeight)
window.scrollTo(document.body.scrollHeight,0)
非窗口類型滾動條:先找到這個元素,再用scrollTop去滑動
document.getElementById("styleShow").scrollTop='10000'
滾動條滑動到指定的元素:先找到這個元素,scrollIntoView
document.getElementsByClassName("feednews-header")[0].scrollIntoView(true)
'''js,高亮某個元素,'''
hidden=browser.find_element_by_xpath("/html/body/input[1]")
visible=browser.find_element_by_xpath("/html/body/input[2]")
browser.execute_script('arguments[0].style.border="3px solid red"',hidden) #高亮某個元素
browser.execute_script('arguments[0].style.border="3px solid red";arguments[1].style.border="3px solid yellow"',hidden,visible) #高亮多個元素