- 我們在做UI自動化測試的過程中,某些情況會遇到,需要操作WebElement屬性的情況。
假設現在我們需要獲取一個元素的title屬性,我們可以先找到這個元素,然后利用get_attribute方法獲取屬性的值。
舉個栗子:
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
search_button = driver.find_element_by_id("su") # 百度搜索按鈕
# 現在我們獲取百度一下的值
value = search_button.get_attribute("value") # 獲取input標簽的value,也就是百度一下那4個字
print(value) # 打印 百度一下
但是現在我們有了新的需求,我們需要改變百度一下這個按鈕里邊顯示的值。
先說一下原理,原理是利用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里邊可以看到,“百度一下”變成了“你猜一下”~
那么為什么我們不直接用driver.execute_script()這個方法來執行上述js語句呢,但是要知道,因為dom里獲取元素的方式有限,並不如selenium那么方便,什么link_text這類的api都是無法使用的。
昨天偶然發現2個問題,第一是execute_script函數是可以傳腳本參數進去的,第二個是selenium抓取到的元素可以作為js的dom元素處理。有了這2點之后呢,就可以干活了!
現在用WebElement的方法做到同樣的事情
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
search_button = driver.find_element_by_id("su") # 百度搜索按鈕
# arguments[0]對應的是第一個參數,可以理解為python里的%s傳參,與之類似
driver.execute_script("arguments[0].value = '你猜一下';", search_button)
補充一點, 如果需要獲取js語句執行后的返回值,在js語句前加"return" 就行了,例如:
button_value = driver.execute_script("return arguments[0].value;", search_button)