1. 程式人生 > >關於面試總結10-selenium中隱藏元素如何定位?(hidden、display: none)

關於面試總結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呢?