天天看點

selenium之擷取目前焦點元素switch_to.active_element

一、switch_to

selenium做自動化的過程中,經常會遇到alert、frame和新的window,這是經常是switch_to家族大展拳腳的時候,先看看switch_to家族的成員:

alert ——傳回浏覽器的Alert對象,可對浏覽器alert、confirm、prompt框操作

default_content() ——切到主文檔

frame(frame_reference) ——切到某個frame
parent_frame() ——切到父frame,這個方法也不常被人所知,但有多層frame的時候很有用,不過這裡要提一句,一般這種嵌套多層的frame都是有問題的,會影響到性能,可以提給開發,讓其改進
window(window_name) ——切到某個浏覽器視窗
active_element ——傳回目前焦點的WebElement對象      

其中:

alert和window的操作在之前的部落格selenium之 辨識alert、window以及操作

關于frame的三個方法也在之前的部落格selenium之定位以及切換frame(iframe)

唯一沒有說到的就是switch_to家族中的active_element成員,因為不常被用到,是以也容易被人遺忘,網上關于它的介紹也很少。

二、switch_to.active_element

1、概念

switch_to.active_element傳回的是目前焦點的對象,即傳回WebElement對象。

那麼焦點是什麼?大概可以這樣了解:即網頁上目前操作的對象(也就是你網頁上光标的位置),比如,你滑鼠點選到了一個input框,你可以在這個input框裡輸入資訊,這時這個input框即焦點。

2、使用場景

例如:一個網頁上的建立檔案夾的功能,右鍵-建立後,在頁面上又個輸入檔案夾名的input框,但這個框一旦失去焦點而且無内容的話,就會消失、取消掉建立檔案夾的操作,如圖:

selenium之擷取目前焦點元素switch_to.active_element
selenium之擷取目前焦點元素switch_to.active_element

最初代碼:

l = driver.find_element_by_id('pm_treeRoom_1_span')

ActionChains(driver).context_click(l).perform()

driver.find_element_by_class_name('fnew').click()

time.sleep(2)

driver.find_element_by_xpath('//*[@id="pm_treeRoom_1_ul"]/li[...]').send_keys('filename')

time.sleep(2)      

結果這種操作總會導緻輸入框失去焦點,直接消失,更不能send_keys進去了,直接報錯。

我提醒用ActionChains的send_keys發送,不去重新定位元素,就用預設的焦點元素。修改後的代碼如下(部分):

driver.find_element_by_class_name('fnew').click()

time.sleep(2)

driver.switch_to.active_element.send_keys('filename')

time.sleep(2)      

繼續閱讀