天天看點

Selenium裡可以自行封裝與get_attribute對應的set_attribute方法

  • 我們在做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裡邊可以看到,“百度一下”變成了“你猜一下”~

Selenium裡可以自行封裝與get_attribute對應的set_attribute方法

那麼為什麼我們不直接用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)           
上一篇: 啟動篇