- 我們在做UI自動化測試的過程中,某些情況會遇到驰唬,需要操作WebElement屬性的情況。
假設(shè)現(xiàn)在我們需要獲取一個元素的title屬性罐脊,我們可以先找到這個元素定嗓,然后利用get_attribute方法獲取屬性的值。
舉個栗子:
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
search_button = driver.find_element_by_id("su") # 百度搜索按鈕
# 現(xiàn)在我們獲取百度一下的值
value = search_button.get_attribute("value") # 獲取input標簽的value萍桌,也就是百度一下那4個字
print(value) # 打印 百度一下
但是現(xiàn)在我們有了新的需求宵溅,我們需要改變百度一下這個按鈕里邊顯示的值。
先說一下原理上炎,原理是利用js的dom(document object model)恃逻,也就是文檔對象模型雏搂,獲取到input標簽, 然后通過js來改變這個input標簽的value屬性寇损。
js如下:
var button = document.getElementById("su");
button.setAttribute("su", "你猜一下");
//或者直接給value屬性賦值
document.getElementById("su").value = "你猜一下";
我們在Chrome DevelopmentTools里邊可以看到凸郑,“百度一下”變成了“你猜一下”~
image.png
image.png
那么為什么我們不直接用driver.execute_script()這個方法來執(zhí)行上述js語句呢,但是要知道矛市,因為dom里獲取元素的方式有限芙沥,并不如selenium那么方便,什么link_text這類的api都是無法使用的浊吏。
昨天偶然發(fā)現(xiàn)2個問題而昨,第一是execute_script函數(shù)是可以傳腳本參數(shù)進去的,第二個是selenium抓取到的元素可以作為js的dom元素處理找田。有了這2點之后呢歌憨,就可以干活了!
現(xiàn)在用WebElement的方法做到同樣的事情
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
search_button = driver.find_element_by_id("su") # 百度搜索按鈕
# arguments[0]對應(yīng)的是第一個參數(shù)墩衙,可以理解為python里的%s傳參务嫡,與之類似
driver.execute_script("arguments[0].value = '你猜一下';", search_button)
補充一點, 如果需要獲取js語句執(zhí)行后的返回值漆改,在js語句前加"return" 就行了心铃,例如:
button_value = driver.execute_script("return arguments[0].value;", search_button)