關於面試總結10-selenium中隱藏元素如何定位?(hidden、display: none)
前言
面試題:selenium中隱藏元素如何定位?這個是很多面試官喜歡問的一個題,如果單純的定位的話,隱藏元素和普通不隱藏元素定位沒啥區別,用正常定位方法就行了
但是吧~~~很多面試官自己都搞不清楚啥叫定位,啥叫操作元素(如click,clear,send_keys)
隱藏元素
如下圖有個輸入框和一個登入的按鈕,本來是顯示的
元素的屬性隱藏和顯示,主要是 type="hidden"
和style="display: none;"
屬性來控制的,接下來在元素屬性裡面讓它隱藏
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <p>這裡有個按鈕,是隱藏的 <!-- type="hidden" --> <br> 輸入賬號<input id="yoyo" name="hello" type="hidden"> <!-- type="display: none;" --> <br> <button id="yy" name="heo" style="display: none;">登入</button> <br> <a hidden id="baidu" href="https://www.baidu.com">訪問百度</a> </p> </body> </html>
這樣元素就不會顯示了,也就是面試官所說的隱藏屬性了
定位隱藏元素
前面說了,定位隱藏元素和普通的元素沒啥區別,接下來就來驗證下,是不是能定位到呢?
from selenium import webdriver driver = webdriver.Firefox() driver.get("http://localhost:63342/test1122/a/b.html") # 定位type="hidden"隱藏元素 ele1 = driver.find_element_by_id("yoyo") print("列印元素資訊:%s" % ele1) # 獲取元素屬性 print(ele1.get_attribute("name")) # 判斷元素是否隱藏 print(ele1.is_displayed())
執行結果:
列印元素資訊:<selenium.webdriver.remote.webelement.WebElement (session="1debdd46-21b1-451e-b8a7-5aeff1d74f9d", element="{28628a87-7f22-4574-9e14-931f9c6f20e1}")>
hello
False
執行結果可以看出,隱藏元素用普通定位方法,事實上是定位到了呢!
操作隱藏元素
隱藏元素可以正常定位到,只是不能操作(定位元素和操作元素是兩碼事,很多初學者傻傻分不清楚),操作元素是click,clear,send_keys這些方法
# 隱藏輸入框元素輸入文字
ele1 = driver.find_element_by_id("yoyo")
ele1.send_keys("yoyo")
隱藏元素用send_keys()方法會拋異常'ElementNotVisibleException': Message: Element is not currently visible and so may not be interacted with
這個報錯是說元素不可見,不可以被操作,同樣的對“登入”按鈕點選操作也是會報'ElementNotVisibleException'
# 點選隱藏登入框
ele2 = driver.find_element_by_id("yy")
ele2.click()
JS操作隱藏元素
如果面試官想問的是定位後操作隱藏元素的話,本質上說這個問題就是毫無意義的,web自動化的目的是模擬人的正常行為去操作。
如果一個元素頁面上都看不到了,你人工也是無法操作的是不是?人工都不能操作,那你自動化的意義又在哪呢?所以這個只是為了單純的考察面試者處理問題的能力,沒啥實用性!(面試造飛機,進去擰螺絲)
既然面試官這麼問了,那就想辦法回答上給個好印象吧!
首先selenium是無法操作隱藏元素的(但是能正常定位到),本身這個框架就是設計如此,如果非要去操作隱藏元素,那就用js的方法去操作,selenium提供了一個入口可以執行js指令碼。
js和selenium不同,只有頁面上有的元素(在dom裡面的),都能正常的操作,接下來用js試試吧!
<a hidden id="baidu" href="https://www.baidu.com">訪問百度</a>
這個連結是隱藏的,但是能用js點到
from selenium import webdriver
driver = webdriver.Firefox()
driver.get("http://localhost:63342/test1122/a/b.html")
# js點選hidden元素
js = 'document.getElementById("baidu").click()'
driver.execute_script(js)
執行完之後,會發現頁面正常的點選,跳轉到百度頁面了
備註:百度搜到的可能方法是先用js去掉hidden屬性,再用selenium操作,這個有點多此一舉,你既然都已經會用js了,何必不一次性到位直接click呢?